Thương lượng nội dung là quá trình chọn đại diện tốt nhất cho một phản hồi nhất định khi có nhiều đại diện. Có nghĩa là, tùy thuộc vào giá trị tiêu đề Chấp nhận trong yêu cầu, máy chủ sẽ gửi phản hồi. Cơ chế chính để thương lượng nội dung trong HTTP là các tiêu đề yêu cầu này -
Chấp nhận - Loại phương tiện nào được chấp nhận cho phản hồi, chẳng hạn như "application / json", "application / xml" hoặc một loại phương tiện tùy chỉnh như "application / vnd.example + xml"
Bộ ký tự chấp nhận - Những bộ ký tự nào được chấp nhận, chẳng hạn như UTF-8 hoặc ISO 8859-1.
Chấp nhận mã hóa - Những mã hóa nội dung nào được chấp nhận, chẳng hạn như gzip.
Ngôn ngữ chấp nhận - Ngôn ngữ tự nhiên được ưu tiên, chẳng hạn như "en-us".
Máy chủ cũng có thể xem xét các phần khác của yêu cầu HTTP. Ví dụ:nếu therequest chứa tiêu đề X-Request-With, cho biết một yêu cầu AJAX, máy chủ có thể mặc định là JSON nếu không có tiêu đề Chấp nhận.
Trong thương lượng nội dung, đường ống nhận dịch vụ IContentNegotiator từ đối tượngHttpConfiguration. Nó cũng lấy danh sách các bộ định dạng phương tiện từ bộ sưu tậpHttpConfiguration.Formatters.
Tiếp theo, đường dẫn này gọi IContentNegotiator.Negotiate, chuyển đến -
- Loại đối tượng để tuần tự hóa
- Bộ sưu tập các trình định dạng phương tiện
- Yêu cầu HTTP
Phương thức Thương lượng trả về hai phần thông tin -
- Sử dụng định dạng nào
- Loại phương tiện cho phản hồi
Nếu không tìm thấy trình định dạng nào, phương thức Đàm phán trả về giá trị rỗng và máy khách nhận được lỗi HTTP 406 (Không thể chấp nhận).
Hãy để chúng tôi xem xét StudentController như bên dưới.
using DemoWebApplication.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace DemoWebApplication.Controllers{ public class StudentController : ApiController{ List<Student> students = new List<Student>{ new Student{ Id = 1, Name = "Mark" }, new Student{ Id = 2, Name = "John" } }; } }
Một trong những tiêu chuẩn của dịch vụ RESTful là máy khách phải có khả năng quyết định định dạng họ muốn phản hồi - XML, JSON, v.v. Một yêu cầu gửi đến máy chủ bao gồm tiêu đề Chấp nhận. Sử dụng tiêu đề Chấp nhận, ứng dụng khách có thể xác định định dạng cho phản hồi. Ví dụ
Accept: application/xml returns XML Accept: application/json returns JSON
Kết quả bên dưới cho thấy phản hồi là của XML khi chúng ta chuyển asapplication / XML của Accept Header.
Kết quả đầu ra bên dưới cho thấy phản hồi là của JSON khi chúng tôi chuyển asapplication / JSON của Accept Header.
Khi phản hồi đang được gửi đến máy khách ở định dạng được yêu cầu, hãy lưu ý rằng tiêu đề Loại nội dung của phản hồi được đặt thành giá trị thích hợp. Ví dụ:nếu máy khách đã yêu cầu ứng dụng / xml, máy chủ sẽ gửi dữ liệu ở định dạng XML và đồng thời đặt Content-Type =application / xml.
Chúng tôi cũng có thể chỉ định yếu tố chất lượng. Trong ví dụ bên dưới, xml có hệ số chất lượng cao hơn json, vì vậy máy chủ sử dụng trình định dạng XML và định dạng dữ liệu trong XML.application / xml; q =0.8, application / json; q =0.5