Programování

Jak pracovat s vyjednáváním obsahu ve webovém rozhraní API

ASP.Net Web API je odlehčený rámec používaný pro vytváření bezstavových a RESTful služeb HTTP. Služby RESTful jsou lehké, bez státní příslušnosti, založené na klient-server, mezipaměti služeb, které jsou založeny na konceptu prostředků. REST je architektonický styl - sada omezení používaných k implementaci bezstavových služeb. Jedná se o architektonické paradigma, které se používá k vytváření opakovaně použitelných, škálovatelných služeb.

Reprezentace zdroje ve formátu požadovaném pro je zajímavé téma, protože možná budete chtít využívat své služby z různých typů zařízení. Vyjednávání obsahu je jedním z nejdůležitějších konceptů ve webovém rozhraní API. Ačkoli jde o relativně jednoduchý koncept, existuje kolem tohoto tématu mnoho mylných představ a nedorozumění. Při navrhování a implementaci služeb RESTful pomocí webového rozhraní API byste často museli jednat o vyjednávání obsahu.

Co je sjednaný obsah a proč je to důležité?

Vyjednávání o obsahu může být definováno jako proces kontroly struktury příchozího požadavku HTTP za účelem určení nejlepší reprezentace zdroje z více dostupných reprezentací stejného zdroje. V zásadě je vyjednávání obsahu koncept, který umožňuje stejné adrese URL zobrazovat stejný obsah v různých formátech. Chcete-li vybrat preferovaný typ média, můžete využít vyjednávání obsahu.

Ve webovém rozhraní API se vyjednávání obsahu provádí za běhu (na straně serveru), aby se určil formátovač typu média, který se má použít na základě vrácení odpovědi na příchozí požadavek ze strany klienta.

Vyjednávání obsahu je zaměřeno na formátování typu média a typu média. Zatímco první odkazuje na hodnotu hlavičky „content-type“ v požadavku HTTP a odpovědi HTTP, druhá se používá k převodu typů .NET na odpovídající data HTTP a naopak. Všimněte si, že formátovač typu média ve webovém rozhraní API je reprezentován abstraktní třídou nazvanou MediaTypeFormatter.

Rámec webového rozhraní API je ve výchozím nastavení dodáván s následujícími formátory.

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

Chcete-li přizpůsobit vyjednávání obsahu ve webovém rozhraní API, je hlavním bodem rozšiřitelnosti, který byste potřebovali využít, mapování typů médií. Všimněte si, že webové rozhraní API ve výchozím nastavení přichází s následujícími mapování typů médií.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

Chcete-li vytvořit vlastní mapování typů médií, budete muset vytvořit třídu, která rozšiřuje MediaTypeMapping, jak je ukázáno v fragmentu kódu níže.

veřejná třída MediaTypeMapping: MediaTypeMapping

{

dvojité chráněné přepsání On TryMatchMediaType (odpověď HttpResponseMessage)

     {

// Sem napište svůj vlastní kód

     }

}

Následující fragment kódu ukazuje, jak můžete načíst názvy všech podporovaných formátovačů ve webovém rozhraní API iterací kolekce HttpConfiguration.Formatters.

   [HttpGet]

veřejný seznam GetAllFormatters ()

       {

List lstFormaters = nový List ();

foreach (formátovač varů v tomto.Configuration.Formatters)

           {

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

           }

vrátit lstFormaters;

       }

Pojďme nyní prozkoumat, jak můžeme pracovat s vyjednáváním obsahu, abychom vybrali požadovaný formátovač a načetli obsah ve formátu, který potřebujeme. Zvažte následující třídu entit.

veřejná třída CustomerDTO

   {

veřejné Int32 ID

{ dostat; soubor; }

veřejný řetězec FirstName

{ dostat; soubor; }

veřejný řetězec Příjmení

{ dostat; soubor; }

veřejný řetězec Adresa

{ dostat; soubor; }

   }

Dále předpokládejme, že máte metodu, která naplní data do seznamu typu CustomerDTO a vrátí ji.

soukromý seznam GetCustomerData ()

       {

List lstCustomers = new List ();

CustomerDTO customer = new CustomerDTO ();

customer.Id = 1;

customer.FirstName = "Joydip";

customer.LastName = "Kanjilal";

customer.Address = "Hyderabad, Indie";

lstCustomers.Add (zákazník);

vrátit lstCustomers;

       }

Následující metoda webového rozhraní API ukazuje, jak můžete HttpResponseMessage vrátit jako odpověď z vaší metody webového rozhraní API na základě dostupného výchozího mechanismu vyjednávání obsahu.

[HttpGet]

veřejná HttpResponseMessage GetCustomers ()

       {

Seznam lstCustomers = GetCustomerData ();

IContentNegotiator negotiator = Configuration.Services.GetContentNegotiator ();

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

vrátit nový HttpResponseMessage ()

           {

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

         };

       }

Pokud byste měli použít konkrétní formátovací modul, který je k dispozici v kolekci formátovacích modulů, možná budete chtít přepsat stejnou metodu, jak je ukázáno v níže uvedeném fragmentu kódu.

[HttpGet]

veřejná HttpResponseMessage GetCustomers ()

       {

Seznam lstCustomers = GetCustomerData ();

vrátit nový HttpResponseMessage ()

           {

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

           };

      }

OK; ale jak si tedy vytvořit svůj vlastní vlastní formátovač? Chcete-li vytvořit vlastní formátovač typů médií, měli byste vytvořit třídu, která rozšiřuje abstraktní třídu MediaTypeFormatter. Poté byste měli napsat vlastní kód uvnitř třídy, kterou jste vytvořili, aby přepsali metody abstraktní základní třídy MediaTypeFormatter.

veřejná třída CustomMediaTypeFormatter: MediaTypeFormatter

   {

veřejné přepsání bool CanReadType (typ typu)

       {

hodit nový NotImplementedException ();

       }

veřejné přepsání bool CanWriteType (typ typu)

       {

hodit nový NotImplementedException ();

       }

   }

Jakmile je váš vlastní formátovač na místě, můžete jej snadno přidat do kolekce formátovačů:

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

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