Dua sen saya menggunakan antara muka IHttpActionResult di WebAPI

WebAPI Microsoft telah lama menjadi kerangka pilihan untuk membina perkhidmatan RESTful yang dapat berfungsi melalui HTTP. Antaramuka IHttpActionResult telah diperkenalkan dengan WebAPI versi 2 dan menyediakan cara yang berbeza untuk menghantar balik respons dari kaedah pengawal WebAPI anda, dan ia memanfaatkan async dan menunggu secara lalai.

Pada dasarnya, IHttpActionResult adalah kilang untuk HttpResponsemessage. Antara muka IHttpActionResult terkandung di ruang nama System.Web.Http dan membuat contoh HttpResponseMessage secara tidak segerak. IHttpActionResult merangkumi koleksi respons bawaan tersuai yang merangkumi: Ok, BadRequest, Exception, Conflict, Redirect, NotFound, dan Unauthorized.

Antara muka IHttpActionResult mengandungi hanya satu kaedah. Begini rupa antara muka ini:

namespace System.Web.Http

{

    public interface IHttpActionResult

    {

        Task ExecuteAsync(CancellationToken cancellationToken);

    }

}

Anda boleh mengembalikan respons khusus menggunakan kaedah pembantu kelas ApiController yang disenaraikan di bawah.

Ok

NotFound

Exception

Unauthorized

BadRequest

Conflict

Redirect

InvalidModelState

Mengembalikan tindak balas dari kaedah pengawal WebAPI

Pada bahagian ini kita akan meneroka bagaimana kita dapat memanfaatkan IHttpActionResult untuk menghantar kembali respons dari kaedah pengawal.

Sekarang, pertimbangkan pengawal 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 bahawa kod status yang sesuai dikembalikan dalam setiap kes, iaitu, jika data tersedia, HttpStatusCode.OK dikembalikan sementara HttpStatusCode.NotFound dikembalikan jika data tidak tersedia.

Sekarang mari kita lihat bagaimana kaedah pengawal yang sama dapat diubah untuk mengembalikan tindak balas seperti IHttpActionResult. Inilah kod kaedah pengawal yang dikemas kini untuk rujukan 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);

        }

Rujuk kaedah Dapatkan yang diberikan di atas. Kodnya sangat ringkas dan ramping dan abstrak cara mesej Http dibina dalam alat kawalan. Dan, inilah contoh lain.

Rujuk coretan kod berikut yang mengembalikan HttpResponseMessage untuk melaporkan kejayaan 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 kaedah tindakan yang sama dapat dipantulkan menggunakan IHttpActionResult untuk menjadikan kodnya lebih ramping dan ringkas.

public IHttpActionResult Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

              return Ok();

            return NotFound();

        }

Mana yang harus saya gunakan dan mengapa?

Oleh itu, perlukah kita menggunakan IHttpActionResult over HttpResponseMessage dalam pengawal WebAPI kami semasa menghantar kembali respons? Inilah jawapan saya untuk soalan ini. Saya lebih suka IHttpActionResult daripada HttpResponseMessage kerana dengan berbuat demikian, pengujian unit pengawal menjadi lebih mudah. Anda boleh mengalihkan logik biasa untuk membuat respons Http ke kelas lain dan menjadikan kaedah pengawal anda lebih ramping dan sederhana. Pada dasarnya, perincian tahap rendah untuk membuat respons Http akan dikemas.

Pada catatan yang berbeza, perlu disebutkan bahawa dengan menggunakan IHttpActionResult, anda dapat mematuhi Prinsip Tanggungjawab Tunggal dan kaedah tindakan anda dapat menumpukan pada menangani permintaan Http daripada membina mesej respons Http. Ada satu lagi perkara yang perlu disebut. Anda boleh memanfaatkan IHttpActionResult untuk memberikan sokongan untuk HTML dengan Razor. Yang perlu anda buat hanyalah membuat hasil tindakan tersuai yang dapat mengurai pandangan Razor. Membuat hasil tindakan tersuai adalah mudah. Anda hanya perlu memperluaskan antara muka IHttpActionResult dan kemudian melaksanakan versi kaedah ExecuteAsync anda sendiri.