Поделиться через


Результаты действий в веб-API 2

Рассмотрите возможность использования веб-API ASP.NET Core. Он имеет следующие преимущества по сравнению с ASP.NET веб-API версии 4.x:

  • ASP.NET Core — это кроссплатформенная платформа с открытым кодом для создания современных облачных веб-приложений в Windows, macOS и Linux.
  • Контроллеры ASP.NET Core MVC и контроллеры веб-API унифицированы.
  • Разработано для тестируемости.
  • Возможность разработки и запуска в ОС Windows, macOS и Linux.
  • Открытый исходный код и ориентация на сообщество.
  • Интеграция современных клиентских платформ и рабочих процессов разработки.
  • Облачная система конфигурации на основе среды.
  • Встроенное введение зависимостей.
  • Упрощенный высокопроизводительный модульный конвейер HTTP-запросов.
  • Возможность размещения в Kestrel, IIS, HTTP.sys, Nginx, Apache и Docker.
  • Управление параллельными версиями.
  • Инструментарий, упрощающий процесс современной веб-разработки.

В этом разделе описывается, как веб-API ASP.NET преобразует возвращаемое значение из действия контроллера в сообщение HTTP-ответа.

Действие контроллера веб-API может возвращать любое из следующих действий:

  1. void
  2. HttpResponseMessage
  3. IHttpActionResult
  4. Другой тип

В зависимости от того, какие из них возвращаются, веб-API использует другой механизм для создания HTTP-ответа.

Возвращаемый тип Как веб-API создает ответ
void Возврат пустого 204 (нет содержимого)
HttpResponseMessage Преобразуйте непосредственно в сообщение HTTP-ответа.
IHttpActionResult Вызовите ExecuteAsync , чтобы создать httpResponseMessage, а затем преобразовать в сообщение HTTP-ответа.
Другой тип Напишите сериализованное возвращаемое значение в текст ответа; возвращается 200 (ОК).

Остальная часть этого раздела подробно описывает каждый вариант.

void

Если возвращается тип возвращаемого значения void, веб-API просто возвращает пустой HTTP-ответ с кодом состояния 204 (нет содержимого).

Пример контроллера:

public class ValuesController : ApiController
{
    public void Post()
    {
    }
}

Отклик HTTP:

HTTP/1.1 204 No Content
Server: Microsoft-IIS/8.0
Date: Mon, 27 Jan 2014 02:13:26 GMT

HttpResponseMessage

Если действие возвращает httpResponseMessage, веб-API преобразует возвращаемое значение непосредственно в сообщение HTTP-ответа, используя свойства объекта HttpResponseMessage для заполнения ответа.

Этот параметр позволяет контролировать ответное сообщение. Например, следующее действие контроллера задает заголовок Cache-Control.

public class ValuesController : ApiController
{
    public HttpResponseMessage Get()
    {
        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
        response.Content = new StringContent("hello", Encoding.Unicode);
        response.Headers.CacheControl = new CacheControlHeaderValue()
        {
            MaxAge = TimeSpan.FromMinutes(20)
        };
        return response;
    } 
}

Ответ:

HTTP/1.1 200 OK
Cache-Control: max-age=1200
Content-Length: 10
Content-Type: text/plain; charset=utf-16
Server: Microsoft-IIS/8.0
Date: Mon, 27 Jan 2014 08:53:35 GMT

hello

При передаче модели домена в метод CreateResponse веб-API использует метод форматирования мультимедиа для записи сериализованной модели в текст отклика.

public HttpResponseMessage Get()
{
    // Get a list of products from a database.
    IEnumerable<Product> products = GetProductsFromDB();

    // Write the list to the response body.
    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, products);
    return response;
}

Веб-API использует заголовок Accept в запросе для выбора метода форматирования. Дополнительные сведения см. в разделе "Согласование содержимого".

IHttpActionResult

Интерфейс IHttpActionResult появился в веб-API 2. По сути, он определяет фабрику HttpResponseMessage . Ниже приведены некоторые преимущества использования интерфейса IHttpActionResult :

  • Упрощает модульное тестирование контроллеров.
  • Перемещает общую логику для создания HTTP-ответов в отдельные классы.
  • Делает намерение действия контроллера более понятным, скрывая низкоуровневые сведения о создании ответа.

IHttpActionResult содержит один метод ExecuteAsync, который асинхронно создает экземпляр HttpResponseMessage .

public interface IHttpActionResult
{
    Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}

Если действие контроллера возвращает IHttpActionResult, веб-API вызывает метод ExecuteAsync для создания httpResponseMessage. Затем он преобразует HttpResponseMessage в http-ответное сообщение.

Ниже приведена простая реализация IHttpActionResult , которая создает обычный текстовый ответ:

public class TextResult : IHttpActionResult
{
    string _value;
    HttpRequestMessage _request;

    public TextResult(string value, HttpRequestMessage request)
    {
        _value = value;
        _request = request;
    }
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage()
        {
            Content = new StringContent(_value),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}

Пример действия контроллера:

public class ValuesController : ApiController
{
    public IHttpActionResult Get()
    {
        return new TextResult("hello", Request);
    }
}

Ответ:

HTTP/1.1 200 OK
Content-Length: 5
Content-Type: text/plain; charset=utf-8
Server: Microsoft-IIS/8.0
Date: Mon, 27 Jan 2014 08:53:35 GMT

hello

Чаще используются реализации IHttpActionResult, определенные в пространстве имен System.Web.Http.Results. Класс ApiController определяет вспомогательные методы, возвращающие эти встроенные результаты действий.

В следующем примере, если запрос не соответствует существующему идентификатору продукта, контроллер вызывает ApiController.NotFound для создания ответа 404 (не найден). В противном случае контроллер вызывает ApiController.OK, который создает ответ 200 (ОК), содержащий продукт.

public IHttpActionResult Get (int id)
{
    Product product = _repository.Get (id);
    if (product == null)
    {
        return NotFound(); // Returns a NotFoundResult
    }
    return Ok(product);  // Returns an OkNegotiatedContentResult
}

Другие типы возвращаемых данных

Для всех других типов возвращаемых данных веб-API использует модуль форматирования мультимедиа для сериализации возвращаемого значения. Веб-API записывает сериализованное значение в текст ответа. Код состояния ответа — 200 (ОК).

public class ProductsController : ApiController
{
    public IEnumerable<Product> Get()
    {
        return GetAllProductsFromDB();
    }
}

Недостатком этого подхода является то, что вы не можете напрямую вернуть код ошибки, например 404. Однако вы можете вызвать httpResponseException для кодов ошибок. Дополнительные сведения см. в разделе "Обработка исключений" в веб-API ASP.NET.

Веб-API использует заголовок Accept в запросе для выбора метода форматирования. Дополнительные сведения см. в разделе "Согласование содержимого".

Пример запроса

GET http://localhost/api/products HTTP/1.1
User-Agent: Fiddler
Host: localhost:24127
Accept: application/json

Пример отклика

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
Date: Mon, 27 Jan 2014 08:53:35 GMT
Content-Length: 56

[{"Id":1,"Name":"Yo-yo","Category":"Toys","Price":6.95}]