Ohjelmointi

Kuinka toimia sisältöneuvottelujen kanssa Web-sovellusliittymässä

ASP.Net Web API on kevyt kehys, jota käytetään valtiottomien ja RESTful HTTP-palvelujen rakentamiseen. RESTful-palvelut ovat kevyitä, valtiottomia, asiakas-palvelin-pohjaisia, välimuistipalveluja, jotka perustuvat resurssien käsitteeseen. REST on arkkitehtoninen tyyli - joukko rajoituksia, joita käytetään kansalaisuudettomien palvelujen toteuttamiseen. Se on arkkitehtoninen paradigma, jota käytetään uudelleenkäytettävien, skaalautuvien palvelujen luomiseen.

Resurssin esittäminen haetussa muodossa on mielenkiintoinen aihe, koska saatat haluta usein käyttää palveluitasi erityyppisistä laitteista. Sisältöneuvottelut ovat yksi tärkeimmistä käsitteistä Web-sovellusliittymässä. Vaikka aihe on suhteellisen yksinkertainen, tämän aiheen ympärillä on monia väärinkäsityksiä ja väärinkäsityksiä. Kun suunnittelet ja toteutat RESTful-palveluja Web-sovellusliittymän avulla, sinun on usein käsiteltävä sisältöneuvotteluja.

Mikä on neuvoteltu sisältö ja miksi se on tärkeää?

Sisältöneuvottelu voidaan määritellä saapuvan HTTP-pyynnön rakenteen tarkastusprosessiksi resurssin parhaan esityksen määrittämiseksi saman resurssin useiden käytettävissä olevien esitysten joukosta. Pohjimmiltaan sisältöneuvottelut ovat käsite, jonka avulla sama URL-osoite voi palvella samaa sisältöä eri muodoissa. Voit hyödyntää sisältöneuvotteluja valitaksesi haluamasi mediatyypin.

Web-sovellusliittymässä suoritusaika (palvelinpuolella) suorittaa sisällönneuvottelut määrittääkseen käytettävän mediatyypin muotoilijan palauttamaan saapuvan pyynnön vastauksen asiakaspuolelta.

Sisältöneuvotteluissa keskitytään mediatyyppiin ja mediatyypin muotoiluun. Ensin mainittu viittaa "content-type" -otsikon arvoon HTTP-pyynnössä ja HTTP-vastauksessa, jälkimmäistä käytetään .NET-tyyppien muuntamiseen vastaaviksi HTTP-tiedoiksi ja päinvastoin. Huomaa, että Web-sovellusliittymän mediatyypin muotoilijaa edustaa abstrakti luokka nimeltä MediaTypeFormatter.

Web-sovellusliittymäkehyksen mukana toimitetaan oletusarvoisesti seuraavat muotoilijat.

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

Sisältöneuvottelujen mukauttaminen Web-sovellusliittymässä on tärkein laajennuskohta, jota sinun pitäisi hyödyntää, mediatyyppikartoitus. Huomaa, että Web-sovellusliittymä toimittaa oletusarvoisesti seuraavat mediatyyppikartoitukset.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

Mukautetun mediatyyppikartoituksen luomiseksi sinun on luotava luokka, joka laajentaa MediaTypeMapping-ohjelmaa alla olevan koodinpätkän mukaisesti.

public class MediaTypeMapping: MediaTypeMapping

{

suojattu ohittaa kaksois-OnTryMatchMediaType (HttpResponseMessage vastaus)

     {

// Kirjoita mukautettu koodi tähän

     }

}

Seuraava koodinpätkä kuvaa, kuinka voit hakea kaikkien tuettujen muotoilijoiden nimet Web-sovellusliittymässä iteroimalla HttpConfiguration.Formatters-kokoelman.

   [HttpGet]

julkinen luettelo GetAllFormatters ()

       {

Lista lstFormaters = uusi Lista ();

foreach (var muotoilija tässä. kokoonpano. muotoilee)

           {

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

           }

paluu lstFormaters;

       }

Tutkitaan nyt, miten voimme työskennellä sisällönneuvottelujen avulla haluamasi muotoilijan valitsemiseksi ja sisällön noutamiseksi tarvitsemassamme muodossa. Harkitse seuraavaa kokonaisuusluokkaa.

julkisen luokan asiakasDTO

   {

public Int32 Id

{ saada; aseta; }

julkinen merkkijono Etunimi

{ saada; aseta; }

julkinen merkkijono Sukunimi

{ saada; aseta; }

julkinen merkkijono Osoite

{ saada; aseta; }

   }

Oletetaan seuraavaksi, että sinulla on menetelmä, joka täyttää tiedot CustomerDTO-tyyppiseen luetteloon ja palauttaa sen.

yksityinen luettelo GetCustomerData ()

       {

Lista lstCustomers = uusi Lista ();

CustomerDTO asiakas = uusi asiakasDTO ();

customer.Id = 1;

customer.FirstName = "Joydip";

customer.LastName = "Kanjilal";

asiakas.osoite = "Hyderabad, Intia";

lstCustomers.Add (asiakas);

paluu asiakkaille;

       }

Seuraava Web-sovellusliittymämenetelmä näyttää, kuinka voit palauttaa HttpResponseMessage-vastauksen Web-sovellusliittymämenetelmästä käytettävissä olevan oletussisällönneuvottelumekanismin perusteella.

[HttpGet]

public HttpResponseMessage GetCustomers ()

       {

Luettelo lstCustomers = GetCustomerData ();

IContentNegotiator neuvottelija = Configuration.Services.GetContentNegotiator ();

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

palauta uusi HttpResponseMessage ()

           {

Sisältö = uusi ObjectContent(lstCustomers, result.Formatter, result.MediaType.MediaType)

         };

       }

Jos haluat käyttää tiettyä muotoilijaa, joka on käytettävissä muotoilijoiden kokoelmassa, kannattaa ehkä kirjoittaa sama menetelmä kuin alla olevassa koodinpätkässä.

[HttpGet]

public HttpResponseMessage GetCustomers ()

       {

Luettelo lstCustomers = GetCustomerData ();

palauta uusi HttpResponseMessage ()

           {

Sisältö = uusi ObjectContent(lstCustomers, Configuration.Formatters [1])

           };

      }

Ok; mutta miten sitten rakennat oman mukautetun muotoilijan? No, mukautetun mediatyypin muotoilijan luomiseksi sinun on luotava luokka, joka laajentaa MediaTypeFormatter-abstraktiluokkaa. Sinun tulisi sitten kirjoittaa mukautettu koodi luomasi luokkaan ohittamaan abstraktin MediaTypeFormatter-perusluokan menetelmät.

public class CustomMediaTypeFormatter: MediaTypeFormatter

   {

public override bool CanReadType (tyypin tyyppi)

       {

heittää uusi NotImplementedException ();

       }

public override bool CanWriteType (tyypin tyyppi)

       {

heittää uusi NotImplementedException ();

       }

   }

Kun mukautettu muotoilija on paikallaan, voit lisätä sen helposti muotoilijoiden kokoelmaan:

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