Programovanie

Ako pracovať s vyjednávaním obsahu vo webovom API

ASP.Net Web API je odľahčený rámec používaný na vytváranie bezstavových služieb RESTful HTTP. Služby RESTful sú ľahké a bezstavové služby založené na klient-serveri, ukladateľné do medzipamäte, ktoré sú založené na koncepcii zdrojov. REST je architektonický štýl - súbor obmedzení používaných pri implementácii služieb bez štátnej príslušnosti. Je to architektonická paradigma, ktorá sa používa na vytvorenie opakovane použiteľných, škálovateľných služieb.

Reprezentácia zdroja v požadovanom formáte je zaujímavá téma, pretože možno budete chcieť využívať svoje služby z rôznych typov zariadení. Vyjednávanie obsahu je jedným z najdôležitejších konceptov vo webovom API. Aj keď ide o pomerne jednoduchý koncept, okolo tejto témy panuje veľa nedorozumení a nedorozumení. Pri navrhovaní a implementácii služieb RESTful pomocou webového rozhrania API by ste často museli riešiť rokovania o obsahu.

Čo je dohodnutý obsah a prečo je dôležitý?

Vyjednávanie o obsahu možno definovať ako proces kontroly štruktúry prichádzajúcej požiadavky HTTP s cieľom určiť najlepšiu reprezentáciu zdroja z viacerých dostupných reprezentácií toho istého zdroja. Vyjednávanie o obsahu je v podstate koncept, ktorý umožňuje tej istej adrese URL zobrazovať rovnaký obsah v rôznych formátoch. Môžete využiť výhody vyjednávania obsahu a zvoliť preferovaný typ média.

Vo webovom rozhraní API sa vyjednávanie obsahu vykonáva za behu (na strane servera), aby sa určil formátovač typu média, ktorý sa má použiť na základe vrátenia odpovede na prichádzajúcu požiadavku zo strany klienta.

Vyjednávanie obsahu je sústredené na formátovanie typu média a typu média. Zatiaľ čo prvý odkazuje na hodnotu hlavičky „content-type“ v požiadavke HTTP a odpovedi HTTP, druhý sa používa na prevod typov .NET na zodpovedajúce údaje HTTP a naopak. Upozorňujeme, že formátovač typu média vo webovom API predstavuje abstraktná trieda s názvom MediaTypeFormatter.

Rámec webového rozhrania API je predvolene dodávaný s nasledujúcimi formátovačmi.

  • System.Net.Http.Formatting.JsonMediaTypeFormatter
  • System.Net.Http.Formatting.XmlMediaTypeFormatter
  • System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
  • System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter

Ak chcete prispôsobiť vyjednávanie obsahu vo webovom rozhraní API, hlavným bodom rozšíriteľnosti, ktorý by ste potrebovali využiť, je mapovanie typov médií. Upozorňujeme, že webové rozhranie API predvolene prichádza s nasledujúcimi mapovaniami typov médií.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

Ak chcete vytvoriť vlastné mapovanie typov médií, budete musieť vytvoriť triedu, ktorá rozširuje MediaTypeMapping, ako je uvedené v útržku kódu nižšie.

verejná trieda MediaTypeMapping: MediaTypeMapping

{

dvojité chránené prepísanie On TryMatchMediaType (odpoveď HttpResponseMessage)

     {

// Sem napíš svoj vlastný kód

     }

}

Nasledujúci úryvok kódu ilustruje, ako môžete načítať názvy všetkých podporovaných formátovačov vo webovom rozhraní API iteráciou kolekcie HttpConfiguration.Formatters.

   [HttpGet]

verejný zoznam GetAllFormatters ()

       {

List lstFormaters = nový List ();

foreach (formátovač varov v tomto. Konfigurácia. Formáty)

           {

lstFormaters.Add (formatter.GetType (). Name);

           }

návrat lstFormaters;

       }

Poďme teraz preskúmať, ako môžeme pracovať s vyjednávaním o obsahu, aby sme vybrali požadovaný formátovač a načítali obsah v potrebnom formáte. Zvážte nasledujúcu triedu entít.

verejná trieda CustomerDTO

   {

verejné Int32 Id

{dostať; sada; }

verejný reťazec FirstName

{dostať; sada; }

verejný reťazec Priezvisko

{dostať; sada; }

verejný reťazec Adresa

{dostať; sada; }

   }

Ďalej predpokladajme, že máte metódu, ktorá vyplní údaje do zoznamu typu CustomerDTO a vráti ich.

súkromný zoznam GetCustomerData ()

       {

Zoznam lstCustomers = nový Zoznam ();

CustomerDTO customer = new CustomerDTO ();

customer.Id = 1;

customer.FirstName = "Joydip";

customer.LastName = "Kanjilal";

customer.Address = "Hyderabad, India";

lstCustomers.Add (zákazník);

vrátiť lstCustomers;

       }

Nasledujúca metóda webového rozhrania API ukazuje, ako môžete vrátiť HttpResponseMessage ako odpoveď z vašej metódy webového rozhrania API na základe predvoleného dostupného mechanizmu vyjednávania obsahu.

[HttpGet]

verejná HttpResponseMessage GetCustomers ()

       {

Zoznam lstCustomers = GetCustomerData ();

IContentNegotiator negotiator = Configuration.Services.GetContentNegotiator ();

ContentNegotiationResult result = negotiator.Negotiate (typeof (CustomerDTO), Request, Configuration.Formatters);

vrátiť novú HttpResponseMessage ()

           {

Obsah = nový ObjectContent(lstCustomers, result.Formatter, result.MediaType.MediaType)

         };

       }

Ak by ste chceli použiť konkrétny formátovač, ktorý je k dispozícii v kolekcii formátovačov, možno budete chcieť prepísať rovnakú metódu, ako je uvedená v útržku kódu nižšie.

[HttpGet]

verejná HttpResponseMessage GetCustomers ()

       {

Zoznam lstCustomers = GetCustomerData ();

vrátiť novú HttpResponseMessage ()

           {

Obsah = nový ObjectContent(lstCustomers, Configuration.Formatters [1])

           };

      }

Ok; ale ako si potom vytvoriť svoj vlastný formátovač? Ak chcete vytvoriť vlastný formátovač typu médií, mali by ste vytvoriť triedu, ktorá rozširuje abstraktnú triedu MediaTypeFormatter. Potom by ste mali napísať svoj vlastný kód do triedy, ktorú ste vytvorili, aby ste prepísali metódy abstraktnej základnej triedy MediaTypeFormatter.

verejná trieda CustomMediaTypeFormatter: MediaTypeFormatter

   {

verejné prepísanie bool CanReadType (typ typu)

       {

hodiť novú NotImplementedException ();

       }

verejné prepísanie bool CanWriteType (typ typu)

       {

hodiť nový NotImplementedException ();

       }

   }

Keď je váš vlastný formátovač k dispozícii, môžete ho ľahko pridať do kolekcie formátovačov:

config.Formatters.Add (nový CustomMediaTypeFormatter ());

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