Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีระบุ MIME Type ใน ASP.NET WebAPI C#

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());