Programovanie

Moje dva centy za používanie rozhrania IHttpActionResult vo WebAPI

WebAPI od spoločnosti Microsoft je už dosť dlho rámcom voľby pre budovanie služieb RESTful, ktoré môžu fungovať cez HTTP. Rozhranie IHttpActionResult bolo zavedené s rozhraním WebAPI verzie 2 a poskytuje iný spôsob odosielania odpovedí späť z metód radiča WebAPI. V predvolenom nastavení využíva asynchronizáciu a čakanie.

IHttpActionResult je v podstate továreň na HttpResponsemessage. Rozhranie IHttpActionResult je obsiahnuté v mennom priestore System.Web.Http a vytvára asynchrónne inštanciu HttpResponseMessage. IHttpActionResult obsahuje kolekciu vlastných zabudovaných odpovedí, ktoré zahŕňajú: Ok, BadRequest, Exception, Conflict, Redirect, NotFound a Unauthorized.

Rozhranie IHttpActionResult obsahuje iba jednu metódu. Toto rozhranie vyzerá takto:

menný priestor System.Web.Http

{

verejné rozhranie IHttpActionResult

    {

Task ExecuteAsync (CancellationToken CancelToken);

    }

}

Vlastnú odpoveď môžete vrátiť pomocou ktorejkoľvek z pomocných metód triedy ApiController uvedených nižšie.

Ok

Nenájdené

Výnimka

Neoprávnené

Zlá požiadavka

Konflikt

Presmerovanie

InvalidModelState

Vracajúca sa odpoveď z metód radiča WebAPI

V tejto časti preskúmame, ako môžeme využiť IHttpActionResult na zasielanie spätných odpovedí z metód radiča.

Teraz zvážte nasledujúci radič WebApi:

verejná trieda DefaultController: ApiController

    {

súkromné ​​readonly úložisko DemoRepository = nové DemoRepository ();

verejné HttpResponseMessage Get (int id)

        {

var result = repository.GetData (id);

if (výsledok! = null)

návrat Request.CreateResponse (HttpStatusCode.OK, výsledok);

návrat Request.CreateResponse (HttpStatusCode.NotFound);

        }

    }

Upozorňujeme, že v každom prípade sa vráti príslušný stavový kód, t. J. Ak sú k dispozícii údaje, vráti sa HttpStatusCode.OK, zatiaľ čo HttpStatusCode.NotFound sa vráti, ak údaje nie sú k dispozícii.

Pozrime sa teraz, ako je možné zmeniť rovnakú metódu radiča, aby sa vrátila odpoveď ako IHttpActionResult. Tu je aktualizovaný kód metódy kontrolóra pre vašu referenciu. Všimnite si, ako bola HttpResponseMessage nahradená IHttpActionResult.

public IHttpActionResult Get (int id)

        {

var result = repository.GetData (id);

if (výsledok == null)

vrátiť NotFound ();

návrat Ok (výsledok);

        }

Prečítajte si vyššie uvedenú metódu Get. Tento kód je oveľa jednoduchý a štíhly a abstrahuje od spôsobu, akým je správa HTTP v ovládači skutočne konštruovaná. A tu je ďalší príklad.

Ak chcete nahlásiť úspech alebo neúspech, pozrite si nasledujúci útržok kódu, ktorý vracia HttpResponseMessage.

public HttpResponseMessage Delete (int id)

        {

var status = repository.Delete (id);

if (status)

vrátiť nový HttpResponseMessage (HttpStatusCode.OK);

vrátiť nový HttpResponseMessage (HttpStatusCode.NotFound);

        }

Teraz uvidíte, ako sa dá rovnaká metóda akcie refaktorovať pomocou nástroja IHttpActionResult, aby bol kód oveľa štíhlejší a jednoduchší.

public IHttpActionResult Delete (int id)

        {

var status = repository.Delete (id);

if (status)

návrat Ok ();

vrátiť NotFound ();

        }

Ktorý z nich by som mal použiť a prečo?

Mali by sme teda pri odosielaní odpovedí použiť IHttpActionResult cez HttpResponseMessage v našich radičoch WebAPI? Tu je moja odpoveď na túto otázku. Vždy by som uprednostnil IHttpActionResult pred HttpResponseMessage, pretože by sa tým zjednodušilo testovanie jednotiek radičov. Spoločnú logiku pre vytváranie odpovedí Http môžete presunúť do iných tried a metódy ovládača môžete zjednodušiť a zjednodušiť. V podstate by boli zhrnuté podrobnosti o nízkej úrovni vytvárania odpovedí Http.

Na inú poznámku stojí za zmienku, že pri použití IHttpActionResult sa môžete držať princípu Single Responsibility Principle, rovnako ako sa vaše akčné metódy môžu zamerať skôr na spracovanie požiadaviek Http, ako na vytváranie správ odpovede Http. Za zmienku stojí ešte jeden bod. Môžete využiť výhodu IHttpActionResult na poskytnutie podpory pre HTML s Razor. Všetko, čo musíte urobiť, je vytvoriť vlastný výsledok akcie, ktorý dokáže analyzovať pohľady Razor. Vytvorenie výsledku vlastnej akcie je jednoduché. Potrebujete iba rozšíriť rozhranie IHttpActionResult a potom implementovať svoju vlastnú verziu metódy ExecuteAsync.

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