Programmering

Hvordan jobbe med innholdsforhandlinger i Web API

ASP.Net Web API er et lett rammeverk som brukes til å bygge statsløse og RESTful HTTP-tjenester. RESTful-tjenester er lette, statsløse, klientserverbaserte, cacheable tjenester som er basert på ressursbegrepet. REST er en arkitektonisk stil - et sett med begrensninger som brukes til å implementere statsløse tjenester. Det er et arkitektonisk paradigme som brukes til å skape gjenbrukbare, skalerbare tjenester.

Representasjon av en ressurs i det formatet du etterspør er et interessant tema, siden du ofte vil konsumere tjenestene dine fra forskjellige typer enheter. Innholdsforhandling er et av de viktigste konseptene i Web API. Selv om det er et relativt enkelt konsept, er det mange misforståelser og misforståelser rundt dette emnet. Når du designer og implementerer RESTful-tjenester ved hjelp av Web API, trenger du ofte å håndtere innholdsforhandlinger.

Hva er forhandlet innhold og hvorfor er det viktig?

Innholdsforhandlinger kan defineres som prosessen med å inspisere strukturen til en innkommende HTTP-forespørsel for å bestemme den beste representasjonen av en ressurs blant flere tilgjengelige representasjoner av samme ressurs. I hovedsak er innholdsforhandlinger et konsept som gjør at den samme nettadressen kan tjene det samme innholdet i forskjellige formater. Du kan dra nytte av innholdsforhandlinger for å velge ønsket medietype.

I Web API utføres innholdsforhandlinger av kjøretiden (på serversiden) for å bestemme medietypeformateringen som skal brukes basert på å returnere svaret for en innkommende forespørsel fra klientsiden.

Innholdsforhandlinger er sentrert om mediatype og mediatypeformatering. Mens førstnevnte refererer til verdien av "innholdstype" -hode i HTTP-forespørsel og HTTP-respons, brukes sistnevnte til å konvertere .NET-typer til tilsvarende HTTP-data og omvendt. Merk at mediatypeformatering i Web API er representert av en abstrakt klasse kalt MediaTypeFormatter.

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

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

For å tilpasse innholdsforhandlinger i Web API, er det viktigste utvidelsespunktet du trenger å dra nytte av, mediatypekartlegging. Merk at Web API kommer med følgende mediatypetilordninger som standard.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

For å bygge deg tilpasset mediatypekartlegging, må du opprette en klasse som utvider MediaTypeMapping som vist i kodebiten nedenfor.

offentlig klasse MediaTypeMapping: MediaTypeMapping

{

beskyttet overstyring dobbel OnTryMatchMediaType (HttpResponseMessage respons)

     {

// Skriv din tilpassede kode her

     }

}

Følgende kodebit illustrerer hvordan du kan hente navnene på alle støttede formatere i Web API ved å gjenta HttpConfiguration.Formatters-samlingen.

   [HttpGet]

offentlig liste GetAllFormatters ()

       {

Liste lstFormaters = ny liste ();

foreach (var formatter in this.Configuration.Formatters)

           {

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

           }

returnere første formater;

       }

La oss nå undersøke hvordan vi kan arbeide med innholdsforhandlinger for å velge formateringen vi ønsker og hente innholdet i det formatet vi trenger. Tenk på følgende enhetsklasse.

offentlig klasse CustomerDTO

   {

offentlig Int32 Id

{ få; sett; }

offentlig streng Fornavn

{ få; sett; }

offentlig streng Etternavn

{ få; sett; }

offentlig streng Adresse

{ få; sett; }

   }

Anta deretter at du har en metode som fyller ut data i en liste av typen CustomerDTO og returnerer den.

privat liste GetCustomerData ()

       {

Liste lstCustomers = ny liste ();

CustomerDTO-kunde = ny CustomerDTO ();

kunde.Id = 1;

customer.FirstName = "Joydip";

customer.LastName = "Kanjilal";

customer.Address = "Hyderabad, India";

lstCustomers.Add (kunde);

retur lstKunder;

       }

Den følgende Web API-metoden viser hvordan du kan returnere HttpResponseMessage som et svar fra Web API-metoden din, basert på standard tilgjengelig forhandlingsmekanisme.

[HttpGet]

offentlige HttpResponseMessage GetCustomers ()

       {

Liste lstCustomers = GetCustomerData ();

IContentNegotiator forhandler = Configuration.Services.GetContentNegotiator ();

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

returner nye HttpResponseMessage ()

           {

Innhold = nytt ObjectContent(lstKunder, resultat.Formater, resultat.MediaType.MediaType)

         };

       }

Hvis du skulle bruke en bestemt formater som er tilgjengelig i formatersamlingen, kan det være lurt å omskrive den samme metoden som vist i kodebiten nedenfor.

[HttpGet]

offentlige HttpResponseMessage GetCustomers ()

       {

Liste lstCustomers = GetCustomerData ();

returner nye HttpResponseMessage ()

           {

Innhold = nytt ObjectContent(lstCustomers, Configuration.Formatters [1])

           };

      }

Ok; men hvordan bygger du din egen tilpassede formater da? Vel, for å lage en tilpasset mediatypeformatering, bør du opprette en klasse som utvider MediaTypeFormatter-abstraktklassen. Deretter bør du skrive den egendefinerte koden i klassen du opprettet for å overstyre metodene til abstraktklassen MediaTypeFormatter.

offentlig klasse CustomMediaTypeFormatter: MediaTypeFormatter

   {

offentlig overstyring bool CanReadType (Type type)

       {

kaste nye NotImplementedException ();

       }

offentlig overstyring bool CanWriteType (Type type)

       {

kaste nye NotImplementedException ();

       }

   }

Når den tilpassede formateringen er på plass, kan du enkelt legge den til formatersamlingen:

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

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