Bagaimana bekerja dengan negosiasi konten di Web API

ASP.Net Web API adalah kerangka kerja ringan yang digunakan untuk membangun layanan HTTP tanpa kewarganegaraan dan tenang. Layanan yang tenang adalah layanan ringan, tanpa status, berbasis klien-server, dan dapat disimpan dalam cache yang didasarkan pada konsep sumber daya. REST adalah gaya arsitektur - serangkaian batasan yang digunakan untuk mengimplementasikan layanan stateless. Ini adalah paradigma arsitektur yang digunakan untuk membuat layanan yang dapat digunakan kembali dan berskala.

Representasi sumber daya dalam format yang diminta adalah topik yang menarik karena Anda mungkin sering ingin menggunakan layanan Anda dari berbagai jenis perangkat. Negosiasi konten adalah salah satu konsep terpenting dalam API Web. Meskipun konsepnya relatif sederhana, ada banyak kesalahpahaman dan kesalahpahaman seputar topik ini. Saat merancang dan mengimplementasikan layanan RESTful menggunakan Web API, Anda sering kali perlu berurusan dengan negosiasi konten.

Apa itu konten yang dinegosiasikan dan mengapa itu penting?

Negosiasi konten dapat didefinisikan sebagai proses pemeriksaan struktur permintaan HTTP yang masuk untuk menentukan representasi terbaik dari sumber daya dari beberapa representasi yang tersedia dari sumber yang sama. Intinya, negosiasi konten adalah konsep yang memungkinkan Url yang sama menyajikan konten yang sama dalam berbagai format. Anda dapat memanfaatkan negosiasi konten untuk memilih jenis media yang disukai.

Di Web API, negosiasi konten dilakukan oleh runtime (di sisi server) untuk menentukan formatter jenis media yang akan digunakan berdasarkan untuk mengembalikan respons untuk permintaan masuk dari sisi klien.

Negosiasi konten berpusat pada jenis Media dan formatter jenis Media. Sementara yang pertama mengacu pada nilai header "tipe konten" dalam permintaan HTTP dan respons HTTP, yang terakhir digunakan untuk mengonversi jenis .NET ke data HTTP yang sesuai dan sebaliknya. Perhatikan bahwa formatter tipe media di Web API diwakili oleh kelas abstrak yang disebut MediaTypeFormatter.

Kerangka kerja API Web hadir dengan format berikut secara default.

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

Untuk menyesuaikan negosiasi konten di Web API, titik perluasan utama yang perlu Anda manfaatkan, adalah pemetaan jenis media. Perhatikan bahwa API Web muncul dengan pemetaan jenis media berikut secara default.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

Untuk membuat pemetaan jenis media khusus, Anda perlu membuat kelas yang memperluas MediaTypeMapping seperti yang ditunjukkan pada cuplikan kode di bawah.

public class MediaTypeMapping : MediaTypeMapping

{

   protected override double OnTryMatchMediaType(HttpResponseMessage response)

     {

                //Write your custom code here

     }

}

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat mengambil nama dari semua pemformat yang didukung di Web API dengan mengulang 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 jelajahi bagaimana kita dapat bekerja dengan negosiasi konten untuk memilih formatter yang kita inginkan dan mengambil konten dalam format yang kita butuhkan. Pertimbangkan kelas entitas berikut.

public class CustomerDTO

   {

       public Int32 Id

       { get; set; }

       public string FirstName

       { get; set; }

       public string LastName

       { get; set; }

       public string Address

      { get; set; }

   }

Selanjutnya, asumsikan bahwa Anda memiliki metode yang mengisi data ke dalam daftar tipe 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;

       }

Metode API Web berikut menunjukkan bagaimana Anda bisa mengembalikan HttpResponseMessage sebagai respons dari metode API Web Anda berdasarkan mekanisme negosiasi konten default 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)

         };

       }

Jika Anda akan menggunakan pemformat tertentu yang tersedia dalam koleksi pemformat, Anda mungkin ingin menulis ulang metode yang sama seperti yang ditunjukkan pada cuplikan kode di bawah.

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           return new HttpResponseMessage()

           {

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

           };

      }

Baik; tapi bagaimana Anda membuat formatter kustom Anda sendiri? Nah, untuk membuat pemformat jenis media kustom, Anda harus membuat kelas yang memperluas kelas abstrak MediaTypeFormatter. Anda kemudian harus menulis kode kustom Anda di dalam kelas yang Anda buat untuk mengganti metode 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 pemformat kustom Anda ada, Anda dapat menambahkannya ke koleksi pemformat dengan mudah:

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