Các loại phương tiện cho phép một API thông báo cho khách hàng cách diễn giải dữ liệu trong tải xuống. Trong giao thức HTTP, Loại phương tiện được chỉ định với các định danh liketext / html, application / json và application / xml, tương ứng với HTML, JSON và XML, các định dạng web phổ biến nhất. Có nhiều loại APIspecificMedia khác, chẳng hạn như application / vnd.api + json.
Dưới đây là các phiên bản cần được gửi trong các loại phương tiện.
application/vnd.demo.students.v1+json StudentsV1Controller application/vnd.demo.students.v2+json StudentsV2Controller
Thêm CustomControllerSelector của riêng chúng tôi sẽ sửa lỗi trên.
CustomControllerSelector -
Ví dụ
using System.Linq; using System.Net.Http; using System.Text.RegularExpressions; using System.Web.Http; using System.Web.Http.Controllers; using System.Web.Http.Dispatcher; namespace WebAPI.Custom{ public class CustomControllerSelector : DefaultHttpControllerSelector{ private HttpConfiguration _config; public CustomControllerSelector(HttpConfiguration config) : base(config){ _config = config; } public override HttpControllerDescriptor SelectController(HttpRequestMessage request){ var controllers = GetControllerMapping(); var routeData = request.GetRouteData(); var controllerName = routeData.Values["controller"].ToString(); string versionNumber = ""; string regex = @"application\/vnd\.demo\.([a-z]+)\.v(?<version>[0-9]+)\+([a-z]+)"; var acceptHeader = request.Headers.Accept .Where(a => Regex.IsMatch(a.MediaType, regex, RegexOptions.IgnoreCase)); if (acceptHeader.Any()){ var match = Regex.Match(acceptHeader.First().MediaType, regex, RegexOptions.IgnoreCase); versionNumber = match.Groups["version"].Value; } HttpControllerDescriptor controllerDescriptor; if (versionNumber == "1"){ controllerName = string.Concat(controllerName, "V1"); } else if (versionNumber == "2"){ controllerName = string.Concat(controllerName, "V2"); } if (controllers.TryGetValue(controllerName, out controllerDescriptor)){ return controllerDescriptor; } return null; } } }
WebApi.Config.cs -
Ví dụ
public static class WebApiConfig{ public static void Register(HttpConfiguration config){ config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector(config)); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
StudentV1Controller -
Ví dụ
using DemoWebApplication.Models; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace DemoWebApplication.Controllers{ public class StudentV1Controller : ApiController{ List<StudentV1> students = new List<StudentV1>{ new StudentV1{ Id = 1, Name = "Mark" }, new StudentV1{ Id = 2, Name = "John" } }; public IEnumerable<StudentV1> Get(){ return students; } public StudentV1 Get(int id){ var studentForId = students.FirstOrDefault(x => x.Id == id); return studentForId; } } }
StudentV2Controller -
Ví dụ
using DemoWebApplication.Models; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace DemoWebApplication.Controllers{ public class StudentV2Controller : ApiController{ List<StudentV2> students = new List<StudentV2>{ new StudentV2{ Id = 1, FirstName = "Roger", LastName = "Federer" }, new StudentV2{ Id = 2, FirstName = "Tom", LastName = "Bruce" } }; public IEnumerable<StudentV2> Get(){ return students; } public StudentV2 Get(int id){ var studentForId = students.FirstOrDefault(x => x.Id == id); return studentForId; } } }
Các kết quả đầu ra bên dưới hiển thị kết quả mà chúng tôi nhận được từ Bộ điều khiển StudentV1 và StudentV2 với việc lập phiên bản trong các loại phương tiện tùy chỉnh.
Vì vậy, bây giờ nếu chúng ta muốn nhận được cùng một đầu ra ở định dạng xml bằng cách sử dụng loại phương tiện tùy chỉnh, hãy thêm loại phương tiện tùy chỉnh bên dưới trong webapiconfig.cs
Ví dụ
public static void Register(HttpConfiguration config){ config.MapHttpAttributeRoutes(); config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector(config)); config.Formatters.XmlFormatter.SupportedMediaTypes .Add(new MediaTypeHeaderValue("application/vnd.demo.student.v1+xml")); config.Formatters.XmlFormatter.SupportedMediaTypes .Add(new MediaTypeHeaderValue("application/vnd.demo.student.v2+xml")); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
Trong ví dụ trên, chúng ta có thể thấy rằng đầu ra ở định dạng XML như được chỉ định trong loại phương tiện tùy chỉnh.