Programmering

Mine to cent på å bruke IHttpActionResult-grensesnittet i WebAPI

Microsofts WebAPI har i lang tid vært rammen for valg for å bygge RESTful-tjenester som kan fungere over HTTP. IHttpActionResult-grensesnittet har blitt introdusert med WebAPI versjon 2 og gir en annen måte å sende svar fra WebAPI-kontrollermetodene dine, og den utnytter asynkronisering og venter som standard.

I hovedsak er IHttpActionResult en fabrikk for HttpResponsemessage. IHttpActionResult-grensesnittet finnes i navneområdet for System.Web.Http og oppretter en forekomst av HttpResponseMessage asynkront. IHttpActionResult består av en samling tilpassede innebygde svar som inkluderer: Ok, BadRequest, Exception, Conflict, Redirect, NotFound og Uautorized.

IHttpActionResult-grensesnittet inneholder bare en metode. Slik ser dette grensesnittet ut:

navneområde System.Web.Http

{

offentlig grensesnitt IHttpActionResult

    {

Task ExecuteAsync (CancellationToken cancellationToken);

    }

}

Du kan returnere et tilpasset svar ved hjelp av noen av hjelpermetodene i ApiController-klassen som er oppført nedenfor.

Ok

Ikke funnet

Unntak

Uautorisert

Dårlig forespørsel

Konflikt

Viderekobling

InvalidModelState

Returnerer respons fra WebAPI-kontrollermetoder

I denne delen vil vi undersøke hvordan vi kan utnytte IHttpActionResult for å sende tilbake svar fra kontrollermetodene.

Vurder nå følgende WebApi-kontroller:

offentlig klasse DefaultController: ApiController

    {

privat readonly DemoRepository repository = nytt DemoRepository ();

offentlig HttpResponseMessage Get (int id)

        {

var resultat = repository.GetData (id);

hvis (resultat! = null)

returner Request.CreateResponse (HttpStatusCode.OK, resultat);

returner Request.CreateResponse (HttpStatusCode.NotFound);

        }

    }

Merk at riktig statuskode returneres i hvert tilfelle, dvs. hvis data er tilgjengelige, returneres HttpStatusCode.OK mens HttpStatusCode.NotFound returneres hvis data ikke er tilgjengelige.

La oss nå se hvordan den samme kontrollermetoden kan endres for å returnere svaret som IHttpActionResult. Her er den oppdaterte koden for kontrollermetoden som referanse. Legg merke til hvordan HttpResponseMessage er erstattet med IHttpActionResult.

offentlig IHttpActionResult Get (int id)

        {

var result = repository.GetData (id);

hvis (resultat == null)

returner NotFound ();

returner Ok (resultat);

        }

Se Get-metoden gitt ovenfor. Koden er mye enkel og slank, og den abstrakte måten Http-meldingen faktisk er konstruert i kontrolleren. Og her er et annet eksempel.

Henvis til følgende kodebit som returnerer HttpResponseMessage for å rapportere suksess eller fiasko.

public HttpResponseMessage Delete (int id)

        {

var status = repository.Delete (id);

hvis (status)

returner nye HttpResponseMessage (HttpStatusCode.OK);

returner nye HttpResponseMessage (HttpStatusCode.NotFound);

        }

Se nå hvordan den samme handlingsmetoden kan omformuleres ved hjelp av IHttpActionResult for å gjøre koden mye mer slank og enkel.

offentlig IHttpActionResult Slett (int id)

        {

var status = repository.Delete (id);

hvis (status)

returner Ok ();

returner NotFound ();

        }

Hvilken bør jeg bruke og hvorfor?

Så skal vi bruke IHttpActionResult over HttpResponseMessage i WebAPI-kontrollerne når vi sender svarene tilbake? Her er svaret mitt på dette spørsmålet. Jeg foretrekker alltid IHttpActionResult fremfor HttpResponseMessage som ved å gjøre det, vil enhetstesting av kontrollerne bli forenklet. Du kan flytte den vanlige logikken for å lage Http-svar til andre klasser og gjøre kontrollermetodene dine magre og enkle. I det vesentlige vil de lave detaljene for å lage Http-svarene være innkapslet.

På et annet notat er det verdt å nevne at når du bruker IHttpActionResult, kan du følge Single Responsibility Principle, i tillegg til at dine handlingsmetoder kan fokusere på å håndtere Http-forespørslene i stedet for å konstruere Http-svarmeldingene. Det er et annet poeng det er verdt å nevne. Du kan dra nytte av IHttpActionResult for å gi støtte for HTML med Razor. Alt du trenger å gjøre er å lage et tilpasset handlingsresultat som kan analysere Razor-visninger. Å lage et tilpasset handlingsresultat er enkelt. Du trenger bare å utvide IHttpActionResult-grensesnittet og deretter implementere din egen versjon av ExecuteAsync-metoden.

$config[zx-auto] not found$config[zx-overlay] not found