Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Cách chỉ định MIME type trong ASP.NET WebAPI C#

Media type, còn gọi là MIME type, xác định định dạng của một dữ liệu. Trong HTTP, media types mô tả định dạng của message body. Media type bao gồm hai chuỗi: type và subtype. Ví dụ:

  • text/html
  • image/png
  • application/json

Khi HTTP message chứa entity-body, header Content-Type chỉ định định dạng của message body. Điều này cho receiver biết cách parse nội dung message body.

Khi client gửi request message, nó có thể bao gồm header Accept. Header Accept nói với server media type(s) mà client muốn từ server.

Accept: text/html,application/xhtml+xml,application/xml

Media type quyết định cách Web API serialize và deserialize HTTP message body. Web API có built-in support cho XML, JSON, BSON, và form-urlencoded data, và bạn có thể support thêm media types bằng cách viết media formatter.

MediaTypeFormatter là abstract class mà JsonMediaTypeFormatter và XmlMediaTypeFormatter kế thừa từ. JsonMediaTypeFormatter xử lý JSON và XmlMediaTypeFormatter xử lý XML. Media types được chỉ định trong phương thức Register của class WebApiConfig.

Student Controller

Ví dụ

using DemoWebApplication.Models; 
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" } 
        }; 
        
        public IEnumerable<Student> Get() { 
            return students; 
        } 
    } 
}

Chỉ trả về JSON (bỏ qua Accept header)

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
        config.MapHttpAttributeRoutes(); 
        // Xóa XML formatter - chỉ trả về JSON
        config.Formatters.Remove(config.Formatters.XmlFormatter); 
        
        config.Routes.MapHttpRoute( 
            name: "DefaultApi", 
            routeTemplate: "api/{controller}/{id}", 
            defaults: new { id = RouteParameter.Optional } 
        ); 
    } 
}

Sử dụng code trên, chúng ta đã xóa XmlFormatter ép ASP.NET Web API luôn trả về JSON bất kể giá trị Accept header trong client request. Dùng kỹ thuật này khi bạn muốn service chỉ support JSON không phải XML.

Chỉ trả về XML (bỏ qua Accept header)

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
        config.MapHttpAttributeRoutes(); 
        // Xóa JSON formatter - chỉ trả về XML
        config.Formatters.Remove(config.Formatters.JsonFormatter); 
        
        config.Routes.MapHttpRoute( 
            name: "DefaultApi", 
            routeTemplate: "api/{controller}/{id}", 
            defaults: new { id = RouteParameter.Optional } 
        ); 
    } 
}

Trả về JSON thay vì XML khi request từ Browser

Khi request từ browser đến StudentController, response sẽ ở format XML. Điều này vì browser gửi accept headers mặc định là text/html.

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
        config.MapHttpAttributeRoutes(); 
        // Thêm text/html vào JSON formatter
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new 
            MediaTypeHeaderValue("text/html")); 
        
        config.Routes.MapHttpRoute( 
            name: "DefaultApi", 
            routeTemplate: "api/{controller}/{id}", 
            defaults: new { id = RouteParameter.Optional } 
        ); 
    } 
}

Output dưới đây cho thấy response là JSON khi request từ browser bất kể accept header text/html.

Content Negotiation (Đàm phán nội dung)

Web API sử dụng Content Negotiation để quyết định formatter nào dùng dựa trên:

  1. Accept header của request
  2. Media type mappings được cấu hình
  3. Quality factors (q-values) trong Accept header

Ví dụ Accept header với quality factor

Accept: application/json;q=0.9, application/xml;q=0.8, text/html;q=0.5

Server sẽ ưu tiên JSON (q=0.9) > XML (q=0.8) > HTML (q=0.5).

Custom MediaTypeFormatter

Để support custom format (ví dụ CSV):

public class CsvMediaTypeFormatter : BufferedMediaTypeFormatter {
    public CsvMediaTypeFormatter() {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
    }
    
    public override bool CanReadType(Type type) => false;
    public override bool CanWriteType(Type type) => true;
    
    public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content) {
        // Implement CSV serialization
    }
}

// Đăng ký trong WebApiConfig
config.Formatters.Add(new CsvMediaTypeFormatter());