Bagikan melalui


Hasil Tindakan di Web API 2

Pertimbangkan untuk menggunakan API web ASP.NET Core. Ini memiliki keuntungan berikut daripada ASP.NET 4.x Web API:

  • ASP.NET Core adalah kerangka kerja lintas platform sumber terbuka untuk membangun aplikasi web modern berbasis cloud di Windows, macOS, dan Linux.
  • Pengontrol MVC Inti ASP.NET dan pengontrol API web disatukan.
  • Dirancang untuk dapat diuji.
  • Kemampuan untuk mengembangkan dan menjalankan di Windows, macOS, dan Linux.
  • Sumber terbuka dan berfokus pada komunitas.
  • Integrasi kerangka kerja sisi klien modern dan alur kerja pengembangan.
  • Sistem konfigurasi berbasis lingkungan yang siap dengan cloud.
  • Injeksi dependensi bawaan.
  • Alur permintaan HTTP yang ringan, berperforma tinggi, dan modular.
  • Kemampuan untuk menjadi tuan rumah di Kestrel, IIS, HTTP.sys, Nginx, Apache, dan Docker.
  • Penerapan versi berdampingan.
  • Alat yang menyederhanakan pengembangan web modern.

Topik ini menjelaskan bagaimana ASP.NET Web API mengonversi nilai pengembalian dari tindakan pengontrol menjadi pesan respons HTTP.

Tindakan pengontrol API Web dapat mengembalikan salah satu hal berikut:

  1. batal
  2. HttpResponseMessage
  3. IHttpActionResult
  4. Beberapa jenis lainnya

Bergantung pada mana yang dikembalikan, Api Web menggunakan mekanisme yang berbeda untuk membuat respons HTTP.

Tipe hasil Cara API Web membuat respons
batal Mengembalikan kosong 204 (Tanpa Isi)
HttpResponseMessage Konversi langsung ke pesan respons HTTP.
IHttpActionResult Panggil ExecuteAsync untuk membuat HttpResponseMessage, lalu konversi ke pesan respons HTTP.
Jenis lainnya Tulis nilai pengembalian berseri ke dalam isi respons; mengembalikan 200 (OK).

Topik lainnya menjelaskan setiap opsi secara lebih rinci.

batal

Jika jenis pengembalian adalah void, API Web hanya mengembalikan respons HTTP kosong dengan kode status 204 (Tanpa Konten).

Contoh pengontrol:

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

Respons HTTP:

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

HttpResponseMessage

Jika tindakan mengembalikan HttpResponseMessage, API Web mengonversi nilai pengembalian langsung ke pesan respons HTTP, menggunakan properti objek HttpResponseMessage untuk mengisi respons.

Opsi ini memberi Anda banyak kontrol atas pesan respons. Misalnya, tindakan pengontrol berikut mengatur header 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;
    } 
}

Respons:

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

Jika Anda meneruskan model domain ke metode CreateResponse , Api Web menggunakan formatter media untuk menulis model berseri ke dalam isi respons.

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 Web menggunakan header Terima dalam permintaan untuk memilih pemformat. Untuk informasi selengkapnya, lihat Negosiasi Konten.

IHttpActionResult

Antarmuka IHttpActionResult diperkenalkan di Web API 2. Pada dasarnya, ini mendefinisikan pabrik HttpResponseMessage . Berikut adalah beberapa keuntungan menggunakan antarmuka IHttpActionResult :

  • Menyederhanakan unit yang menguji pengontrol Anda.
  • Memindahkan logika umum untuk membuat respons HTTP ke kelas terpisah.
  • Membuat niat tindakan pengontrol lebih jelas, dengan menyembunyikan detail tingkat rendah untuk membangun respons.

IHttpActionResult berisi satu metode, ExecuteAsync, yang secara asinkron membuat instans HttpResponseMessage .

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

Jika tindakan pengontrol mengembalikan IHttpActionResult, API Web memanggil metode ExecuteAsync untuk membuat HttpResponseMessage. Kemudian mengonversi HttpResponseMessage menjadi pesan respons HTTP.

Berikut adalah implementasi sederhana IHttpActionResult yang membuat respons teks biasa:

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

Contoh tindakan pengontrol:

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

Respons:

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

Lebih sering, Anda menggunakan implementasi IHttpActionResult yang ditentukan dalam namespace Layanan System.Web.Http.Results. Kelas ApiController menentukan metode pembantu yang mengembalikan hasil tindakan bawaan ini.

Dalam contoh berikut, jika permintaan tidak cocok dengan ID produk yang ada, pengontrol memanggil ApiController.NotFound untuk membuat respons 404 (Tidak Ditemukan). Jika tidak, pengontrol memanggil ApiController.OK, yang membuat respons 200 (OK) yang berisi produk.

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

Jenis Pengembalian Lainnya

Untuk semua jenis pengembalian lainnya, API Web menggunakan pemformat media untuk membuat serialisasi nilai pengembalian. API Web menulis nilai berseri ke dalam isi respons. Kode status respons adalah 200 (OK).

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

Kerugian dari pendekatan ini adalah Anda tidak dapat langsung mengembalikan kode kesalahan, seperti 404. Namun, Anda dapat melempar HttpResponseException untuk kode kesalahan. Untuk informasi selengkapnya, lihat Penanganan Pengecualian di ASP.NET Web API.

API Web menggunakan header Terima dalam permintaan untuk memilih pemformat. Untuk informasi selengkapnya, lihat Negosiasi Konten.

Contoh permintaan

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

Contoh tanggapan

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