Cara bekerja dengan perundingan kandungan di Web API

ASP.Net Web API adalah kerangka ringan yang digunakan untuk membina perkhidmatan HTTP tanpa status dan RESTful. Perkhidmatan RESTful adalah perkhidmatan ringan, tanpa status, berasaskan pelayan pelanggan, boleh disimpan dalam cache yang berdasarkan konsep sumber. REST adalah gaya seni bina - sekumpulan kekangan yang digunakan untuk melaksanakan perkhidmatan tanpa status. Ini adalah paradigma seni bina yang digunakan untuk membuat perkhidmatan yang boleh digunakan semula dan berskala.

Perwakilan sumber dalam format yang diminta adalah topik yang menarik kerana anda mungkin sering ingin menggunakan perkhidmatan anda dari pelbagai jenis peranti. Perundingan kandungan adalah salah satu konsep yang paling penting dalam API Web. Walaupun konsepnya agak sederhana, terdapat banyak kesalahpahaman dan salah faham mengenai topik ini. Semasa merancang dan melaksanakan perkhidmatan RESTful menggunakan API Web, anda sering perlu berurusan dengan perundingan kandungan.

Apa kandungan yang dirundingkan dan mengapa itu penting?

Perundingan kandungan dapat didefinisikan sebagai proses memeriksa struktur permintaan HTTP yang masuk untuk menentukan perwakilan sumber yang terbaik dari antara banyak perwakilan yang tersedia dari sumber yang sama. Pada hakikatnya, perundingan kandungan adalah konsep yang membolehkan Url yang sama melayani kandungan yang sama dalam pelbagai format. Anda boleh memanfaatkan perundingan kandungan untuk memilih jenis media pilihan.

Dalam API Web, perundingan kandungan dilakukan pada waktu berjalan (di sisi pelayan) untuk menentukan format media jenis yang akan digunakan berdasarkan untuk mengembalikan respons untuk permintaan masuk dari pihak klien.

Perundingan kandungan berpusat pada jenis Media dan format media jenis. Sementara yang pertama merujuk pada nilai header "jenis-konten" dalam permintaan HTTP dan respons HTTP, yang terakhir digunakan untuk mengubah jenis .NET ke data HTTP yang sesuai dan sebaliknya. Perhatikan bahawa pemformat jenis media dalam Web API diwakili oleh kelas abstrak yang disebut MediaTypeFormatter.

Kerangka API Web dilengkapi dengan pemformat berikut secara lalai.

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

Untuk menyesuaikan perundingan kandungan dalam Web API, titik perpanjangan utama yang perlu anda manfaatkan adalah pemetaan jenis media. Perhatikan bahawa API Web dilengkapi dengan pemetaan jenis media berikut secara lalai.

  • Pemetaan QueryString
  • Pemetaan UriPathExtension
  • RequestHeaderMapping
  • Pemetaan Julat Media

Untuk membuat pemetaan jenis media tersuai, anda perlu membuat kelas yang memperluas Pemetaan Jenis Media seperti yang ditunjukkan dalam coretan kod di bawah.

public class MediaTypeMapping : MediaTypeMapping

{

   protected override double OnTryMatchMediaType(HttpResponseMessage response)

     {

                //Write your custom code here

     }

}

Coretan kod berikut menggambarkan bagaimana anda boleh mengambil nama semua formatters yang disokong dalam API Web dengan mengulangi koleksi HttpConfiguration.Formatters.

   [HttpGet]

       public List GetAllFormatters()

       {

           List lstFormaters = new List();

           foreach (var formatter in this.Configuration.Formatters)

           {

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

           }

           return lstFormaters;

       }

Sekarang mari kita terokai bagaimana kita dapat bekerja dengan perundingan kandungan untuk memilih pemformat yang kita mahukan dan mendapatkan semula kandungan dalam format yang kita perlukan. Pertimbangkan kelas entiti berikut.

public class CustomerDTO

   {

       public Int32 Id

       { get; set; }

       public string FirstName

       { get; set; }

       public string LastName

       { get; set; }

       public string Address

      { get; set; }

   }

Seterusnya, anggap anda mempunyai kaedah yang memasukkan data ke dalam senarai jenis CustomerDTO dan mengembalikannya.

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;

       }

Kaedah Web API berikut menunjukkan bagaimana anda dapat mengembalikan HttpResponseMessage sebagai tindak balas dari kaedah Web API anda berdasarkan mekanisme perundingan kandungan lalai yang tersedia.

[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)

         };

       }

Sekiranya anda menggunakan formatter tertentu yang tersedia dalam koleksi formatters, anda mungkin ingin menulis semula kaedah yang sama seperti yang ditunjukkan dalam coretan kod di bawah.

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           return new HttpResponseMessage()

           {

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

           };

      }

Okey; tetapi bagaimana anda membina formatter tersuai anda sendiri? Nah, untuk membuat pemformat jenis media tersuai, anda harus membuat kelas yang memanjangkan kelas abstrak MediaTypeFormatter. Anda kemudian harus menulis kod tersuai anda di dalam kelas yang anda buat untuk mengatasi kaedah kelas dasar abstrak MediaTypeFormatter.

public class CustomMediaTypeFormatter : MediaTypeFormatter

   {

       public override bool CanReadType(Type type)

       {

           throw new NotImplementedException();

       }

       public override bool CanWriteType(Type type)

       {

           throw new NotImplementedException();

       }

   }

Setelah formatter tersuai anda siap, anda boleh menambahkannya ke koleksi formatter dengan mudah:

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