Programmering

Sådan arbejder du med indholdsforhandling i Web API

ASP.Net Web API er en letvægtsramme, der bruges til at opbygge statsløse og RESTful HTTP-tjenester. RESTful services er lette, statsløse, klient-serverbaserede, cachbare tjenester, der er baseret på ressourcebegrebet. REST er en arkitektonisk stil - et sæt begrænsninger, der bruges til at implementere statsløse tjenester. Det er et arkitektonisk paradigme, der bruges til at skabe genanvendelige, skalerbare tjenester.

Repræsentation af en ressource i det ønskede format er et interessant emne, da du måske ofte vil forbruge dine tjenester fra forskellige typer enheder. Indholdsforhandling er et af de vigtigste begreber i Web API. Selvom det er et relativt simpelt koncept, er der mange misforståelser og misforståelser omkring dette emne. Når du designer og implementerer RESTful-tjenester ved hjælp af Web API, skal du ofte beskæftige dig med indholdsforhandling.

Hvad er forhandlet indhold, og hvorfor er det vigtigt?

Indholdsforhandling kan defineres som processen med at inspicere strukturen i en indgående HTTP-anmodning for at bestemme den bedste repræsentation af en ressource blandt flere tilgængelige repræsentationer af den samme ressource. I det væsentlige er indholdsforhandling et koncept, der gør det muligt for den samme url at tjene det samme indhold i forskellige formater. Du kan drage fordel af indholdsforhandling for at vælge den foretrukne medietype.

I Web API udføres indholdsforhandling af runtime (på serversiden) for at bestemme mediatypeformateren, der skal bruges, baseret på at returnere svaret for en indgående anmodning fra klientsiden.

Indholdsforhandling er centreret om mediatype og mediatype-formatering. Mens førstnævnte henviser til værdien af ​​"indholdstype" -overskrift i HTTP-anmodning og HTTP-svar, bruges sidstnævnte til at konvertere .NET-typer til tilsvarende HTTP-data og omvendt. Bemærk, at mediatypeformatering i Web API er repræsenteret af en abstrakt klasse kaldet MediaTypeFormatter.

Web API-rammen leveres som standard med følgende formatere.

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

For at tilpasse indholdsforhandling i Web API er det vigtigste udvidelsespunkt, du bliver nødt til at drage fordel af, mediatypekortlægning. Bemærk, at Web API kommer med følgende mediatypetilknytninger som standard.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

For at opbygge din tilpassede medietypekortlægning skal du oprette en klasse, der udvider MediaTypeMapping som vist i kodestykket nedenfor.

offentlig klasse MediaTypeMapping: MediaTypeMapping

{

beskyttet tilsidesættelse dobbelt OnTryMatchMediaType (HttpResponseMessage svar)

     {

// Skriv din brugerdefinerede kode her

     }

}

Følgende kodestykke illustrerer, hvordan du kan hente navnene på alle understøttede formateringer i Web API ved at gentage samlingen HttpConfiguration.Formatters.

   [HttpGet]

offentlig liste GetAllFormatters ()

       {

Liste lstFormaters = ny liste ();

foreach (var formatter i dette. Configuration.Formatters)

           {

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

           }

returnere lstFormaters;

       }

Lad os nu undersøge, hvordan vi kan arbejde med indholdsforhandling for at vælge den formatering, vi ønsker, og hente indholdet i det format, vi har brug for. Overvej følgende enhedsklasse.

offentlig klasse CustomerDTO

   {

offentlig Int32 Id

{få; sæt; }

offentlig streng Fornavn

{få; sæt; }

offentlig streng Efternavn

{få; sæt; }

public string Adresse

{få; sæt; }

   }

Antag derefter, at du har en metode, der udfylder data i en liste af typen CustomerDTO og returnerer dem.

privat liste GetCustomerData ()

       {

Liste lstCustomers = ny liste ();

CustomerDTO-kunde = ny CustomerDTO ();

kunde.Id = 1;

customer.FirstName = "Joydip";

customer.LastName = "Kanjilal";

customer.Address = "Hyderabad, Indien";

lstCustomers.Add (kunde);

returnere lstKunder;

       }

Følgende Web API-metode viser, hvordan du kan returnere HttpResponseMessage som et svar fra din Web API-metode baseret på den tilgængelige tilgængelige forhandlingsmekanisme for indhold.

[HttpGet]

offentlige HttpResponseMessage GetCustomers ()

       {

Liste lstCustomers = GetCustomerData ();

IContentNegotiator forhandler = Configuration.Services.GetContentNegotiator ();

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

returner nyt HttpResponseMessage ()

           {

Indhold = nyt ObjectContent(lstKunder, resultat.Formater, resultat.Medietype.Medietype)

         };

       }

Hvis du bruger en bestemt formater, der er tilgængelig i formatersamlingen, vil du muligvis omskrive den samme metode som vist i kodestykket nedenfor.

[HttpGet]

offentlige HttpResponseMessage GetCustomers ()

       {

Liste lstCustomers = GetCustomerData ();

returner nyt HttpResponseMessage ()

           {

Indhold = nyt ObjectContent(lstCustomers, Configuration.Formatters [1])

           };

      }

Okay; men hvordan bygger man så sin egen brugerdefinerede formatering? For at oprette en brugerdefineret mediatype-formatering skal du oprette en klasse, der udvider MediaTypeFormatter-abstraktklassen. Du skal derefter skrive din brugerdefinerede kode inde i klassen, du oprettede for at tilsidesætte metoderne i MediaTypeFormatter abstrakte basisklasse.

offentlig klasse CustomMediaTypeFormatter: MediaTypeFormatter

   {

offentlig tilsidesættelse af bool CanReadType (type type)

       {

smid ny NotImplementedException ();

       }

offentlig tilsidesættelse af bool CanWriteType (type type)

       {

smid ny NotImplementedException ();

       }

   }

Når din brugerdefinerede formater er på plads, kan du nemt tilføje den til formatersamlingen:

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