Moja dva centa za korištenje sučelja IHttpActionResult u WebAPI

Microsoftov WebAPI već je neko vrijeme okvir izbora za izgradnju RESTful usluga koje mogu raditi preko HTTP-a. Sučelje IHttpActionResult predstavljeno je s WebAPI verzijom 2 i pruža drugačiji način za povratne odgovore s vaših metoda WebAPI kontrolera, a koristi asinhronizaciju i čekanje prema zadanim postavkama.

U osnovi je IHttpActionResult tvornica za HttpResponsemessage. Sučelje IHttpActionResult nalazi se u prostoru imena System.Web.Http i asinhrono stvara instancu HttpResponseMessage. IHttpActionResult sadrži kolekciju prilagođenih ugrađenih odgovora koji uključuju: Ok, BadRequest, Exception, Conflict, Redirect, NotFound i Unauthorized.

Sučelje IHttpActionResult sadrži samo jednu metodu. Evo kako izgleda ovo sučelje:

namespace System.Web.Http

{

    public interface IHttpActionResult

    {

        Task ExecuteAsync(CancellationToken cancellationToken);

    }

}

Možete vratiti prilagođeni odgovor pomoću bilo koje pomoćne metode klase ApiController navedene u nastavku.

Ok

NotFound

Exception

Unauthorized

BadRequest

Conflict

Redirect

InvalidModelState

Povratak odgovora iz metoda WebAPI kontrolera

U ovom ćemo dijelu istražiti kako možemo iskoristiti IHttpActionResult za slanje odgovora iz metoda kontrolera.

Sada razmotrite sljedeći WebApi kontroler:

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

        }

    }

Imajte na umu da se odgovarajući statusni kôd vraća u svakom slučaju, tj. Ako su podaci dostupni, vraća se HttpStatusCode.OK dok se vraća HttpStatusCode.NotFound ako podaci nisu dostupni.

Pogledajmo sada kako se ista metoda kontrolera može promijeniti kako bi se vratio odgovor kao IHttpActionResult. Evo ažurirane šifre metode kontrolera za vašu referencu. Primijetite kako je HttpResponseMessage zamijenjen s IHttpActionResult.

public IHttpActionResult Get(int id)

        {

            var result = repository.GetData(id);

            if (result == null)

                return NotFound();

            return Ok(result);

        }

Pogledajte gore navedenu metodu Get. Kôd je vrlo jednostavan i mršav i apstrahira način na koji je Http poruka zapravo konstruirana u kontroleru. I, evo još jednog primjera.

Pogledajte sljedeći isječak koda koji vraća HttpResponseMessage da biste prijavili uspjeh ili neuspjeh.

public HttpResponseMessage Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

               return new HttpResponseMessage(HttpStatusCode.OK);

            return new HttpResponseMessage(HttpStatusCode.NotFound);

        }

Sada pogledajte kako se ista metoda djelovanja može refaktorirati pomoću IHttpActionResult kako bi se kod učinio mnogo vitkijim i jednostavnijim.

public IHttpActionResult Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

              return Ok();

            return NotFound();

        }

Koji bih trebao koristiti i zašto?

Dakle, trebamo li koristiti IHttpActionResult preko HttpResponseMessage u našim WebAPI kontrolerima kada šaljemo odgovore? Evo mog odgovora na ovo pitanje. Uvijek bih više volio IHttpActionResult od HttpResponseMessage jer bi pritom jedinstveno testiranje kontrolera postalo pojednostavljeno. Uobičajenu logiku za stvaranje Http odgovora možete premjestiti u druge klase i učiniti metode kontrolera vitkijima i jednostavnijima. U osnovi, inkapsulirani bi detalji niske razine stvaranja Http odgovora.

S druge strane, vrijedno je spomenuti da se u korištenju IHttpActionResult možete pridržavati principa jedinstvene odgovornosti, kao i da se vaše radne metode mogu usredotočiti na rukovanje Http zahtjevima, a ne na konstruiranje Http poruka odgovora. Postoji još jedna točka vrijedna spomena. Možete iskoristiti IHttpActionResult za pružanje podrške za HTML s Razorom. Sve što trebate je stvoriti prilagođeni rezultat radnje koji može raščlaniti britvice. Stvaranje prilagođenog rezultata akcije jednostavno je. Trebali biste samo proširiti sučelje IHttpActionResult, a zatim implementirati vlastitu verziju metode ExecuteAsync.