Programování

Moje dva centy na používání rozhraní IHttpActionResult ve WebAPI

WebAPI společnosti Microsoft je již nějakou dobu rámcem volby pro vytváření služeb RESTful, které mohou fungovat přes HTTP. Rozhraní IHttpActionResult bylo zavedeno s WebAPI verze 2 a poskytuje jiný způsob, jak odeslat zpět odpovědi z vašich metod řadiče WebAPI, a ve výchozím nastavení využívá asynchronní a čekající.

V podstatě IHttpActionResult je továrna na HttpResponsemessage. IHttpActionResult Rozhraní je obsaženo v oboru názvů System.Web.Http a vytváří instanci HttpResponseMessage asynchronně. IHttpActionResult zahrnuje kolekci vlastních vestavěných odpovědí, které zahrnují: Ok, BadRequest, Exception, Conflict, Redirect, NotFound a Unauthorized.

Rozhraní IHttpActionResult obsahuje pouze jednu metodu. Toto rozhraní vypadá takto:

obor názvů System.Web.Http

{

veřejné rozhraní IHttpActionResult

    {

Task ExecuteAsync (CancellationToken CancelToken);

    }

}

Můžete vrátit vlastní odpověď pomocí kterékoli z pomocných metod třídy ApiController uvedených níže.

OK

Nenalezeno

Výjimka

Neoprávněný

Špatný požadavek

Konflikt

Přesměrování

InvalidModelState

Vrácená odpověď z metod řadiče WebAPI

V této části prozkoumáme, jak můžeme využít IHttpActionResult k odeslání zpětných odpovědí z metod kontroleru.

Zvažte následující řadič WebApi:

veřejná třída DefaultController: ApiController

    {

soukromé úložiště pouze pro čtení DemoRepository = nové DemoRepository ();

veřejné HttpResponseMessage Get (int id)

        {

var result = repository.GetData (id);

if (výsledek! = null)

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

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

        }

    }

Všimněte si, že se v každém případě vrátí příslušný stavový kód, tj. Pokud jsou k dispozici data, vrátí se HttpStatusCode.OK, zatímco HttpStatusCode.NotFound se vrátí, pokud data nejsou k dispozici.

Podívejme se nyní, jak lze změnit stejnou metodu řadiče a vrátit odpověď jako IHttpActionResult. Zde je aktualizovaný kód metody řadiče pro vaši referenci. Všimněte si, jak byla HttpResponseMessage nahrazena IHttpActionResult.

public IHttpActionResult Get (int id)

        {

var result = repository.GetData (id);

if (result == null)

vrátit NotFound ();

návrat Ok (výsledek);

        }

Viz výše uvedená metoda Get. Kód je mnohem jednoduchý a štíhlý a abstrahuje způsob, jakým je zpráva Http ve skutečnosti vytvořena v řadiči. A tady je další příklad.

Podívejte se na následující fragment kódu, který vrací HttpResponseMessage k hlášení úspěchu nebo neúspěchu.

public HttpResponseMessage Delete (int id)

        {

var status = repository.Delete (id);

if (status)

vrátit nový HttpResponseMessage (HttpStatusCode.OK);

vrátit nový HttpResponseMessage (HttpStatusCode.NotFound);

        }

Nyní se podívejte, jak lze stejnou metodu akce refaktorovat pomocí IHttpActionResult, aby byl kód mnohem štíhlejší a jednodušší.

public IHttpActionResult Delete (int id)

        {

var status = repository.Delete (id);

if (status)

návrat Ok ();

vrátit NotFound ();

        }

Který mám použít a proč?

Měli bychom tedy použít IHttpActionResult přes HttpResponseMessage v našich řadičích WebAPI při odesílání odpovědí? Tady je moje odpověď na tuto otázku. Vždy bych upřednostňoval IHttpActionResult před HttpResponseMessage, protože při tom by se zjednodušilo testování jednotek řadičů. Běžnou logiku pro vytváření odpovědí Http můžete přesunout do jiných tříd a vaše metody kontroleru mohou být štíhlé a jednoduché. V podstatě by byly zapouzdřeny podrobnosti nízké úrovně vytváření odpovědí Http.

V jiné poznámce stojí za zmínku, že při použití IHttpActionResult můžete dodržovat zásadu Single Responsibility Principle a vaše akční metody se mohou zaměřit na zpracování požadavků Http, nikoli na vytváření zpráv odpovědí Http. Za zmínku stojí ještě jeden bod. Můžete využít výhod IHttpActionResult k poskytnutí podpory pro HTML s Razor. Vše, co musíte udělat, je vytvořit vlastní výsledek akce, který dokáže analyzovat pohledy Razor. Vytvoření výsledku vlastní akce je jednoduché. Stačí jen rozšířit rozhraní IHttpActionResult a poté implementovat vlastní verzi metody ExecuteAsync.

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