Dua sen saya menggunakan antarmuka IHttpActionResult di WebAPI

Microsoft WebAPI telah cukup lama menjadi kerangka kerja pilihan untuk membangun layanan RESTful yang dapat bekerja melalui HTTP. Antarmuka IHttpActionResult telah diperkenalkan dengan WebAPI versi 2 dan menyediakan cara berbeda untuk mengirim kembali tanggapan dari metode pengontrol WebAPI Anda, dan memanfaatkan asinkron dan menunggu secara default.

Pada dasarnya, IHttpActionResult adalah pabrik untuk HttpResponsemessage. Antarmuka IHttpActionResult terdapat dalam namespace System.Web.Http dan membuat instance HttpResponseMessage secara asinkron. IHttpActionResult terdiri dari kumpulan respons built-in kustom yang meliputi: Ok, BadRequest, Exception, Conflict, Redirect, NotFound, dan Unauthorized.

Antarmuka IHttpActionResult hanya berisi satu metode. Berikut tampilan antarmuka ini:

namespace System.Web.Http

{

    public interface IHttpActionResult

    {

        Task ExecuteAsync(CancellationToken cancellationToken);

    }

}

Anda bisa mengembalikan respons khusus menggunakan salah satu metode helper dari kelas ApiController yang tercantum di bawah ini.

Ok

NotFound

Exception

Unauthorized

BadRequest

Conflict

Redirect

InvalidModelState

Mengembalikan respons dari metode pengontrol WebAPI

Pada bagian ini kita akan mengeksplorasi bagaimana kita dapat memanfaatkan IHttpActionResult untuk mengirim kembali tanggapan dari metode pengontrol.

Sekarang, pertimbangkan pengontrol WebApi berikut:

public class DefaultController : ApiController

    {

        private readonly DemoRepository repository = new DemoRepository();

        public HttpResponseMessage Get(int id)

        {

            var result = repository.GetData(id);

            if (result != null)

                return Request.CreateResponse(HttpStatusCode.OK, result);

            return Request.CreateResponse(HttpStatusCode.NotFound);

        }

    }

Perhatikan bahwa kode status yang sesuai dikembalikan dalam setiap kasus, yaitu, jika data tersedia, HttpStatusCode.OK dikembalikan sementara HttpStatusCode.NotFound dikembalikan jika data tidak tersedia.

Sekarang mari kita lihat bagaimana metode pengontrol yang sama dapat diubah untuk mengembalikan respons sebagai IHttpActionResult. Berikut kode terbaru dari metode pengontrol untuk referensi Anda. Perhatikan bagaimana HttpResponseMessage telah diganti dengan IHttpActionResult.

public IHttpActionResult Get(int id)

        {

            var result = repository.GetData(id);

            if (result == null)

                return NotFound();

            return Ok(result);

        }

Lihat metode Dapatkan yang diberikan di atas. Kode ini lebih sederhana dan ramping dan mengabstraksikan cara pesan Http sebenarnya dibangun di controller. Dan, inilah contoh lainnya.

Lihat potongan kode berikut yang mengembalikan HttpResponseMessage untuk melaporkan keberhasilan atau kegagalan.

public HttpResponseMessage Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

               return new HttpResponseMessage(HttpStatusCode.OK);

            return new HttpResponseMessage(HttpStatusCode.NotFound);

        }

Sekarang lihat bagaimana metode tindakan yang sama dapat difaktorisasi ulang menggunakan IHttpActionResult untuk membuat kode jauh lebih ramping dan sederhana.

public IHttpActionResult Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

              return Ok();

            return NotFound();

        }

Mana yang harus saya gunakan dan mengapa?

Jadi, haruskah kita menggunakan IHttpActionResult melalui HttpResponseMessage di pengontrol WebAPI saat mengirim kembali tanggapan? Inilah jawaban saya untuk pertanyaan ini. Saya selalu lebih suka IHttpActionResult daripada HttpResponseMessage karena dengan melakukan itu, pengujian unit pengontrol akan menjadi disederhanakan. Anda dapat memindahkan logika umum untuk membuat respons Http ke kelas lain dan membuat metode pengontrol Anda ramping dan sederhana. Intinya, detail tingkat rendah dalam membuat respons Http akan dikemas.

Pada catatan yang berbeda, perlu disebutkan bahwa dalam menggunakan IHttpActionResult, Anda dapat mematuhi Prinsip Tanggung Jawab Tunggal serta metode tindakan Anda dapat berfokus pada menangani permintaan Http daripada membuat pesan respons Http. Ada hal lain yang perlu disebutkan. Anda dapat memanfaatkan IHttpActionResult untuk memberikan dukungan HTML dengan Razor. Yang perlu Anda lakukan adalah membuat hasil tindakan kustom yang dapat mengurai tampilan Razor. Membuat hasil tindakan kustom itu sederhana. Anda hanya perlu memperluas antarmuka IHttpActionResult dan kemudian menerapkan versi Anda sendiri dari metode ExecuteAsync.