Найбільш основна версія, що відповідає "a", JsonResult
це:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
Однак це не допоможе у вирішенні проблеми, оскільки ви не можете чітко розібратися з власним кодом відповіді.
Як отримати контроль над результатами стану, вам потрібно повернути номер ActionResult
, де ви зможете скористатися StatusCodeResult
типом.
наприклад:
// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authorRepository.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
Зверніть увагу, що обидва вищенаведені приклади походять з чудового посібника, доступного в Microsoft Documentation: Форматування даних відповідей
Додаткові речі
Проблема, з якою я стикаюся досить часто, полягає в тому, що мені хотілося більш детального контролю над моїм WebAPI, а не просто з конфігурацією за замовчуванням з шаблону «Новий проект» у VS.
Давайте переконаємося, що у вас є деякі основи ...
Крок 1. Налаштуйте службу
Щоб ваш ASP.NET Core WebAPI відповідав серіалізованим об’єктом JSON під повним контролем коду статусу, слід почати, переконавшись, що ви включили AddMvc()
послугу у свій ConfigureServices
метод, який зазвичай знаходиться у Startup.cs
.
Важливо зазначити, що AddMvc()
автоматично буде включений Формат вводу / виводу для JSON разом з відповіддю на інші типи запитів.
Якщо ваш проект вимагає повного контролю і ви хочете чітко визначити свої послуги, наприклад, як ваш WebAPI буде поводитися з різними типами запитів, включаючи application/json
та не відповідати на інші типи запитів (наприклад, стандартний запит браузера), ви можете визначити його вручну за допомогою наступний код:
public void ConfigureServices(IServiceCollection services)
{
// Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
// https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs
services
.AddMvcCore(options =>
{
options.RequireHttpsPermanent = true; // does not affect api requests
options.RespectBrowserAcceptHeader = true; // false by default
//options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
//remove these two below, but added so you know where to place them...
options.OutputFormatters.Add(new YourCustomOutputFormatter());
options.InputFormatters.Add(new YourCustomInputFormatter());
})
//.AddApiExplorer()
//.AddAuthorization()
.AddFormatterMappings()
//.AddCacheTagHelper()
//.AddDataAnnotations()
//.AddCors()
.AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}
Ви помітите, що я також включив спосіб додавання власних власних форматів вводу / виводу, якщо ви, можливо, захочете відповісти на інший формат серіалізації (протобуф, ощадливість тощо).
Частка коду вище, здебільшого, є дублікатом AddMvc()
методу. Однак ми реалізовуємо кожну службу "за замовчуванням" самостійно, визначаючи кожну службу, замість того, щоб відправлятись із попередньо відправленою з шаблоном. Я додав посилання на сховище до блоку коду, або ви можете перевірити його AddMvc()
з репозиторію GitHub. .
Зауважте, що є кілька посібників, які намагатимуться вирішити це шляхом "скасування" за замовчуванням, а не просто в першу чергу не реалізуючи це ... Якщо ви враховуєте, що ми зараз працюємо з Open Source, це зайва робота , поганий код і відверто давня звичка, яка незабаром зникне.
Крок 2: Створіть контролер
Я збираюся показати вам справді прямо, щоб розібратися з вашим запитанням.
public class FooController
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] Object item)
{
if (item == null) return BadRequest();
var newItem = new Object(); // create the object to return
if (newItem != null) return Ok(newItem);
else return NotFound();
}
}
Крок 3: Перевірте свої Content-Type
таAccept
Вам потрібно переконатися, що ваш запитContent-Type
та Accept
заголовки у вашому запиті встановлені належним чином. У вашому випадку (JSON), ви хочете, щоб це було налаштовано application/json
.
Якщо ви хочете, щоб ваш WebAPI відповідав як JSON за замовчуванням, незалежно від того, що вказано в заголовку запиту, ви можете зробити це двома способами .
Спосіб 1
Як показано у статті, яку я рекомендував раніше ( Форматування даних відповідей ), ви можете застосувати певний формат на рівні Контролер / Дія. Мені особисто не подобається такий підхід ... але ось він для повноти:
Форсування конкретного формату Якщо ви хочете обмежити формати відповідей для певної дії, яку ви можете, ви можете застосувати фільтр [Produces]. Фільтр [Produces] задає формати відповідей для конкретної дії (або контролера). Як і більшість фільтрів, це може бути застосовано до дії, контролера чи глобальної області.
[Produces("application/json")]
public class AuthorsController
[Produces]
Фільтр змусить всі дії в межах
AuthorsController
повернути JSON-відформатовані відповіді, навіть якщо інші форматтер були сконфігуровані для додатка , і клієнт надав Accept
заголовок запитувач інший, доступний формат.
Шлях 2
Мій кращий метод полягає в тому, щоб WebAPI відповідав на всі запити у запитаному форматі. Однак у випадку, якщо він не приймає запитуваний формат, тоді повертаємось до типового (наприклад, JSON)
По-перше, вам потрібно буде зареєструвати це у своїх параметрах (нам потрібно переробити поведінку за замовчуванням, як зазначалося раніше)
options.RespectBrowserAcceptHeader = true; // false by default
Нарешті, шляхом простого переупорядкування списку форматорів, визначених у конструкторі послуг, веб-хост за замовчуванням встановить формат, який ви розміщуєте вгорі списку (тобто позицію 0).
Додаткову інформацію можна знайти в цій статті .NET Blog Blog and Tools
CreatedAtRoute
метод тощо