Дополнительно
ASP.NET Core возвращает JSON с кодом состояния
Я ищу правильный способ вернуть 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"));
}
Но ответ с сервера странный, как на рисунке ниже:
Я просто хочу, чтобы контроллер веб-API возвращал JSON с кодом состояния HTTP, как я делал в Web API 2.
119
9
Самая базовая версия, отвечающая
JsonResult
, - это:Однако это не поможет с вашей проблемой, потому что вы не можете явно иметь дело со своим собственным кодом ответа.
например:
Обратите внимание, что оба из этих приведенных выше примеров взяты из отличного руководства, доступного в документации Microsoft: Формирование данных ответов
Дополнительный материал
Проблема, с которой я сталкиваюсь довольно часто, заключается в том, что я хотел получить более детальный контроль над своим WebAPI, а не просто использовать конфигурацию по умолчанию из шаблона «Новый проект» в VS
Давайте удостоверимся, что у вас есть некоторые основы...
Шаг 1: Настройте свой Сервис
Чтобы ваш ASP.NET Core WebAPI отвечал сериализованным объектом JSON вместе с полным контролем кода состояния, вам следует начать с того, чтобы убедиться, что вы включили службу
AddMvc ()
в свой методConfigureServices
обычно находится вStartup.cs
.Если ваш проект требует полного контроля и вы хотите строго определить свои услуги, например, как ваш WebAPI будет вести себя с различными типами запросов, включая
application / json
, и не отвечать на другие типы запросов (например, стандартный запрос браузера) ), вы можете определить его вручную со следующим кодом:Вы заметите, что я также включил способ добавления ваших собственных форматировщиков ввода / вывода, если вы захотите ответить на другой формат сериализации (protobuf, бережливость и т. Д.).
Часть кода выше в основном является дубликатом метода
AddMvc ()
. Тем не менее, мы реализуем каждую услугу «по умолчанию» самостоятельно, определяя каждую услугу вместо того, чтобы идти с предварительно поставленной с шаблоном. Я добавил ссылку на репозиторий в блок кода, или вы можете проверитьAddMvc ()
из репозитория GitHub..Шаг 2: Создайте контроллер
Я собираюсь показать вам действительно простой, чтобы разобраться в вашем вопросе.
Шаг 3: Проверьте свой
Content-Type
иAccept
Вам необходимо убедиться, что ваши заголовки
Content-Type
иAccept
в вашем request установлены правильно. В вашем случае (JSON) вы захотите настроить его какapplication / json
.Если вы хотите, чтобы ваш WebAPI отвечал как JSON по умолчанию, независимо от того, что указывает заголовок запроса, вы можете сделать это парами .
Путь 1 Как показано в статье, которую я рекомендовал ранее (Формирование данных ответа), вы можете форсировать определенный формат на уровне контроллера / действия. Мне лично не нравится такой подход... но здесь это для полноты:
Путь 2 Мой предпочтительный метод заключается в том, чтобы WebAPI отвечал на все запросы с запрошенным форматом. Однако в случае, если он не принимает запрошенный формат, отступает к умолчанию (т.е. JSON)
Во-первых, вам нужно будет зарегистрировать это в ваших опциях (нам нужно переработать поведение по умолчанию, как отмечалось ранее)
Наконец, просто переупорядочив список форматировщиков, которые были определены в построителе услуг, веб-хост по умолчанию будет соответствовать форматеру, который вы позиционируете в верхней части списка (т.е. позиция 0).
Более подробную информацию можно найти в этой записи .NET Web Development and Tools Blog
У вас есть предопределенные методы для большинства распространенных кодов состояния.
Ok (результат)
возвращает200
с ответомCreatedAtRoute
возвращает201
+ новый URL ресурсаNotFound
возвращает404
BadRequest
возвращает400
и т. Д.См.
BaseController.cs
иController.cs
для списка всех методов.Но если вы действительно настаиваете, что можете использовать
StatusCode
для установки пользовательского кода, но вы действительно не должны этого делать, поскольку это делает код менее читабельным, и вам придется повторять код для установки заголовков (как дляCreatedAtRoute
).С ASP.NET Core 2.0 идеальный способ возврата объекта из
Web API
(который унифицирован с MVC и использует тот же базовый классController
)Обратите внимание, что
200 OK
(это типOk
ObjectResult
)Accept
в запросе. Если в запросе отправляетсяAccept: application / xml
, оно возвращается какXML
. Если ничего не отправлено,JSON
по умолчанию.Если ему необходимо отправить с определенным кодом состояния , используйте вместо этого
ObjectResult
илиStatusCode
. Оба делают одно и то же и поддерживают согласование контента.Если вы хотите вернуться как JSON , есть несколько способов
Обратите внимание, что
Json (объект)
.Produces ()
(который являетсяResultFilter
) сcontentType = application / json
Узнайте больше о них в официальных документах. Узнайте о фильтры здесь.
Простой модельный класс, который используется в образцах
Самый простой способ, которым я придумал, это:
Это мое самое простое решение:
или
Вместо использования кодов состояния 404/201 с использованием enum
Потрясающие ответы, которые я нашел здесь, и я также попробовал это ответное утверждение, см. «StatusCode (какой бы код вы ни пожелали)», и оно сработало!!!
Что я делаю в своих приложениях Asp Net Core Api, так это создаю класс, который простирается от ObjectResult и предоставляет множество конструкторов для настройки содержимого и кода состояния. Тогда все мои действия Контролера используют один из кострукторов в качестве приближения. Вы можете взглянуть на мою реализацию на: https://github.com/melardev/AspNetCoreApiPaginatedCrud
а также
https://github.com/melardev/ApiAspCoreEcommerce
вот как выглядит класс (перейдите в мое репо для полного кода):
Обратите внимание на базу (dto), которую вы заменяете dto своим объектом, и вы должны быть готовы к работе.
Пожалуйста, обратитесь к коду ниже, Вы можете управлять несколькими кодами состояния с другим типом JSON