การเจรจาต่อรองเนื้อหาเป็นกระบวนการในการเลือกการนำเสนอที่ดีที่สุดสำหรับการตอบสนองที่กำหนด เมื่อมีการนำเสนอหลายรายการ หมายถึง ขึ้นอยู่กับค่าส่วนหัวยอมรับในคำขอ เซิร์ฟเวอร์ส่งการตอบกลับ กลไกหลักสำหรับการเจรจาเนื้อหาใน 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
