Media Type (หรือ MIME Type) ระบุรูปแบบของข้อมูล ใน HTTP Media Types ใช้บอกรูปแบบของ Message Body Media Type ประกอบด้วยสตริงสองส่วน: Type และ Subtype เช่น
- text/html
- image/png
- application/json
เมื่อ HTTP Message มี Entity-body Header Content-Type จะระบุรูปแบบของ Message Body บอกให้ฝั่งรับรู้วิธี Parse เนื้อหา
เมื่อ Client ส่ง Request สามารถใส่ Header Accept ได้ Header Accept บอก Server ว่า Client ต้องการ Media Type อะไร
Accept: text/html, application/xhtml+xml, application/xml
Media Type กำหนดว่า Web API จะ Serialize และ Deserialize HTTP Message Body อย่างไร Web API มี Built-in Support สำหรับ XML, JSON, BSON, และ Form-urlencoded Data และสามารถรองรับ Media Type เพิ่มเติมได้โดยการเขียน Media Formatter
MediaTypeFormatter เป็น Abstract Class ที่ JsonMediaTypeFormatter และ XmlMediaTypeFormatter สืบทอดมา JsonMediaTypeFormatter จัดการ JSON และ XmlMediaTypeFormatter จัดการ XML Media Types ถูกระบุในเมธอด Register ของคลาส WebApiConfig
ตัวอย่าง: บังคับให้ส่งคืน JSON เท่านั้น
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.MapHttpAttributeRoutes();
// ลบ XmlFormatter ออก - จะส่งคืน JSON เสมอ
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
โค้ดด้านบนลบ XmlFormatter ออก บังคับให้ ASP.NET Web API ส่งคืน JSON เสมอ ไม่สนใจค่า Accept Header ใน Request ของ Client ใช้เทคนิคนี้เมื่อต้องการให้ Service รองรับเฉพาะ JSON
ตัวอย่าง: บังคับให้ส่งคืน XML เท่านั้น
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.MapHttpAttributeRoutes();
// ลบ JsonFormatter ออก - จะส่งคืน XML เสมอ
config.Formatters.Remove(config.Formatters.JsonFormatter);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
ตัวอย่าง: ส่งคืน JSON แทน XML เมื่อ Request มาจาก Browser
เมื่อ Request มาจาก Browser ไปยัง StudentController Response จะเป็น XML เพราะ Browser ส่ง Accept Headers เป็น text/html โดยค่าเริ่มต้น
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.MapHttpAttributeRoutes();
// เพิ่ม text/html เข้าไปใน SupportedMediaTypes ของ JsonFormatter
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(
new MediaTypeHeaderValue("text/html")
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
ตอนนี้ Response จะเป็น JSON แม้ Request จะมาจาก Browser (Accept: text/html)
การเพิ่ม Custom Media Formatter
public class CsvMediaTypeFormatter : BufferedMediaTypeFormatter {
public CsvMediaTypeFormatter() {
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
}
public override bool CanReadType(Type type) => true;
public override bool CanWriteType(Type type) => true;
public override object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) {
// Parse CSV logic
}
public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content) {
// Write CSV logic
}
}
// ลงทะเบียนใน WebApiConfig
config.Formatters.Add(new CsvMediaTypeFormatter());