Я ищу правильный способ вернуть JSON с кодом состояния HTTP в моем контроллере .NET Core Web API. Я использую, чтобы использовать это так:
public IHttpActionResult GetResourceData()
{
return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}
Это было в приложении 4.6 MVC, но теперь с .NET Core у меня, кажется, этого IHttpActionResult
нет, ActionResult
и я использую вот так:
public ActionResult IsAuthenticated()
{
return Ok(Json("123"));
}
Но ответ от сервера странный, как на изображении ниже:
Я просто хочу, чтобы контроллер Web API возвращал JSON с кодом состояния HTTP, как я это делал в Web API 2.
CreatedAtRoute
метод и т. Д.Ответы:
Наиболее базовая версия, отвечающая
JsonResult
:Однако это не поможет решить вашу проблему, потому что вы не можете явно иметь дело с собственным кодом ответа.
например:
Обратите внимание, что оба приведенных выше примера взяты из отличного руководства, доступного в документации Microsoft: Форматирование данных ответов.
Extra Stuff
Проблема, с которой я сталкиваюсь довольно часто, заключается в том, что я хотел более детальный контроль над моим WebAPI, а не просто использовать конфигурацию по умолчанию из шаблона «Новый проект» в VS.
Давайте удостоверимся, что у вас есть некоторые основы ...
Шаг 1. Настройте свой сервис
Чтобы заставить ваш ASP.NET Core WebAPI отвечать сериализованным объектом JSON при полном контроле кода состояния, вам следует начать с проверки того, что вы включили
AddMvc()
службу в свойConfigureServices
метод, который обычно находится вStartup.cs
.Если ваш проект требует полного контроля и вы хотите строго определить свои службы, например, как ваш WebAPI будет вести себя с различными типами запросов, включая
application/json
и не отвечать на другие типы запросов (например, стандартный запрос браузера), вы можете определить его вручную с помощью следующий код:Вы заметите, что я также включил способ добавления собственных форматировщиков ввода / вывода на случай, если вы захотите ответить на другой формат сериализации (protobuf, thrift и т. Д.).
Кусок кода выше является в основном дубликатом
AddMvc()
метода. Тем не менее, мы внедряем каждый сервис «по умолчанию» самостоятельно, определяя каждый сервис вместо того, чтобы идти с предварительно поставленным сервисом с шаблоном. Я добавил ссылку на репозиторий в блок кода, или вы можете проверить этоAddMvc()
в репозитории GitHub. ,Обратите внимание, что есть некоторые руководства, которые попытаются решить эту проблему путем «отмены» настроек по умолчанию, а не просто не реализовывать их в первую очередь ... Если учесть, что мы сейчас работаем с открытым исходным кодом, это избыточная работа , плохой код и откровенно старая привычка, которая скоро исчезнет.
Шаг 2: Создайте контроллер
Я собираюсь показать вам по-настоящему простой, чтобы разобраться в вашем вопросе.
Шаг 3: Проверьте свои
Content-Type
иAccept
Вы должны убедиться, что ваш
Content-Type
иAccept
заголовки в вашем запросе установлены правильно. В вашем случае (JSON) вы захотите настроить его наapplication/json
.Если вы хотите, чтобы ваш WebAPI отвечал как JSON по умолчанию, независимо от того, что указывает заголовок запроса, вы можете сделать это несколькими способами .
Способ 1 Как показано в статье, которую я рекомендовал ранее ( форматирование данных ответа ), вы можете принудительно установить определенный формат на уровне контроллера / действия. Мне лично этот подход не нравится ... но вот для полноты картины:
Способ 2 Мой предпочтительный метод заключается в том, чтобы WebAPI отвечал на все запросы в запрошенном формате. Тем не менее, в случае, если он не принимает запрошенный формат, откат к стандартному (т.е. JSON)
Во-первых, вам нужно зарегистрировать это в ваших настройках (нам нужно переработать поведение по умолчанию, как отмечалось ранее)
Наконец, просто переупорядочив список форматеров, которые были определены в компоновщике сервисов, веб-хост по умолчанию будет использовать тот форматтер, который вы размещаете в верхней части списка (то есть позицию 0).
Дополнительную информацию можно найти в этой записи блога .NET Web Development and Tools.
источник
IActionResult
сreturn Ok(new {response = "123"});
Приветствиями!RespectBrowserAcceptHeader
это критично при реализации использования альтернативного сериализатора или чаще, когда вы хотите убедиться, что ваши клиенты не отправляют искаженные запросы. Поэтому я подчеркнул «Если ваш проект требует полного контроля, и вы хотите строго определить свой сервис», и обратите внимание на выделенную цитату блока выше этого утверждения.У вас есть предопределенные методы для наиболее распространенных кодов состояния.
Ok(result)
возвращается200
с ответомCreatedAtRoute
возвращается201
+ новый ресурс URLNotFound
возвращается404
BadRequest
возвращается400
и т. д.Смотрите
BaseController.cs
иController.cs
список всех методов.Но если вы действительно настаиваете на том, что вы можете использовать
StatusCode
для установки пользовательского кода, но вам это не следует делать, поскольку это делает код менее читабельным, и вам придется повторять код для установки заголовков (например, дляCreatedAtRoute
).источник
JSON
ActionResult
Json()
Json(...)
и передай строкуStatusCode
В ASP.NET Core 2.0 идеальный способ вернуть объект
Web API
(который унифицирован с MVC и использует тот же базовый классController
)Заметь
200 OK
кодом состояния (этоOk
типObjectResult
)Accept
заголовка в запросе. ЕслиAccept: application/xml
отправлено в запросе, он вернется какXML
. Если ничего не отправлено,JSON
по умолчанию.Если необходимо отправить с определенным кодом состояния , используйте
ObjectResult
илиStatusCode
вместо. И делает то же самое, и поддерживает согласование контента.или даже более детально с ObjectResult:
Если вы хотите вернуть JSON , есть несколько способов
Заметь
JSON
в исполнение двумя различными способами.Json(object)
.Produces()
атрибут (который являетсяResultFilter
) сcontentType = application/json
Подробнее о них читайте в официальных документах . Узнайте о фильтрах здесь .
Простой класс модели, который используется в примерах
источник
Самый простой способ, который я придумал, это:
источник
Это мое самое простое решение:
или
источник
Вместо использования кодов состояния 404/201 с помощью enum
источник
Потрясающие ответы, которые я нашел здесь, и я также попробовал это заявление о возвращении,
StatusCode(whatever code you wish)
и это сработало !!!источник
Пожалуйста, обратитесь ниже код, вы можете управлять несколькими кодами состояния с другим типом JSON
источник
Что я делаю в своих приложениях Asp Net Core Api, так это создаю класс, который расширяется от ObjectResult и предоставляет множество конструкторов для настройки содержимого и кода состояния. Тогда все мои действия контроллера используют один из конструкторов в качестве подходящего. Вы можете взглянуть на мою реализацию по адресу: https://github.com/melardev/AspNetCoreApiPaginatedCrud
и
https://github.com/melardev/ApiAspCoreEcommerce
Вот как выглядит класс (полный код представлен в моем репозитории):
Обратите внимание на базу (dto), которую вы заменяете dto своим объектом, и вы должны быть в порядке.
источник
Я получил это на работу. Моя большая проблема заключалась в том, что мой json был строкой (в моей базе данных ... а не конкретным / известным типом).
Хорошо, я наконец получил это на работу.
Я нахожусь на ядре asp.net 3.1
Я получил подсказку отсюда :: https://www.jianshu.com/p/7b3e92c42b61
источник