मीडिया प्रकार एपीआई को क्लाइंट को पेलोड में डेटा की व्याख्या करने के बारे में सूचित करने की अनुमति देते हैं। HTTP प्रोटोकॉल में, मीडिया प्रकार को टेक्स्ट/एचटीएमएल, एप्लिकेशन/जेसन, और एप्लिकेशन/एक्सएमएल जैसे पहचानकर्ताओं के साथ निर्दिष्ट किया जाता है, जो क्रमशः एचटीएमएल, जेएसओएन और एक्सएमएल से मेल खाते हैं, जो सबसे आम वेब प्रारूप हैं। अन्य API विशिष्ट मीडिया प्रकार भी हैं, जैसे कि application/vnd.api+json।
नीचे ऐसे संस्करण दिए गए हैं जिन्हें मीडिया प्रकारों में भेजने की आवश्यकता है।
application/vnd.demo.students.v1+json StudentsV1Controller application/vnd.demo.students.v2+json StudentsV2Controller
अपना खुद का CustomControllerSelector . जोड़ना उपरोक्त त्रुटि को ठीक कर देगा।
कस्टम नियंत्रक चयनकर्ता -
उदाहरण
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 -
उदाहरण
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 } ); } }
छात्रV1नियंत्रक -
उदाहरण
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; } } }
StudentV2नियंत्रक -
उदाहरण
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; } } }
नीचे दिए गए आउटपुट उन परिणामों को दिखाते हैं जो हमें कस्टम मीडिया प्रकारों में वर्जनिंग के साथ StudentV1 और StudentV2controllers से मिलते हैं।
तो अब यदि हम कस्टम मीडिया प्रकार का उपयोग करके xml प्रारूप में समान आउटपुट प्राप्त करना चाहते हैं, तो नीचे दिए गए कस्टम मीडिया प्रकार को webapiconfig.cs
में जोड़ें।उदाहरण
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 } ); }
उपरोक्त उदाहरण में हम देख सकते हैं कि आउटपुट एक्सएमएल प्रारूप में है जैसा कि कस्टम मीडिया प्रकार में निर्दिष्ट है।