Udostępnij za pośrednictwem


Wyniki akcji we wzorcu Web API 2

Rozważ użycie internetowego interfejsu API platformy ASP.NET Core. Ma następujące zalety w porównaniu z interfejsem API sieci Web ASP.NET 4.x:

  • ASP.NET Core to międzyplatformowa platforma typu open source do tworzenia nowoczesnych, opartych na chmurze aplikacji internetowych w systemach Windows, macOS i Linux.
  • Kontrolery MVC i kontrolery internetowego interfejsu API platformy ASP.NET Core są ujednolicone.
  • Zaprojektowano architekturę pod kątem możliwości testowania.
  • Możliwość tworzenia i uruchamiania w systemach Windows, macOS i Linux.
  • Open source i koncentracja na społeczności.
  • Integracja nowoczesnych struktur po stronie klienta i programistycznych przepływów pracy.
  • Gotowy do pracy w chmurze, oparty na środowisku system konfiguracji.
  • Wbudowane wstrzykiwanie zależności.
  • Uproszczony, modułowy potok żądań HTTP zapewniający wysoką wydajność.
  • Możliwość hostowania na platformie Kestrel, IIS, HTTP.sys, Nginx, Apache i Docker.
  • Przechowywanie wersji równoległych.
  • Narzędzia, które upraszczają tworzenie nowoczesnych aplikacji internetowych.

W tym temacie opisano, jak ASP.NET internetowy interfejs API konwertuje wartość zwracaną z akcji kontrolera na komunikat odpowiedzi HTTP.

Akcja kontrolera internetowego interfejsu API może zwrócić dowolną z następujących czynności:

  1. void
  2. HttpResponseMessage
  3. IHttpActionResult
  4. Inny typ

W zależności od tego, który z tych elementów jest zwracany, internetowy interfejs API używa innego mechanizmu do tworzenia odpowiedzi HTTP.

Typ zwracany Jak internetowy interfejs API tworzy odpowiedź
void Zwracanie pustego 204 (brak zawartości)
HttpResponseMessage Przekonwertuj bezpośrednio na komunikat odpowiedzi HTTP.
IHttpActionResult Wywołaj metodę ExecuteAsync , aby utworzyć komunikat HttpResponseMessage, a następnie przekonwertuj na komunikat odpowiedzi HTTP.
Inny typ Zapisz serializowaną wartość zwracaną w treści odpowiedzi; zwróć 200 (OK).

W pozostałej części tego tematu opisano każdą opcję bardziej szczegółowo.

void

Jeśli zwracany typ to void, internetowy interfejs API po prostu zwraca pustą odpowiedź HTTP z kodem stanu 204 (Brak zawartości).

Przykładowy kontroler:

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

Odpowiedź HTTP:

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

HttpResponseMessage

Jeśli akcja zwraca komunikat HttpResponseMessage, internetowy interfejs API konwertuje wartość zwracaną bezpośrednio na komunikat odpowiedzi HTTP, używając właściwości obiektu HttpResponseMessage w celu wypełnienia odpowiedzi.

Ta opcja zapewnia dużą kontrolę nad komunikatem odpowiedzi. Na przykład poniższa akcja kontrolera ustawia nagłówek 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;
    } 
}

Reakcja:

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

Jeśli przekażesz model domeny do metody CreateResponse , internetowy interfejs API używa formatującego nośnika do zapisania serializowanego modelu w treści odpowiedzi.

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;
}

Internetowy interfejs API używa nagłówka Accept w żądaniu, aby wybrać formater. Aby uzyskać więcej informacji, zobacz Negocjowanie zawartości.

IHttpActionResult

Interfejs IHttpActionResult został wprowadzony w internetowym interfejsie API 2. Zasadniczo definiuje fabrykę HttpResponseMessage . Poniżej przedstawiono niektóre zalety korzystania z interfejsu IHttpActionResult :

  • Upraszcza testowanie jednostkowe kontrolerów.
  • Przenosi wspólną logikę tworzenia odpowiedzi HTTP do oddzielnych klas.
  • Sprawia, że intencja akcji kontrolera jest jaśniejsza, ukrywając szczegóły niskiego poziomu konstruowania odpowiedzi.

IHttpActionResult zawiera jedną metodę ExecuteAsync, która asynchronicznie tworzy wystąpienie httpResponseMessage .

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

Jeśli akcja kontrolera zwraca element IHttpActionResult, internetowy interfejs API wywołuje metodę ExecuteAsync w celu utworzenia komunikatu HttpResponseMessage. Następnie konwertuje komunikat HttpResponseMessage na komunikat odpowiedzi HTTP.

Oto prosta implementacja IHttpActionResult , która tworzy odpowiedź w postaci zwykłego tekstu:

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);
    }
}

Przykładowa akcja kontrolera:

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

Reakcja:

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

Częściej używasz implementacji IHttpActionResult zdefiniowanych w przestrzeni nazw System.Web.Http.Results. Klasa ApiController definiuje metody pomocnicze, które zwracają te wbudowane wyniki akcji.

W poniższym przykładzie, jeśli żądanie nie jest zgodne z istniejącym identyfikatorem produktu, kontroler wywołuje element ApiController.NotFound , aby utworzyć odpowiedź 404 (nie znaleziono). W przeciwnym razie kontroler wywołuje element ApiController.OK, który tworzy odpowiedź 200 (OK), która zawiera produkt.

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

Inne typy zwracane

W przypadku wszystkich innych typów zwracanych interfejs API sieci Web używa formatnika multimediów do serializacji zwracanej wartości. Internetowy interfejs API zapisuje serializowaną wartość w treści odpowiedzi. Kod stanu odpowiedzi to 200 (OK).

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

Wadą tego podejścia jest to, że nie można bezpośrednio zwrócić kodu błędu, takiego jak 404. Można jednak zgłosić wyjątek HttpResponseException dla kodów błędów. Aby uzyskać więcej informacji, zobacz Obsługa wyjątków w interfejsie API sieci Web ASP.NET.

Internetowy interfejs API używa nagłówka Accept w żądaniu, aby wybrać formater. Aby uzyskać więcej informacji, zobacz Negocjowanie zawartości.

Przykładowe żądanie

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

Przykładowa odpowiedź

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}]