Kako raditi s pregovaranjem o sadržaju u web API-ju

ASP.Net Web API lagan je okvir koji se koristi za izgradnju HTTP usluga bez državljanstva i RESTful-a. Usluge RESTful su lagane, predmemorirane usluge zasnovane na klijentu i poslužitelju bez državljanstva i temelje se na konceptu resursa. REST je arhitektonski stil - skup ograničenja koja se koriste za provedbu usluga bez državljanstva. To je arhitektonska paradigma koja se koristi za stvaranje višekratnih, skalabilnih usluga.

Zastupljenost resursa u formatu za koji je zatražena zanimljiva je tema jer biste često željeli konzumirati svoje usluge s različitih vrsta uređaja. Pregovaranje o sadržaju jedan je od najvažnijih koncepata u web API-ju. Iako relativno jednostavan koncept, oko ove teme postoji mnogo zabluda i nesporazuma. Kada dizajnirate i implementirate RESTful usluge pomoću Web API-a, često biste se trebali baviti pregovaranjem o sadržaju.

Što je pregovarački sadržaj i zašto je važan?

Pregovaranje o sadržaju može se definirati kao postupak pregleda strukture dolaznog HTTP zahtjeva radi utvrđivanja najboljeg predstavljanja resursa između više dostupnih prikaza istog resursa. U osnovi, pregovaranje o sadržaju koncept je koji omogućuje istom URL-u da poslužuje isti sadržaj u različitim formatima. Možete iskoristiti pregovore o sadržaju za odabir željene vrste medija.

U Web API-ju pregovaranje o sadržaju izvodi se tijekom izvođenja (na strani poslužitelja) kako bi se utvrdilo oblikovanje medija tipa koje će se koristiti na temelju povratka odgovora na dolazni zahtjev s klijentske strane.

Pregovaranje o sadržaju usredotočeno je na oblikovanje medija i vrste medija. Dok se prvi odnosi na vrijednost zaglavlja "tipa sadržaja" u HTTP zahtjevu i HTTP odgovoru, drugi se koristi za pretvaranje .NET vrsta u odgovarajuće HTTP podatke i obrnuto. Imajte na umu da je format medija medija u Web API-u predstavljen apstraktnom klasom nazvanom MediaTypeFormatter.

Okvir Web API prema zadanim postavkama dolazi sa sljedećim oblikovačima.

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

Da biste prilagodili pregovaranje o sadržaju u web API-ju, glavna točka proširivosti koju biste trebali iskoristiti je mapiranje vrste medija. Imajte na umu da Web API prema zadanim postavkama dolazi sa sljedećim preslikavanjima vrsta medija.

  • QueryStringMapping
  • Kartiranje UriPathExtension
  • RequestHeaderMapping
  • MediaRangeMapping

Da biste izradili prilagođeno mapiranje vrste medija, morat ćete stvoriti klasu koja proširuje MediaTypeMapping kao što je prikazano u isječku koda u nastavku.

public class MediaTypeMapping : MediaTypeMapping

{

   protected override double OnTryMatchMediaType(HttpResponseMessage response)

     {

                //Write your custom code here

     }

}

Sljedeći isječak koda ilustrira kako možete dohvatiti imena svih podržanih formativača u Web API-u tako što ćete ponoviti kolekciju HttpConfiguration.Formatters.

   [HttpGet]

       public List GetAllFormatters()

       {

           List lstFormaters = new List();

           foreach (var formatter in this.Configuration.Formatters)

           {

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

           }

           return lstFormaters;

       }

Istražimo sada kako možemo raditi s pregovaranjem o sadržaju kako bismo odabrali oblikovač koji želimo i dohvatili sadržaj u potrebnom formatu. Razmotrite sljedeću klasu entiteta.

public class CustomerDTO

   {

       public Int32 Id

       { get; set; }

       public string FirstName

       { get; set; }

       public string LastName

       { get; set; }

       public string Address

      { get; set; }

   }

Dalje, pretpostavimo da imate metodu koja podatke popunjava na popis tipa CustomerDTO i vraća ih.

private List GetCustomerData()

       {

           List lstCustomers = new List();

           CustomerDTO customer = new CustomerDTO();

           customer.Id = 1;

           customer.FirstName = "Joydip";

           customer.LastName = "Kanjilal";

           customer.Address = "Hyderabad, India";

           lstCustomers.Add(customer);

           return lstCustomers;

       }

Sljedeća metoda web API-ja pokazuje kako možete vratiti HttpResponseMessage kao odgovor iz vaše metode Web API na temelju dostupnog zadanog mehanizma za pregovaranje o sadržaju.

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           IContentNegotiator negotiator = Configuration.Services.GetContentNegotiator();

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

           return new HttpResponseMessage()

           {

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

         };

       }

Ako biste koristili određeni program za oblikovanje dostupan u zbirci programa za oblikovanje, možda ćete htjeti ponovo napisati istu metodu kao što je prikazano u isječku koda u nastavku.

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           return new HttpResponseMessage()

           {

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

           };

      }

U redu; ali kako onda izraditi svoj vlastiti program za oblikovanje? Pa, da biste stvorili prilagođeni oblikovač medija, trebali biste stvoriti klasu koja proširuje abstraktnu klasu MediaTypeFormatter. Tada biste trebali napisati svoj prilagođeni kôd unutar klase koju ste kreirali kako biste nadjačali metode sažete osnovne klase MediaTypeFormatter.

public class CustomMediaTypeFormatter : MediaTypeFormatter

   {

       public override bool CanReadType(Type type)

       {

           throw new NotImplementedException();

       }

       public override bool CanWriteType(Type type)

       {

           throw new NotImplementedException();

       }

   }

Jednom kada je vaše prilagođeno oblikovanje na mjestu, možete ga lako dodati u kolekciju oblikovača:

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