Programavimas

Kaip dirbti su turinio derybomis žiniatinklio API

ASP.Net žiniatinklio API yra lengva sistema, naudojama kuriant be pilietybės ir RESTful HTTP paslaugas. „RESTful“ paslaugos yra lengvos, be pilietybės, kliento-serverio pagrindu veikiančios, talpykloje saugomos paslaugos, pagrįstos išteklių koncepcija. REST yra architektūrinis stilius - apribojimų rinkinys, naudojamas paslaugų be pilietybės įgyvendinimui. Tai yra architektūrinė paradigma, naudojama kuriant daugkartinio naudojimo, keičiamo dydžio paslaugas.

Išteklių pateikimas prašomu formatu yra įdomi tema, nes dažnai norėsite naudoti savo paslaugas iš įvairių tipų įrenginių. Derybos dėl turinio yra viena iš svarbiausių žiniatinklio API sąvokų. Nors ši sąvoka yra gana paprasta, šia tema yra daug nesusipratimų ir nesusipratimų. Kuriant ir įgyvendinant „RESTful“ paslaugas naudojant „Web API“, dažnai teks spręsti derybas dėl turinio.

Kas yra turinys, dėl kurio deramasi, ir kodėl jis yra svarbus?

Derybos dėl turinio gali būti apibrėžiamos kaip gaunamo HTTP užklausos struktūros tikrinimo procesas, siekiant nustatyti geriausią išteklių vaizdą iš kelių galimų to paties šaltinio vaizdų. Iš esmės derybos dėl turinio yra sąvoka, leidžianti tam pačiam URL įvairiems formatams teikti tą patį turinį. Galite pasinaudoti derybų dėl turinio pranašumais norėdami pasirinkti pageidaujamą medijos tipą.

„Web API“ turinio derybas vykdo vykdymo laikas (serverio pusėje), norėdamas nustatyti laikmenos tipo formatą, kuris bus naudojamas remiantis atsakymu į gaunamą užklausą iš kliento pusės.

Derybos dėl turinio sutelktos į medijos tipą ir medijos tipo formatavimą. Pirmasis nurodo „content-type“ antraštės reikšmę HTTP užklausoje ir HTTP atsakyme, antrasis naudojamas konvertuoti .NET tipus į atitinkamus HTTP duomenis ir atvirkščiai. Atkreipkite dėmesį, kad laikmenos tipo formatą žiniatinklio API pateikia abstrakti klasė, vadinama „MediaTypeFormatter“.

Pagal numatytuosius nustatymus žiniatinklio API sistemoje yra šie formatai.

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

Norėdami tinkinti turinio derybas žiniatinklio API, pagrindinis išplėtimo taškas, kurį turėtumėte naudoti, yra laikmenos tipo susiejimas. Atminkite, kad žiniatinklio API pagal numatytuosius nustatymus pateikia šiuos medijos tipo susiejimus.

  • „QueryStringMapping“
  • „UriPathExtensionMapping“
  • „RequestHeaderMapping“
  • „MediaRangeMapping“

Norėdami sukurti pasirinktinį medijos tipo atvaizdavimą, turėsite sukurti klasę, kuri pratęsia „MediaTypeMapping“, kaip parodyta žemiau esančiame kodo fragmente.

viešoji klasė „MediaTypeMapping“: „MediaTypeMapping“

{

apsaugotas dvigubo „OnTryMatchMediaType“ nepaisymas („HttpResponseMessage“ atsakymas)

     {

// Čia parašykite savo pasirinktinį kodą

     }

}

Šis kodo fragmentas parodo, kaip galite gauti visų palaikomų formatų pavadinimus žiniatinklio API, pakartodami rinkinį „HttpConfiguration.Formatters“.

   [HttpGet]

public GetAllFormatters sąrašas ()

       {

Sąrašas lstFormaters = naujas sąrašas ();

foreach (kintamasis šiame formatu. Konfigūracija. Formatavimas)

           {

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

           }

grąžinti lstFormaters;

       }

Dabar panagrinėkime, kaip galime derėtis dėl turinio, norėdami pasirinkti norimą formatą ir gauti turinį mums reikalingu formatu. Apsvarstykite šią subjektų klasę.

viešosios klasės klientasDTO

   {

public Int32 Id

{gauti; rinkinys; }

vieša eilutė Vardas

{gauti; rinkinys; }

vieša eilutė Pavardė

{gauti; rinkinys; }

viešoji eilutė Adresas

{gauti; rinkinys; }

   }

Tada tarkime, kad turite metodą, kuris užpildo duomenis į „CustomerDTO“ tipo sąrašą ir grąžina juos.

privatus sąrašas „GetCustomerData“ ()

       {

Sąrašas lstCustomers = naujas sąrašas ();

KlientoDTO klientas = naujas KlientoDTO ();

klientas.Id = 1;

klientas.Vardas = "Joydip";

customer.LastName = "Kanjilal";

kliento adresas = "Hyderabad, India";

lstCustomers.Add (klientas);

grąžinti klientus;

       }

Šis žiniatinklio API metodas parodo, kaip galite grąžinti „HttpResponseMessage“ kaip atsakymą iš savo žiniatinklio API metodo pagal numatytąjį turimo derybų mechanizmą.

[HttpGet]

public HttpResponseMessage GetCustomers ()

       {

Sąrašas lstCustomers = GetCustomerData ();

„IContentNegotiator“ derybininkas = Configuration.Services.GetContentNegotiator ();

„ContentNegotiationResult“ rezultatas = derybininkas. Derėkitės (typeof (CustomerDTO), Request, Configuration.Formatters);

grąžinti naują „HttpResponseMessage“ ()

           {

Turinys = naujas „ObjectContent“(„lstCustomers, result.Formatter, result.MediaType.MediaType“)

         };

       }

Jei naudojote konkretų formatavimo priemonę, esančią formato rinkinyje, galbūt norėsite iš naujo parašyti tą patį metodą, kaip parodyta toliau pateiktame kodo fragmente.

[HttpGet]

public HttpResponseMessage GetCustomers ()

       {

Sąrašas lstCustomers = GetCustomerData ();

grąžinti naują „HttpResponseMessage“ ()

           {

Turinys = naujas „ObjectContent“(„lstCustomers, Configuration.Formatters [1]“)

           };

      }

Gerai; bet kaip tada susikurti savo pasirinktinį formatą? Na, norėdami sukurti pasirinktinį laikmenos tipo formatą, turėtumėte sukurti klasę, pratęsiančią „MediaTypeFormatter“ abstrakčią klasę. Tada turėtumėte parašyti savo pasirinktą kodą savo sukurtoje klasėje, kad nepaisytumėte „MediaTypeFormatter“ abstrakčios pagrindinės klasės metodų.

public class CustomMediaTypeFormatter: MediaTypeFormatter

   {

vieša nepaisyti „CanReadType“ talpos (tipo tipas)

       {

mesti naują NotImplementedException ();

       }

vieša nepaisyti „Bool“ „CanWriteType“ (tipo tipas)

       {

mesti naują NotImplementedException ();

       }

   }

Įdiegę pasirinktinį formatą, galite lengvai jį pridėti prie formatavimo priemonių rinkinio:

config.Formatters.Add (new CustomMediaTypeFormatter ());