การเจรจาต่อรองเนื้อหาเป็นกระบวนการในการเลือกการนำเสนอที่ดีที่สุดสำหรับการตอบสนองที่กำหนด เมื่อมีการนำเสนอหลายรายการ หมายถึง ขึ้นอยู่กับค่าส่วนหัวยอมรับในคำขอ เซิร์ฟเวอร์ส่งการตอบกลับ กลไกหลักสำหรับการเจรจาเนื้อหาใน HTTP คือส่วนหัวของคำขอเหล่านี้ -
ยอมรับ − สื่อประเภทใดที่ยอมรับได้สำหรับการตอบกลับ เช่น "application/json" "application/xml" หรือประเภทสื่อที่กำหนดเอง เช่น "application/vnd.example+xml"
ยอมรับ-ชุดอักขระ − ชุดอักขระใดบ้างที่ยอมรับได้ เช่น UTF-8 หรือ ISO 8859-1
ยอมรับการเข้ารหัส − การเข้ารหัสเนื้อหาใดที่ยอมรับได้ เช่น gzip
ยอมรับ-ภาษา − ภาษาธรรมชาติที่ต้องการ เช่น "en-us"
เซิร์ฟเวอร์สามารถดูส่วนอื่นๆ ของคำขอ HTTP ได้ ตัวอย่างเช่น หากคำขอมีส่วนหัว X-Requested-With ซึ่งระบุคำขอ AJAX เซิร์ฟเวอร์อาจมีค่าเริ่มต้นเป็น JSON หากไม่มีส่วนหัวที่ยอมรับ
ในการเจรจาเนื้อหา ไปป์ไลน์ได้รับบริการ IContentNegotiator จากอ็อบเจ็กต์ HttpConfiguration นอกจากนี้ยังรับรายการตัวจัดรูปแบบสื่อจากคอลเลกชัน HttpConfiguration.Formatters
ถัดไป ไปป์ไลน์เรียก IContentNegotiator.Negotiate ผ่าน -
- ประเภทของออบเจ็กต์ที่จะเรียงลำดับ
- คอลเลกชันของตัวจัดรูปแบบสื่อ
- คำขอ HTTP
วิธีการเจรจาจะส่งคืนข้อมูลสองส่วน -
- รูปแบบใดที่จะใช้
- ประเภทของสื่อสำหรับการตอบกลับ
หากไม่พบตัวจัดรูปแบบ เมธอด Negotiate จะคืนค่า null และไคลเอ็นต์ได้รับข้อผิดพลาด HTTP 406 (ไม่เป็นที่ยอมรับ)
ให้เราพิจารณา StudentController ด้านล่าง
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" } }; } }
หนึ่งในมาตรฐานของบริการ RESTful คือ ไคลเอ็นต์ควรมีความสามารถในการตัดสินใจว่าต้องการตอบกลับรูปแบบใด - XML, JSON เป็นต้น คำขอที่ส่งไปยังเซิร์ฟเวอร์จะมีส่วนหัวที่ยอมรับ การใช้ส่วนหัว Accept ลูกค้าสามารถระบุรูปแบบการตอบกลับได้ ตัวอย่างเช่น
Accept: application/xml returns XML Accept: application/json returns JSON
ผลลัพธ์ด้านล่างแสดงการตอบสนองเป็น XML เมื่อเราส่ง Accept Header asapplication/XML
ผลลัพธ์ด้านล่างแสดงการตอบสนองของ JSON เมื่อเราส่ง Accept Header asapplication/JSON
เมื่อการตอบกลับถูกส่งไปยังไคลเอนต์ในรูปแบบที่ร้องขอ โปรดสังเกตว่าส่วนหัวของประเภทเนื้อหาของการตอบกลับถูกตั้งค่าเป็นค่าที่เหมาะสม ตัวอย่างเช่น หากไคลเอ็นต์ร้องขอ application/xml เซิร์ฟเวอร์จะส่งข้อมูลในรูปแบบ XML และตั้งค่า Content-Type=application/xml ด้วย
นอกจากนี้เรายังสามารถระบุปัจจัยด้านคุณภาพ ในตัวอย่างด้านล่าง xml มีปัจจัยด้านคุณภาพที่สูงกว่า json ดังนั้นเซิร์ฟเวอร์จึงใช้ตัวจัดรูปแบบ XML และจัดรูปแบบข้อมูลใน XML.application/xml;q=0.8,application/json;q=0.5