25

निम्नलिखित webapiconfig को देखते हुए के आधार पर xml या MVC वेब एपीआई से json लौटें;या तो अनुरोध

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

और यह नियंत्रक;

public class ProductsController : ApiController 
    { 
     Product[] _products = new Product[] 
     { 
      new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, 
      new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
      new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
     }; 

     public IEnumerable<Product> GetAllProducts() 
     { 
      return _products; 
     } 
    } 

यूआरएल http://localhost/api/Products का उपयोग करते हुए मैं XML स्वरूप में उत्पादों की एक सूची मिलता है।

मैं करना चाहते हैं क्या या तो JSON या XML अनुरोध के आधार पर लौटने के लिए विकल्प होता है है। तो जेसन के लिए, यह होगा;

http://localhost/api/Products.json 

और एक्सएमएल के लिए, यह होगा;

http://localhost/api/Products.xml 

इसी प्रकार;

http://localhost/api/Products.json/1/ 
http://localhost/api/Products.xml/1/ 

क्या यह संभव है और मैं इस कार्यक्षमता को कैसे प्राप्त करूं?

एक वैकल्पिक की तरह कुछ हो सकता है;

http://localhost/api/json/Products/ 

उत्तर

37

हाँ, आप प्राप्त कर सकते हैं कि AddUriPathExtensionMapping

साथ आप इस तरह मार्गों बना सकते हैं:

config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json"); 
    config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "text/xml"); 

सुनिश्चित करें:

routes.MapHttpRoute(
    name: "Api UriPathExtension", 
    routeTemplate: "api/{controller}.{extension}/{id}", 
    defaults: new { id = RouteParameter.Optional, extension = RouteParameter.Optional } 
); 

routes.MapHttpRoute(
    name: "Api UriPathExtension ID", 
    routeTemplate: "api/{controller}/{id}.{extension}", 
    defaults: new { id = RouteParameter.Optional, extension = RouteParameter.Optional } 
); 

तो फिर तुम formatters बढ़ाने की जरूरत System.Net.Http.Formatting पर संदर्भ जोड़ें, क्योंकि ये विधियां विस्तार विधियां और इंटेल हैं लिसेंस उन्हें डिफ़ॉल्ट रूप से नहीं देखेगा।

इस उदाहरण में याद रखें, आप अभी भी उचित सामग्री प्रकार के साथ अनुरोध जारी करने के लिए है। हालांकि, यदि आप ब्राउज़र पता बार के माध्यम से इन्हें सीधे उपलब्ध करना चाहते हैं तो आप "टेक्स्ट/एचटीएमएल" पर मैप कर सकते हैं।

मुझे लगता है कि कुछ समय पहले सब के बारे में एक ब्लॉग पोस्ट में लिखा था - उस स्थिति में उपयोगी हो सकता है और आप अधिक विवरण http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue-in-asp-net-web-api/

+0

मार्गों काम करने के लिए लग रहे हैं में रखना चाहिए, लेकिन विस्तार सामान कुछ भी नहीं है। मैंने इन्हें global.asax में जोड़ा, क्या यह एक समस्या है? – ChrisBint

+5

क्रिस, उपयोग {ext} {बजाय विस्तार} की, क्योंकि {ext} के लिए जा मैप किया फ़ॉर्मेटर का उल्लेख करने के हार्ड-कोडेड प्रकट होता है। – MCattle

+0

ग्रेट थ्रेड। जैसा @MCattle ने कहा, हमेशा याद रखें: विस्तार –