Programiranje

Kako delati s pogajanji o vsebini v spletnem API-ju

ASP.Net Web API je lahek okvir, ki se uporablja za gradnjo storitev HTTP brez stanja in RESTful. Storitve RESTful so lahke, predpomnilniške storitve, ki temeljijo na odjemalčevem strežniku, brez državljanstva in temeljijo na konceptu virov. REST je arhitekturni slog - niz omejitev, ki se uporabljajo za izvajanje storitev brez državljanstva. Gre za arhitekturno paradigmo, ki se uporablja za ustvarjanje prilagodljivih storitev za večkratno uporabo.

Predstavitev vira v zahtevani obliki je zanimiva tema, saj boste pogosto želeli uporabiti svoje storitve iz različnih vrst naprav. Pogajanje o vsebini je eden najpomembnejših konceptov spletnega API-ja. Čeprav je to razmeroma preprost koncept, je okrog te teme veliko napačnih predstav in nesporazumov. Ko načrtujete in izvajate storitve RESTful z uporabo spletnega API-ja, se boste pogosto morali ukvarjati s pogajanji o vsebini.

Kaj je vsebina s pogajanji in zakaj je pomembna?

Pogajanje vsebine je mogoče opredeliti kot postopek pregleda strukture dohodne zahteve HTTP za določitev najboljše predstavitve vira med več razpoložljivimi predstavitvami istega vira. V bistvu je pogajanje o vsebini koncept, ki omogoča istemu URL-ju, da prikazuje isto vsebino v različnih oblikah. Pogajanja o vsebini lahko izkoristite za izbiro želene vrste medija.

V spletnem API-ju se pogajanja o vsebini izvajajo med izvajanjem (na strani strežnika), da se določi oblikovalnik vrste medija, ki bo uporabljen za vrnitev odziva na dohodno zahtevo s strani odjemalca.

Pogajanje vsebine je osredotočeno na obliko medija in medij. Medtem ko se prva nanaša na vrednost glave "type-content" v zahtevi HTTP in HTTP odzivu, se druga uporablja za pretvorbo tipov .NET v ustrezne podatke HTTP in obratno. Upoštevajte, da je oblikovalnik medijskega tipa v spletnem API-ju predstavljen z abstraktnim razredom, imenovanim MediaTypeFormatter.

Okvir spletnega API-ja je privzeto opremljen z naslednjimi oblikovalniki.

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

Če želite prilagoditi pogajanja o vsebini v spletnem API-ju, je glavna točka razširljivosti, ki bi jo morali izkoristiti, preslikava vrste medija. Upoštevajte, da spletni API privzeto pripravi naslednje preslikave vrst medijev.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

Če želite izdelati preslikavo vrste medija po meri, morate ustvariti razred, ki razširja MediaTypeMapping, kot je prikazano v spodnjem delčku kode.

javni razred MediaTypeMapping: MediaTypeMapping

{

zaščiteno preglasitev dvojnega OnTryMatchMediaType (odziv HttpResponseMessage)

     {

// Tukaj napišite kodo po meri

     }

}

Naslednji delček kode prikazuje, kako lahko pridobite imena vseh podprtih oblikovalcev v spletnem API-ju s ponovitvijo zbirke HttpConfiguration.Formatters.

   [HttpGet]

javni seznam GetAllFormatters ()

       {

Seznam lstFormaters = nov seznam ();

foreach (var formatter v tem. Konfiguracija. Oblikovalci)

           {

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

           }

vrni lstFormaters;

       }

Zdaj pa raziščimo, kako lahko s pogajanji o vsebini izberemo želeni oblikovalnik in pridobimo vsebino v obliki, ki jo potrebujemo. Razmislite o naslednjem razredu entitet.

javni razred CustomerDTO

   {

javni Int32 Id

{dobite; set; }

javni niz FirstName

{dobite; set; }

javni niz Priimek

{dobite; set; }

javni niz Naslov

{dobite; set; }

   }

Nato predpostavimo, da imate metodo, ki podatke zapolni na seznam vrste CustomerDTO in jih vrne.

zasebni seznam GetCustomerData ()

       {

Seznam lstCustomers = nov seznam ();

CustomerDTO kupec = novi CustomerDTO ();

stranka.Id = 1;

customer.FirstName = "Joydip";

customer.LastName = "Kanjilal";

customer.Address = "Hyderabad, Indija";

lstCustomers.Add (kupec);

vrni lstCustomers;

       }

Naslednja metoda spletnega API-ja prikazuje, kako lahko vrnete HttpResponseMessage kot odgovor vaše metode spletnega API-ja na podlagi privzetega mehanizma pogajanj o vsebini, ki je na voljo.

[HttpGet]

public HttpResponseMessage GetCustomers ()

       {

Seznam lstCustomers = GetCustomerData ();

IContentNegotiator pogajalec = Configuration.Services.GetContentNegotiator ();

ContentNegotiationResult rezultat = pogajalec.Negotiate (typeof (CustomerDTO), Request, Configuration.Formatters);

vrni novo HttpResponseMessage ()

           {

Content = new ObjectContent(lstCustomers, result.Formatter, result.MediaType.MediaType)

         };

       }

Če bi uporabljali določeno oblikovalnik, ki je na voljo v zbirki oblikovalcev, boste morda želeli znova napisati isto metodo, kot je prikazana v spodnjem delčku kode.

[HttpGet]

public HttpResponseMessage GetCustomers ()

       {

Seznam lstCustomers = GetCustomerData ();

vrni novo HttpResponseMessage ()

           {

Content = new ObjectContent(lstCustomers, Configuration.Formatters [1])

           };

      }

V redu; kako pa si potem ustvarite lasten oblikovalnik po meri? No, če želite ustvariti oblikovalnik medijskega tipa po meri, morate ustvariti razred, ki razširja abstraktni razred MediaTypeFormatter. Nato v razred, ki ste ga ustvarili, napišite kodo po meri, da preglasite metode abstraktnega osnovnega razreda MediaTypeFormatter.

javni razred CustomMediaTypeFormatter: MediaTypeFormatter

   {

public override bool CanReadType (vrsta tipa)

       {

vrzi nov NotImplementedException ();

       }

public override bool CanWriteType (vrsta tipa)

       {

vrzi novo NotImplementedException ();

       }

   }

Ko je oblikovalec po meri nameščen, ga lahko preprosto dodate v zbirko oblikovalnikov:

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

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