Chrome में नए ASP.NET वेब API का उपयोग करते हुए , मैं XML को देख रहा हूं - मैं इसे JSON के अनुरोध के लिए कैसे बदल सकता हूं ताकि मैं इसे ब्राउज़र में देख सकूं ? मेरा मानना है कि यह अनुरोध हेडर का सिर्फ एक हिस्सा है, क्या मैं इसमें सही हूं?
Chrome में नए ASP.NET वेब API का उपयोग करते हुए , मैं XML को देख रहा हूं - मैं इसे JSON के अनुरोध के लिए कैसे बदल सकता हूं ताकि मैं इसे ब्राउज़र में देख सकूं ? मेरा मानना है कि यह अनुरोध हेडर का सिर्फ एक हिस्सा है, क्या मैं इसमें सही हूं?
जवाबों:
मैं सिर्फ App_Start / WebApiConfig.cs
अपने MVC वेब एपीआई परियोजना में कक्षा में निम्नलिखित जोड़ता हूं ।
config.Formatters.JsonFormatter.SupportedMediaTypes
.Add(new MediaTypeHeaderValue("text/html") );
यह सुनिश्चित करता है कि आप अधिकांश प्रश्नों पर JSON प्राप्त करें, लेकिन XML
जब आप भेजते हैं तो आप प्राप्त कर सकते हैं text/xml
।
आप प्रतिक्रिया की आवश्यकता है Content-Type
के रूप में application/json
कृपया जाँच नीचे टोड के जवाब ।
NameSpace
उपयोग कर रहा है System.Net.Http.Headers
।
Content-Type
शीर्ष लेख अभी भी होगा text/html
।
यदि आप ऐसा करते हैं तो WebApiConfig
आप JSON को डिफ़ॉल्ट रूप से प्राप्त कर लेंगे, लेकिन यह तब भी आपको XML वापस करने की अनुमति देगा यदि आप text/xml
अनुरोध Accept
हेडर के रूप में पास होते हैं
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}
}
यदि आप एमवीसी परियोजना के प्रकार का उपयोग नहीं कर रहे हैं और इसलिए शुरू करने के लिए यह वर्ग नहीं था, तो इसे शामिल करने के तरीके के विवरण के लिए इस उत्तर को देखें।
application/xml
0.9 की */*
प्राथमिकता और 0.8 की प्राथमिकता के साथ अनुरोध करता है । application/xml
यदि आप क्लाइंट को विशेष रूप से अनुरोध करते हैं तो आप XML को वापस करने के लिए वेब एपीआई की क्षमता को हटाकर । उदाहरण के लिए यदि आप "स्वीकार: आवेदन / xml" भेजते हैं तो भी आपको JSON प्राप्त होगा ।
RequestHeaderMapping का उपयोग करना और भी बेहतर काम करता है, क्योंकि यह Content-Type = application/json
प्रतिक्रिया शीर्षलेख में भी सेट करता है, जो फ़ायरफ़ॉक्स (JSONView ऐड-ऑन के साथ) को JSON के रूप में प्रतिक्रिया को प्रारूपित करने की अनुमति देता है।
GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings
.Add(new System.Net.Http.Formatting.RequestHeaderMapping("Accept",
"text/html",
StringComparison.InvariantCultureIgnoreCase,
true,
"application/json"));
मुझे फेलिप लेयसिन का दृष्टिकोण सबसे अच्छा लगता है - सुनिश्चित करें कि ब्राउज़रों को ग्राहकों से कंटेंट बातचीत से समझौता किए बिना JSON प्राप्त होता है जो वास्तव में XML चाहते हैं। मेरे लिए एकमात्र अनुपलब्ध टुकड़ा यह था कि प्रतिक्रिया शीर्षकों में अभी भी सामग्री-प्रकार: पाठ / html शामिल थे। वह समस्या क्यों थी? क्योंकि मैं JSON फॉर्मैटर क्रोम एक्सटेंशन का उपयोग करता हूं , जो सामग्री-प्रकार का निरीक्षण करता है, और मुझे वह सुंदर स्वरूपण नहीं मिलता है जिसका मैं उपयोग कर रहा हूं। मैंने तय किया कि टेक्स्ट / html अनुरोधों को स्वीकार करने और एप्लिकेशन / जसन प्रतिक्रियाओं को स्वीकार करने वाले एक साधारण कस्टम फॉर्मेटर के साथ:
public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
public BrowserJsonFormatter() {
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
this.SerializerSettings.Formatting = Formatting.Indented;
}
public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) {
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.ContentType = new MediaTypeHeaderValue("application/json");
}
}
इस तरह रजिस्टर करें:
config.Formatters.Add(new BrowserJsonFormatter());
this.SerializerSettings.Formatting = Formatting.Indented;
अगर आप चाहते हैं कि यह बिना ब्राउजर एक्सटेंशन के सुंदर प्रिंट हो।
using System.Net.Http.Formatting
औरusing Newtonsoft.Json
MVC4 क्विक टिप # 3-एएसपी.नेट वेब एपीआई से एक्सएमएल फॉर्मेटर को हटाना
में Global.asax
पंक्ति जोड़ें:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
इस तरह:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
BundleTable.Bundles.RegisterTemplateBundles();
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}
में WebApiConfig.cs , के अंत में जोड़ने रजिस्टर समारोह:
// Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);
स्रोत ।
में Global.asax मैं नीचे दिए गए कोड का उपयोग कर रहा हूँ। JSON पाने के लिए मेरा URI हैhttp://www.digantakumar.com/api/values?json=true
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("json", "true", "application/json"));
}
WebAPI में सामग्री वार्ता पर एक नज़र डालें। ये ( भाग 1 और भाग 2 ) आश्चर्यजनक रूप से विस्तृत और गहन ब्लॉग पोस्ट बताते हैं कि यह कैसे काम करता है।
संक्षेप में, आप सही हैं, और केवल हेडर सेट Accept
या Content-Type
अनुरोध करने की आवश्यकता है । यह देखते हुए कि किसी विशिष्ट प्रारूप को वापस करने के लिए आपकी कार्रवाई को कोडित नहीं किया गया है, आप सेट कर सकते हैं Accept: application/json
।
जैसा कि प्रश्न क्रोम-विशिष्ट है, आप पोस्टमैन एक्सटेंशन प्राप्त कर सकते हैं जो आपको अनुरोध सामग्री प्रकार सेट करने की अनुमति देता है।
network.http.accept.default
कॉन्फ़िगरेशन की सामग्री को इसमें बदलना text/html,application/xhtml+xml,application/json;q=0.9,application/xml;q=0.8,*/*;q=0.7
।
text/html,application/xhtml+xml;q=1.0,*/*;q=0.7
छोटी-छोटी मेजबानों से बचने के लिए जैसे कि Bitbucket जैसे कि HTML के बदले में अपने ब्राउज़र JSON की गलती से सेवा करें।
एक त्वरित विकल्प MediaTypeMapping विशेषज्ञता का उपयोग करना है। यहाँ Application_Start ईवेंट में QueryStringMapping का उपयोग करने का एक उदाहरण दिया गया है:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("a", "b", "application/json"));
अब जब भी url में querystring होता है? = A = b इस मामले में, Json प्रतिक्रिया ब्राउज़र में दिखाई जाएगी।
यह कोड json को मेरा डिफ़ॉल्ट बनाता है और मुझे XML प्रारूप का भी उपयोग करने की अनुमति देता है। मैं सिर्फ अपेंड कर दूंगा xml=true
।
GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", "application/xml"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
सभी को धन्यवाद!
अपने API का परीक्षण करने के लिए अपने ब्राउज़र का उपयोग न करें।
इसके बजाय, एक HTTP क्लाइंट का उपयोग करने का प्रयास करें जो आपको अपना अनुरोध निर्दिष्ट करने की अनुमति देता है, जैसे कि CURL, या फ़िडलर भी।
इस समस्या की समस्या क्लाइंट में है, एपीआई में नहीं। ब्राउज़र के अनुरोध के अनुसार वेब एपीआई सही ढंग से व्यवहार करता है।
उपर्युक्त अधिकांश उत्तर सही अर्थों में हैं। चूंकि आप डेटा को XML फॉर्मेट में फॉर्मेट किया जा रहा है, इसका मतलब है कि XML फॉर्मैटर लागू है, इसलिए आप JSON फॉर्मेट को HttpConfiguration पैरामीटर जैसे XMLFormatter को हटाकर देख सकते हैं
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.EnableSystemDiagnosticsTracing();
}
चूंकि JSON डिफ़ॉल्ट प्रारूप है
Accept: application/xml
जब User-Agent
हेडर में "क्रोम" होता है , तो मैंने एक वैश्विक एक्शन फ़िल्टर का उपयोग किया था :
internal class RemoveXmlForGoogleChromeFilter : IActionFilter
{
public bool AllowMultiple
{
get { return false; }
}
public async Task<HttpResponseMessage> ExecuteActionFilterAsync(
HttpActionContext actionContext,
CancellationToken cancellationToken,
Func<Task<HttpResponseMessage>> continuation)
{
var userAgent = actionContext.Request.Headers.UserAgent.ToString();
if (userAgent.Contains("Chrome"))
{
var acceptHeaders = actionContext.Request.Headers.Accept;
var header =
acceptHeaders.SingleOrDefault(
x => x.MediaType.Contains("application/xml"));
acceptHeaders.Remove(header);
}
return await continuation();
}
}
काम करने लगता है।
मुझे REST सेवाओं के साथ काम करने के लिए Chrome ऐप "उन्नत REST क्लाइंट" उत्कृष्ट लगा। आप सामग्री-प्रकार को application/json
अन्य चीजों में सेट कर सकते हैं:
उन्नत REST क्लाइंट
सही प्रारूप लौटाना मीडिया-प्रकार के फ़ॉर्मेटर द्वारा किया जाता है। जैसा कि दूसरों ने उल्लेख किया है, आप इसे WebApiConfig
कक्षा में कर सकते हैं :
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
// Configure Web API to return JSON
config.Formatters.JsonFormatter
.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
...
}
}
अधिक के लिए, जाँच करें:
यदि आपका कार्य XML लौट रहा है (जो कि डिफ़ॉल्ट रूप से मामला है) और आपको JSON को वापस करने के लिए बस एक विशिष्ट विधि की आवश्यकता है, तो आप ActionFilterAttribute
उस विशिष्ट क्रिया का उपयोग कर सकते हैं और इसे लागू कर सकते हैं ।
फ़िल्टर विशेषता:
public class JsonOutputAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
ObjectContent content = actionExecutedContext.Response.Content as ObjectContent;
var value = content.Value;
Type targetType = actionExecutedContext.Response.Content.GetType().GetGenericArguments()[0];
var httpResponseMsg = new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
RequestMessage = actionExecutedContext.Request,
Content = new ObjectContent(targetType, value, new JsonMediaTypeFormatter(), (string)null)
};
actionExecutedContext.Response = httpResponseMsg;
base.OnActionExecuted(actionExecutedContext);
}
}
कार्रवाई के लिए आवेदन:
[JsonOutput]
public IEnumerable<Person> GetPersons()
{
return _repository.AllPersons(); // the returned output will be in JSON
}
ध्यान दें कि आप Attribute
कार्रवाई सजावट पर शब्द को छोड़ सकते हैं और [JsonOutput]
इसके बजाय बस का उपयोग कर सकते हैं [JsonOutputAttribute]
।
config.Formatters.Remove(config.Formatters.XmlFormatter);
यह मेरे लिए अस्पष्ट है कि उत्तर में इस जटिलता के सभी कारण क्यों हैं। यकीन है कि बहुत सारे तरीके हैं जो आप कर सकते हैं, QueryStrings, हेडर और विकल्प के साथ ... लेकिन मेरा मानना है कि सबसे अच्छा अभ्यास सरल है। आप एक सादे URL (उदा:) का अनुरोध करते हैं http://yourstartup.com/api/cars
और बदले में आपको JSON मिलता है। आपको JSON उचित प्रतिक्रिया हेडर के साथ मिलता है:
Content-Type: application/json
इसी प्रश्न के उत्तर की तलाश में, मुझे यह धागा मिला, और चलते रहना पड़ा क्योंकि यह स्वीकृत उत्तर बिल्कुल काम नहीं करता है। मुझे एक उत्तर मिला, जो मुझे लगता है कि सबसे अच्छा होना सबसे आसान है जो सबसे अच्छा नहीं है:
डिफ़ॉल्ट WebAPI फ़ॉर्मेटर सेट करें
मैं अपना टिप यहां भी जोड़ दूंगा।
WebApiConfig.cs
namespace com.yourstartup
{
using ...;
using System.Net.Http.Formatting;
...
config.Formatters.Clear(); //because there are defaults of XML..
config.Formatters.Add(new JsonMediaTypeFormatter());
}
मेरे पास एक सवाल है कि चूक कहां से हुई है (कम से कम जिन्हें मैं देख रहा हूं)। क्या वे .NET डिफॉल्ट हैं, या शायद कहीं और बनाए गए हैं (मेरी परियोजना पर किसी और द्वारा)। Anways, उम्मीद है कि यह मदद करता है।
यहां jayson.centeno और अन्य उत्तरों के समान एक समाधान है, लेकिन अंतर्निहित एक्सटेंशन का उपयोग कर रहा है System.Net.Http.Formatting
।
public static void Register(HttpConfiguration config)
{
// add support for the 'format' query param
// cref: http://blogs.msdn.com/b/hongyes/archive/2012/09/02/support-format-in-asp-net-web-api.aspx
config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");
// ... additional configuration
}
समाधान मुख्य रूप से WebApi के शुरुआती रिलीज में OData के लिए $ स्वरूप का समर्थन करने के लिए तैयार किया गया था, लेकिन यह गैर-OData कार्यान्वयन पर भी लागू होता है, और वापस आ जाता है
Content-Type: application/json; charset=utf-8
प्रतिक्रिया में हेडर ।
यह कील करने की अनुमति देता &$format=json
है या &$format=xml
जब एक ब्राउज़र के साथ परीक्षण कर अपने uri के अंत तक। यह गैर-ब्राउज़र क्लाइंट का उपयोग करते समय अन्य अपेक्षित व्यवहार में हस्तक्षेप नहीं करता है जहां आप अपने स्वयं के हेडर सेट कर सकते हैं।
आप नीचे के रूप में उपयोग कर सकते हैं:
GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
बस अपने WebApiConfig वर्ग पर कोड की दो पंक्ति जोड़ें
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//add this two line
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());
............................
}
}
आप बस App_Start/WebApiConfig.cs
इस तरह से बदलाव करें:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
//Below formatter is used for returning the Json result.
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
//Default route
config.Routes.MapHttpRoute(
name: "ApiControllerOnly",
routeTemplate: "api/{controller}"
);
}
MSDN से ASP.NET और AngularJS (लगभग 41 मिनट) के साथ एक सिंगल पेज एप्लीकेशन का निर्माण ।
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// ... possible routing etc.
// Setup to return json and camelcase it!
var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
formatter.SerializerSettings.ContractResolver =
new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
}
यह चालू होना चाहिए, मैंने इसकी कोशिश की और यह काम कर गया।
यह प्रश्न पूछे जाने के बाद (और उत्तर दिया गया) कुछ समय बीत चुका है, लेकिन एक अन्य विकल्प सर्वर पर एक्सेप्ट हेडर को ओवरहाइड करने से रोकने के लिए है।
public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
var someOtherCondition = false;
var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
if (someOtherCondition && accHeader.Contains("application/xml"))
{
request.Headers.Remove("Accept");
request.Headers.Add("Accept", "application/json");
}
return await base.SendAsync(request, cancellationToken);
}
}
someOtherCondition
ब्राउज़र प्रकार सहित कुछ भी कहां हो सकता है, आदि यह सशर्त मामलों के लिए होगा जहां केवल कभी-कभी हम डिफ़ॉल्ट सामग्री बातचीत को ओवरराइड करना चाहते हैं। अन्यथा अन्य उत्तरों के अनुसार, आप विन्यास से एक अनावश्यक फ़ॉर्मेटर को हटा देंगे।
आपको इसे पंजीकृत करना होगा। आप इसे विश्व स्तर पर कर सकते हैं:
public static void Register(HttpConfiguration config) {
config.MessageHandlers.Add(new ForceableContentTypeDelegationHandler());
}
या मार्ग के आधार पर एक मार्ग पर:
config.Routes.MapHttpRoute(
name: "SpecialContentRoute",
routeTemplate: "api/someUrlThatNeedsSpecialTreatment/{id}",
defaults: new { controller = "SpecialTreatment" id = RouteParameter.Optional },
constraints: null,
handler: new ForceableContentTypeDelegationHandler()
);
और चूंकि यह एक संदेश हैंडलर है, यह पाइपलाइन के अनुरोध और प्रतिक्रिया दोनों पर चलेगा जैसे कि बहुत HttpModule
। इसलिए आप आसानी से कस्टम हेडर के साथ ओवरराइड को स्वीकार कर सकते हैं:
public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
var wasForced = false;
var someOtherCondition = false;
var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
if (someOtherCondition && accHeader.Contains("application/xml"))
{
request.Headers.Remove("Accept");
request.Headers.Add("Accept", "application/json");
wasForced = true;
}
var response = await base.SendAsync(request, cancellationToken);
if (wasForced){
response.Headers.Add("X-ForcedContent", "We overrode your content prefs, sorry");
}
return response;
}
}
यहां सबसे आसान तरीका है जो मैंने अपने अनुप्रयोगों में उपयोग किया है। फ़ंक्शन App_Start\\WebApiConfig.cs
में कोड की 3 पंक्तियों के नीचे दिया गया जोड़ेंRegister
var formatters = GlobalConfiguration.Configuration.Formatters;
formatters.Remove(formatters.XmlFormatter);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
Asp.net वेब एपीआई स्वचालित रूप से JSON पर आपकी रिटर्निंग ऑब्जेक्ट को अनुक्रमित करेगा और जैसा application/json
कि हेडर में जोड़ा गया है इसलिए ब्राउज़र या रिसीवर समझ जाएगा कि आप JSON परिणाम वापस कर रहे हैं।
WebApiConfig वह स्थान है जहाँ आप कॉन्फ़िगर कर सकते हैं कि क्या आप json या xml में आउटपुट करना चाहते हैं। डिफ़ॉल्ट रूप से यह xml है। रजिस्टर फ़ंक्शन में हम आउटपुट को प्रारूपित करने के लिए HttpConfiguration Formatters का उपयोग कर सकते हैं। System.Net.Http.Headers => MediaTypeHeaderValue ("पाठ / html") को आउटपुट स्वरूप में प्राप्त करने के लिए आवश्यक है।
फेलिप लेयसिन के उत्तर का उपयोग करते हुए वर्षों के लिए, कोर लाइब्रेरीज़ के हालिया अपडेट और Json.Net के बाद, मैं इसमें भाग लिया System.MissingMethodException
: SupportedMediaTypes। मेरे मामले में समाधान, अप्रत्याशित रूप से एक ही अप्रत्याशित अपवाद का अनुभव करने वाले अन्य लोगों के लिए उपयोगी है, स्थापित करना है System.Net.Http
। नुगेट स्पष्ट रूप से कुछ परिस्थितियों में इसे हटा देता है। मैन्युअल स्थापना के बाद, समस्या हल हो गई थी।
मैं एक एपीआई में एक एकल उपयोग के मामले (GET) को बदलने के लिए कोडिंग की आवश्यकता के इतने सारे उत्तरों को देखकर हैरान हूं कि एक उचित उपकरण का उपयोग करने के बजाय जो एक बार स्थापित किया जाना है और किसी के लिए उपयोग किया जा सकता है एपीआई (स्वयं या तीसरे पक्ष) और सभी के बक्सों का इस्तेमाल करें।
तो अच्छा जवाब है: