Trình định dạng loại phương tiện trong API Web với các ví dụ
Trong bài viết này, tôi sẽ thảo luận về Trình định dạng loại phương tiện trong API Web với các ví dụ. Vui lòng đọc bài viết trước của chúng tôi trước khi tiếp tục bài viết này, nơi chúng tôi đã thảo luận về Đàm phán nội dung trong API Web . Là một phần của bài viết này, chúng ta sẽ thảo luận về các khái niệm quan trọng sau đây.
- MediaTypeFormatters trong API Web là gì?
- Làm cách nào để truy xuất Trình định dạng loại phương tiện tích hợp trong API Web?
- Ví dụ về Trình định dạng loại phương tiện.
- Hiểu các lớp MediaTypeFormatter trong API Web?
- Làm cách nào để trả về dữ liệu ở định dạng JSON từ Dịch vụ API Web bất kể giá trị tiêu đề Chấp nhận?
- Làm cách nào để trả về dữ liệu ở định dạng XML từ Dịch vụ API Web bất kể giá trị tiêu đề Chấp nhận?
- Trả về JSON thay vì XML từ Dịch vụ API Web ASP.NET khi yêu cầu được thực hiện từ trình duyệt?
Lưu ý: Chúng tôi sẽ làm việc với cùng một ví dụ mà chúng tôi đã bắt đầu trong bài viết ASP.NET Web API bằng cách sử dụng SQL Server . Vì vậy, vui lòng đọc bài viết đó trước khi tiếp tục bài viết này.
MediaTypeFormatters trong API Web là gì?
Như chúng ta đã thấy trong bài viết trước rằng API Web xử lý dữ liệu định dạng JSON và XML dựa trên các tiêu đề Chấp nhận và Kiểu nội dung (Accept and Content-Type headers). Nhưng, câu hỏi quan trọng là làm thế nào để nó xử lý các định dạng khác nhau? Câu trả lời là: Bằng cách sử dụng các trình định dạng Media-Type .
Các trình định dạng loại Phương tiện là các lớp chịu trách nhiệm tuần tự hóa dữ liệu yêu cầu / phản hồi để Khung API Web có thể hiểu định dạng dữ liệu yêu cầu và cũng gửi dữ liệu theo định dạng mà khách hàng mong đợi. ASP.NET Web API bao gồm các trình định dạng loại phương tiện tích hợp sau.
Làm cách nào để truy xuất các trình định dạng loại phương tiện tích hợp trong API Web ASP.NET?
Khung API Web bao gồm các lớp định dạng loại phương tiện được liệt kê ở trên theo mặc định. Tuy nhiên, bạn cũng có thể thêm, xóa hoặc thay đổi thứ tự của trình định dạng. Ví dụ sau đây cho thấy một phương thức HTTP Get trả về tất cả các lớp định dạng dựng sẵn.
- public IEnumerable<string> Get()
- {
- IList<string> formatters = new List<string>();
- foreach (var item in GlobalConfiguration.Configuration.Formatters)
- {
- formatters.Add(item.ToString());
- }
- return formatters.AsEnumerable<string>();
- }
Trong ví dụ trên, GlobalConfiguration.Configuration.Formatters trả về MediaTypeFormatterCollection bao gồm tất cả các lớp định dạng. Ví dụ trên trả về tên của tất cả các lớp định dạng như trong hình bên dưới.
Ngoài ra, lớp MediaTypeFormatterCollection xác định các thuộc tính tiện lợi cung cấp quyền truy cập trực tiếp vào ba trong số bốn trình định dạng loại phương tiện tích hợp. Ví dụ sau đây cho thấy việc truy xuất các trình định dạng loại phương tiện bằng các thuộc tính của MediaTypeFormatterCollection.
- public IEnumerable<string> Get()
- {
- IList<string> formatters = new List<string>();
- formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter.GetType().FullName);
- formatters.Add(GlobalConfiguration.Configuration.Formatters.XmlFormatter.GetType().FullName);
- formatters.Add(GlobalConfiguration.Configuration.Formatters.FormUrlEncodedFormatter.GetType().FullName);
- return formatters.AsEnumerable<string>();
- }
Ví dụ trên trả về phản hồi sau cho trình duyệt.
Hiểu một mẫu định dạng phương tiện truyền thông với một ví dụ
Từ phối cảnh API Web ASP.NET, tuần tự hóa là quá trình dịch loại .NET Common Language Runtime (CLR) sang định dạng có thể được truyền qua HTTP. Định dạng mặc định trong API Web có thể là JSON hoặc XML. Trình định dạng loại phương tiện là đối tượng của loại MediaTypeFormatter , thực hiện tuần tự hóa trong đường ống dẫn API Web ASP.NET.
Hãy xem xét một phương thức hành động đơn giản xử lý GET trong ApiControll:
- public Employee Get(int id)
- {
- using (EmployeeDBContext dbContext = new EmployeeDBContext())
- {
- return dbContext.Employees.FirstOrDefault(e => e.ID == id);
- }
- }
Phương thức trên trả về một đối tượng CLR thuộc kiểu Nhân viên. Để trả lại dữ liệu chứa trong đối tượng Nhân viên cho khách hàng, đối tượng Nhân viên cần phải được tuần tự hóa. Việc tuần tự hóa trong ứng dụng ASP.NET Web API thường được thực hiện bởi MediaTypeFormatter .
Các trình định dạng kiểu phương tiện API Web tuần tự hóa đối tượng sẽ được trả về từ phương thức hành động thành JSON hoặc XML. Khi Trình định dạng loại phương tiện API Web tuần tự hóa dữ liệu thành XML hoặc JSON, thì các dữ liệu JSON hoặc XML này được ghi vào phần thân thông điệp phản hồi.
Các trình định dạng loại phương tiện API Web sắp xếp tuần tự đối tượng vào JSON và XML lần lượt là JsonMediaTypeFormatter và XmlMediaTypeFormatter. Cả hai lớp đều xuất phát từ lớp MediaTypeFormatter. Quá trình mà MediaTypeFormatter được chọn được gọi là đàm phán nội dung mà chúng ta đã thảo luận chi tiết trong bài viết trước.
API WebType MediaTypeFormatter là gì?
WebType MediaTypeFormatter là một lớp trừu tượng mà từ đó các lớp JsonMediaTypeFormatter và XmlMediaTypeFormatter được kế thừa. JsonMediaTypeFormatter xử lý yêu cầu và phản hồi JSON trong đó XmlMediaTypeFormatter xử lý yêu cầu và phản hồi XML.
Một tài nguyên có thể có một hoặc nhiều đại diện. Khi chúng tôi đưa ra yêu cầu GET để truy xuất tài nguyên, chẳng hạn như nhân viên có ID 1, thông báo phản hồi chứa đại diện của tài nguyên, ví dụ, bất kỳ giá trị nào mà hành động cụ thể trả về. API Web cho biết cách tài nguyên được thể hiện trong phản hồi thông qua tiêu đề phản hồi Kiểu nội dung. Tiêu đề yêu cầu Chấp nhận có thể được sử dụng bởi một khách hàng để chỉ ra tập hợp các biểu diễn ưa thích cho tài nguyên trong phản hồi.
Theo mặc định, khung API Web hỗ trợ hai loại phương tiện: JSON và XML. Khi bạn đưa ra yêu cầu với Accept: application / json , thì thông báo phản hồi sẽ là JSON và Kiểu nội dung sẽ được đặt thành application / json . Tương tự, nếu bạn đưa ra yêu cầu với Accept: application / xml , thì thông báo phản hồi sẽ là XML và Kiểu nội dung sẽ được đặt thành application / xml .
Bạn cũng có thể chỉ định một giá trị chất lượng cho biết sở thích tương đối. Phạm vi là 0 mộc1, với 0 là không thể chấp nhận và 1 là ưu tiên nhất. Giá trị mặc định là 1. Ví dụ, hãy xem xét tiêu đề bên dưới
Accept: application/json; q=0.8, application/xml;q=0.9
Ở đây, thông báo phản hồi sẽ ở định dạng XML vì ứng dụng / xml có giá trị chất lượng là 0,9, cao hơn giá trị chất lượng là 0,8 được chỉ định cho ứng dụng / json .
Làm cách nào để trả về dữ liệu ở định dạng JSON từ Dịch vụ API Web bất kể giá trị tiêu đề Chấp nhận?
Bao gồm dòng sau trong phương thức Đăng ký () của tệp WebApiConfig.cs trong thư mục App_Start. Dòng mã này loại bỏ hoàn toàn XmlFormatter, điều này buộc API Web ASP.NET luôn trả về JSON bất kể giá trị tiêu đề Chấp nhận trong yêu cầu của máy khách. Sử dụng kỹ thuật này khi bạn muốn dịch vụ của bạn chỉ hỗ trợ JSON chứ không phải XML.
config.Formatters.Remove (config.Formatters.XmlFormatter); Với thay đổi này, bất kể giá trị tiêu đề Chấp nhận (application / xml hoặc application / json), dịch vụ API Web sẽ luôn trả về JSON.
Làm cách nào để trả về dữ liệu ở định dạng XML từ Dịch vụ API Web bất kể giá trị tiêu đề Chấp nhận?
Bao gồm dòng sau trong phương thức Đăng ký () của tệp WebApiConfig.cs trong thư mục App_Start. Dòng mã này loại bỏ hoàn toàn JsonFormatter, điều này buộc API Web ASP.NET luôn trả về XML bất kể giá trị tiêu đề Chấp nhận trong yêu cầu của máy khách. Sử dụng kỹ thuật này khi bạn muốn dịch vụ của mình chỉ hỗ trợ XML chứ không phải JSON.
config.Formatters.Remove (config.Formatters.JsonFormatter); Với thay đổi này, bất kể giá trị tiêu đề Chấp nhận (application / xml hoặc application / json), dịch vụ API Web sẽ luôn trả về XML.
Làm cách nào để trả về JSON thay vì XML từ Dịch vụ API Web ASP.NET khi yêu cầu được thực hiện từ trình duyệt?
Vì vậy, đây là những gì chúng tôi muốn dịch vụ làm
- Khi một yêu cầu được đưa ra từ trình duyệt, dịch vụ API web sẽ trả về JSON thay vì XML.
- Khi một yêu cầu được đưa ra từ một công cụ như fiddler, giá trị tiêu đề Chấp nhận phải được tôn trọng. Điều này có nghĩa là nếu tiêu đề Chấp nhận được đặt thành application / xml, dịch vụ sẽ trả về XML và nếu nó được đặt thành application / JSON, dịch vụ sẽ trả về JSON.
Có 2 cách để đạt được điều này
Cách tiếp cận 1: Bao gồm dòng sau trong phương thức Đăng ký () của tệp WebApiConfig.cs trong thư mục App_Start . Điều này báo cho ASP.NET Web API sử dụng JsonFormatter khi yêu cầu được tạo cho văn bản / html, đây là mặc định cho hầu hết các trình duyệt. Vấn đề với cách tiếp cận này là tiêu đề Kiểu nội dung của phản hồi được đặt thành văn bản / html gây hiểu nhầm.
config.Formatters.JsonFormatter.SupportedMediaTypes .Add (new MediaTypeHeaderValue (văn bản / html html));
Cách tiếp cận 2: Bao gồm lớp sau trong tệp WebApiConfig.cs trong thư mục App_Start.
- using System;
- using System.Net.Http.Formatting;
- using System.Net.Http.Headers;
- public class CustomJsonFormatter : JsonMediaTypeFormatter
- {
- public CustomJsonFormatter()
- {
- this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
- }
- public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
- {
- base.SetDefaultContentHeaders(type, headers, mediaType);
- headers.ContentType = new MediaTypeHeaderValue("application/json");
- }
- }
Đăng ký định dạng tùy chỉnh.
Đặt dòng sau vào phương thức Đăng ký () của tệp WebApiConfig.cs trong thư mục App_Start .
config.Formatters.Add (new CustomJsonFormatter ());
Với 2 thay đổi này, khi yêu cầu được đưa ra từ trình duyệt, chúng tôi sẽ nhận được dữ liệu được định dạng JSON và tiêu đề Kiểu nội dung của phản hồi cũng được đặt thành application / json. Nếu chúng tôi đang sử dụng các công cụ như Fiddler và nếu chúng tôi đặt tiêu đề Chấp nhận thành application / xml, chúng tôi vẫn sẽ nhận được dữ liệu được định dạng XML.
Trong bài viết tiếp theo, tôi sẽ thảo luận về cách thực hiện CRUD Operations trong Web API bằng một ví dụ. Ở đây, trong bài viết này, tôi cố gắng giải thích từng bước Media Type Formatter trong API Web bằng một ví dụ đơn giản.
Đăng nhận xét