Chrome का उपयोग करके XML की बजाय JSON वापस करने के लिए मुझे ASP.NET वेब API कैसे मिलेगा?


1220

Chrome में नए ASP.NET वेब API का उपयोग करते हुए , मैं XML को देख रहा हूं - मैं इसे JSON के अनुरोध के लिए कैसे बदल सकता हूं ताकि मैं इसे ब्राउज़र में देख सकूं ? मेरा मानना ​​है कि यह अनुरोध हेडर का सिर्फ एक हिस्सा है, क्या मैं इसमें सही हूं?


8
JSON को केवल डिफ़ॉल्ट व्यवहार बनाने के लिए यहां एक चर्चा है: github.com/aspnet/Mvc/issues/1765
Natan

जवाबों:


1736

मैं सिर्फ 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


115
यह आश्चर्यजनक रूप से अनदेखा जवाब है, और हालांकि मूल प्रश्न पूरी तरह से स्पष्ट नहीं था, यह सीधे JSON को वेब ब्राउज़र के लिए डिफ़ॉल्ट प्रतिक्रिया देता है (जो स्वीकार करता है: पाठ / html)। बहुत बढ़िया।
ग्रिग्मैक

16
+1 दूर और सबसे अच्छा जवाब। मुझे लगता है कि पीपीएल के एक टन हैं जो XML को पूरी तरह से हटाने का विकल्प चुनते हैं क्योंकि वे ब्राउज़र में JSON नहीं देखते हैं।
डेरेक हुन्जिकर

3
मैंने पाया जब मैंने ऐसा किया था कि HTML ब्रेक टैग के साथ थर्ड पार्टी द्वारा प्रदान किया गया डेटा कैरेज रिटर्न के साथ समाप्त हुआ। JSON तब अमान्य था। यदि यह आपको प्रभावित करता है तो स्वीकृत उत्तर का उपयोग करना बेहतर है।
स्टोनटिप

23
ध्यान दें कि प्रतिक्रिया का Content-Typeशीर्ष लेख अभी भी होगा text/html
मृचिफ

78
यह भयानक है। प्रतिक्रिया सामग्री प्रकार हेडर एप्लिकेशन / जसन होना चाहिए। यह "समाधान" इसे पाठ / html बनाता है।
meffect

501

यदि आप ऐसा करते हैं तो 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);
    }
}

यदि आप एमवीसी परियोजना के प्रकार का उपयोग नहीं कर रहे हैं और इसलिए शुरू करने के लिए यह वर्ग नहीं था, तो इसे शामिल करने के तरीके के विवरण के लिए इस उत्तर को देखें।


51
बस ध्यान दें, मूल व्यवहार सही है। क्रोम application/xml0.9 की */*प्राथमिकता और 0.8 की प्राथमिकता के साथ अनुरोध करता है । application/xmlयदि आप क्लाइंट को विशेष रूप से अनुरोध करते हैं तो आप XML को वापस करने के लिए वेब एपीआई की क्षमता को हटाकर । उदाहरण के लिए यदि आप "स्वीकार: आवेदन / xml" भेजते हैं तो भी आपको JSON प्राप्त होगा ।
26:13

11
क्या यह मैं हूं, या पहला वाक्य गलत है? कोड XML को पूरी तरह से हटाने के लिए प्रकट होता है, बस डिफ़ॉल्ट को नहीं बदलता है।
NickG

6
@ नाइक: एक समाधान जो यहां अनदेखी है और आईएमएचओ एक बेहतर विकल्प है (आवेदन / xml को ध्यान में रखते हुए) इस पृष्ठ पर फेलिप लेउसीन द्वारा प्रस्तावित समाधान है। Config.Formatters.XmlFormatter.SupportedMediaTypes.Add (new MediaTypeHeaderValue ("टेक्स्ट / html") का उपयोग करके;
कोहेन

1
इसलिए, हम इसे वेब कॉन्फिग के माध्यम से कैसे करते हैं ताकि हम अनुरोध किए जाने पर डिफ़ॉल्ट रूप से और एक्सएमएल द्वारा जसन प्राप्त करें?
काइल

4
@ फेलिस लुइसिन का जवाब वास्तव में छोटा है और बेहतर काम करता है।
केन स्मिथ

313

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"));

6
यह सबसे अधिक दुबला और सरल उपाय है और फिडलर भी जोसन के रूप में लौटाए जा रहे सामग्री प्रकार का पता लगाता है।
स्टीव जॉनसन

4
अच्छा! आप इसे कोड में डालने का सुझाव कहाँ से देंगे?
टिम एबेल

9
यह WebApiConfig.cs
अनिमेश

9
मेरे लिए काम किया। मुझे एक प्रयोग System.Net
bbsimonbb

1
अपनी सुविधा के लिए लिंकिंग: यह उत्तर मैं आमतौर पर प्रदर्शन करने वाले एक और सेटअप कदम के साथ अच्छी तरह से निभाता है: stackoverflow.com/a/28337589/398630
BrainSlugs83

308

मुझे फेलिप लेयसिन का दृष्टिकोण सबसे अच्छा लगता है - सुनिश्चित करें कि ब्राउज़रों को ग्राहकों से कंटेंट बातचीत से समझौता किए बिना 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());

24
कंस्ट्रक्टर ऐड में this.SerializerSettings.Formatting = Formatting.Indented;अगर आप चाहते हैं कि यह बिना ब्राउजर एक्सटेंशन के सुंदर प्रिंट हो।
एलेस्टेयर मावे

10
आप तार पर सुंदर प्रिंट क्यों चाहते हैं?
21

8
क्या @ dmit77 का उत्तर इस से बेहतर (अधिक संक्षिप्त) नहीं है?
H.Wolper 12

8
@eddiegroves आप तार पर सुंदर प्रिंट नहीं चाहते हैं। आप सर्वर को तार पर कम से कम बिट्स भेजना चाहते हैं (जैसे: कोई स्थान नहीं)। फिर आप चाहते हैं कि ब्राउज़र इसे अच्छी तरह से प्रारूपित करे, ऐडऑन और ऐसे। जावास्क्रिप्ट को JSON को आमतौर पर पार्स करने की आवश्यकता होती है, क्यों इसे अनावश्यक स्वरूपण द्वारा धीमी बना देता है
मेफ़ेक्ट

13
Googlers जो देख रहे के लिए: जोड़ने के लिए मत भूलना using System.Net.Http.Formattingऔरusing Newtonsoft.Json
Berriel

186

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();
}

9
कार्य करता है - JSON XML के बजाय डिफ़ॉल्ट होने वाला बहुत अच्छा है।
व्हाइटनीलैंड

5
लेकिन क्या आप अभी भी xml वापस कर सकते हैं?
थॉमस स्टॉक

99
मैंने इसका परीक्षण किया, और आप नहीं कर सकते। तो यह एक्सएमएल सपोर्ट को हटा रहा है .. ये सावधान हो जाइए, प्रिय गूगल के लोग
थॉमस स्टॉक

3
यदि आप नीचे दिए गए मेरे उत्तर पर एक नज़र डालते हैं, तो यह xml तब भी वापस आ जाएगा यदि आप चाहते हैं लेकिन साइट ब्राउज़र को JSON के साथ प्रतिक्रिया करने देती है
ग्लेन स्लेवेन

3
@GlennSlaven हाँ आपके उत्तर को सही के रूप में चिह्नित किया जाना चाहिए।
राडू florescu

114

में WebApiConfig.cs , के अंत में जोड़ने रजिस्टर समारोह:

// Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);

स्रोत


क्या XmlFormatter MVC4 में नया है?
ग्लेन स्लेवेन

1
MVC5 में, यह GlobalConfiguration.Configuration
Steven

4
एक परियोजना के लिए जो केवल JSON का समर्थन करना चाहिए और किसी भी परिस्थिति में XML को बाहर निकालने की अनुमति नहीं दी जा सकती है यह अब तक का सबसे अच्छा विकल्प है।
ल्यूक सी

1
config.Formatters.Add (config.Formatters.JsonFormatter);
कैस ब्लोम

3
वह भयानक है। - यह हमेशा JSON को वापस नहीं करेगा चाहे कोई भी चीज हो, भले ही क्लाइंट कंटेंट-टाइप हेडर में XML के लिए विशेष रूप से पूछता हो।
ब्रेनस्ल्गस83

94

में 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"));
}

2
महान एक। आपकी विधि क्या पैरामीटर की अपेक्षा करती है? जैसे लोकलहोस्ट: 61044 / एपी / वैल्यू / गेटडेट? json = true, date = 2012-08-01
LT.Nolo

डिफ़ॉल्ट रूप से डेटा वेब एपी का प्रारूप किस प्रकार का है। यह json या webapi है? धन्यवाद
थॉमस

54

WebAPI में सामग्री वार्ता पर एक नज़र डालें। ये ( भाग 1 और भाग 2 ) आश्चर्यजनक रूप से विस्तृत और गहन ब्लॉग पोस्ट बताते हैं कि यह कैसे काम करता है।

संक्षेप में, आप सही हैं, और केवल हेडर सेट Acceptया Content-Typeअनुरोध करने की आवश्यकता है । यह देखते हुए कि किसी विशिष्ट प्रारूप को वापस करने के लिए आपकी कार्रवाई को कोडित नहीं किया गया है, आप सेट कर सकते हैं Accept: application/json


6
"तो मैं इसे ब्राउज़र में देख सकता हूं"
स्पांजमैन

1
@ स्पंज, हाँ आप कर सकते हैं। लेकिन REST क्लाइंट जैसे एक्सटेंशन का उपयोग करें - अधिकांश ब्राउज़रों में एक ऐसा है। किसी ब्राउज़र में url की प्रत्यक्ष टाइपिंग 1. बहुत सीमित है (हेडर पर कोई नियंत्रण नहीं, डेटा और आदि पोस्ट नहीं कर सकता); 2. गलत - ब्राउज़र वेब एपीआई का उपभोग नहीं करता है क्योंकि इसका उपभोग करने का इरादा है - आप इसे ठीक से परीक्षण करने पर भरोसा नहीं कर सकते। इसलिए, फिर से, एक अच्छा REST क्लाइंट ऐड-ऑन उसे ठीक करेगा।
इवलो स्लावोव

45

जैसा कि प्रश्न क्रोम-विशिष्ट है, आप पोस्टमैन एक्सटेंशन प्राप्त कर सकते हैं जो आपको अनुरोध सामग्री प्रकार सेट करने की अनुमति देता है।

डाकिया


फ़ायरफ़ॉक्स में, लगभग इसके बारे में जाना: कॉन्फिगर करना, accept.default की खोज करना और 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 की गलती से सेवा करें।
Bjartur Thorlacius

URL मर चुका है। एक नया chrome.google.com/webstore/detail/postman/… है
फाल्कन मोमोट

35

एक त्वरित विकल्प MediaTypeMapping विशेषज्ञता का उपयोग करना है। यहाँ Application_Start ईवेंट में QueryStringMapping का उपयोग करने का एक उदाहरण दिया गया है:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("a", "b", "application/json"));

अब जब भी url में querystring होता है? = A = b इस मामले में, Json प्रतिक्रिया ब्राउज़र में दिखाई जाएगी।


2
यह बहुत उपयोगी था। अगर आपको उपयोग path.to/item.json करना चाहते QueryStringMapping के बजाय UriPathExtensionMapping उपयोग कर सकते हैं
nuzzolilo

32

यह कोड 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"));

सभी को धन्यवाद!


1
यह सबसे लचीला उत्तर है (और वास्तव में इन दिनों डिफ़ॉल्ट कॉन्फ़िगरेशन होना चाहिए)। इस उत्तर में जोड़ने के लिए, JSON डिफ़ॉल्ट है, जिसमें ब्राउज़र शामिल है। XML देखने के लिए, क्वेरी स्ट्रिंग जोड़ें: xml = true
raider33

कई रणनीतियों की कोशिश की। XML और JSON दोनों के लिए एक सरल परीक्षण किया था और इस बॉक्स से बाहर काम किया
pat capozzi

23

अपने API का परीक्षण करने के लिए अपने ब्राउज़र का उपयोग न करें।

इसके बजाय, एक HTTP क्लाइंट का उपयोग करने का प्रयास करें जो आपको अपना अनुरोध निर्दिष्ट करने की अनुमति देता है, जैसे कि CURL, या फ़िडलर भी।

इस समस्या की समस्या क्लाइंट में है, एपीआई में नहीं। ब्राउज़र के अनुरोध के अनुसार वेब एपीआई सही ढंग से व्यवहार करता है।


30
ब्राउज़र का उपयोग क्यों नहीं करते? यह इसके लिए एक स्पष्ट उपकरण है।
एंडर्स लिंडन सेप

4
मुझे लगता है कि यहां बिंदु सही और महत्वपूर्ण है - यदि क्लाइंट को समस्या के कारण हमें एप्लिकेशन (एमवीसी वेबएपीआई इन्फ्रास्ट्रक्चर) के कामकाजी हिस्से को ओवरफिक्स नहीं करना चाहिए। एक एपी के लिए वास्तविक उपयोग का मामला ठीक से उपयोग किया जाना है (सही हेडर की आपूर्ति करके), जो आवेदन की जिम्मेदारी है। मैं हालांकि पूरी तरह से ब्राउज़र को त्यागने से असहमत हूं - परीक्षण के लिए, लगभग किसी भी ब्राउज़र के लिए बहुत सारे उपकरण हैं (बाकी क्लाइंट-जैसे एक्सटेंशन शुरू करने के लिए)।
Ivaylo Slavov

6
यह शायद एक टिप्पणी होनी चाहिए।
bonh

17

उपर्युक्त अधिकांश उत्तर सही अर्थों में हैं। चूंकि आप डेटा को 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 डिफ़ॉल्ट प्रारूप है


12

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();
    }
}

काम करने लगता है।


11

मुझे REST सेवाओं के साथ काम करने के लिए Chrome ऐप "उन्नत REST क्लाइंट" उत्कृष्ट लगा। आप सामग्री-प्रकार को application/jsonअन्य चीजों में सेट कर सकते हैं: उन्नत REST क्लाइंट


10

सही प्रारूप लौटाना मीडिया-प्रकार के फ़ॉर्मेटर द्वारा किया जाता है। जैसा कि दूसरों ने उल्लेख किया है, आप इसे 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]


7
        config.Formatters.Remove(config.Formatters.XmlFormatter);

3
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या का हल कैसे और / या इसके बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा। कृपया इस stackoverflow.com/help/how-to-answer
SR

6

ASP.net WebApi 2 के नवीनतम संस्करण के अनुसार,

के तहत WebApiConfig.cs, यह काम करेगा

config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
config.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

6

यह मेरे लिए अस्पष्ट है कि उत्तर में इस जटिलता के सभी कारण क्यों हैं। यकीन है कि बहुत सारे तरीके हैं जो आप कर सकते हैं, 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, उम्मीद है कि यह मदद करता है।


5

यहां 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 के अंत तक। यह गैर-ब्राउज़र क्लाइंट का उपयोग करते समय अन्य अपेक्षित व्यवहार में हस्तक्षेप नहीं करता है जहां आप अपने स्वयं के हेडर सेट कर सकते हैं।


5

आप नीचे के रूप में उपयोग कर सकते हैं:

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

यदि आप केवल JSON संदेशों को पास करने के लिए WebAPI ऐप बना रहे हैं, तो इस उत्तर पर विचार करें।
एलन 1

4

बस अपने WebApiConfig वर्ग पर कोड की दो पंक्ति जोड़ें

public static class WebApiConfig
{
     public static void Register(HttpConfiguration config)
     {
          //add this two line 
          config.Formatters.Clear();
          config.Formatters.Add(new JsonMediaTypeFormatter());


          ............................
      }
}

3

आप बस 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}"
       );
    }

फॉर्मैटर को निकालना आमतौर पर एक अच्छा विचार नहीं है, आप कार्यक्षमता को हटा रहे हैं।
naspinski

वास्तव में इस मामले में, यह मेरे लिए अच्छा काम करता है, कई अन्य भी इस तरह से एक सुझाव देते हैं। मैंने इसे myview.rahulnivi.net/building-spa-angular-mvc-5 किताब से सीखा है !
vaheeds 19

2

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();
    }

यह चालू होना चाहिए, मैंने इसकी कोशिश की और यह काम कर गया।


2

यह प्रश्न पूछे जाने के बाद (और उत्तर दिया गया) कुछ समय बीत चुका है, लेकिन एक अन्य विकल्प सर्वर पर एक्सेप्ट हेडर को ओवरहाइड करने से रोकने के लिए है।

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;
    }
}

2

यहां सबसे आसान तरीका है जो मैंने अपने अनुप्रयोगों में उपयोग किया है। फ़ंक्शन 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 परिणाम वापस कर रहे हैं।


1

WebApiConfig वह स्थान है जहाँ आप कॉन्फ़िगर कर सकते हैं कि क्या आप json या xml में आउटपुट करना चाहते हैं। डिफ़ॉल्ट रूप से यह xml है। रजिस्टर फ़ंक्शन में हम आउटपुट को प्रारूपित करने के लिए HttpConfiguration Formatters का उपयोग कर सकते हैं। System.Net.Http.Headers => MediaTypeHeaderValue ("पाठ / html") को आउटपुट स्वरूप में प्राप्त करने के लिए आवश्यक है। यहां छवि विवरण दर्ज करें


1

फेलिप लेयसिन के उत्तर का उपयोग करते हुए वर्षों के लिए, कोर लाइब्रेरीज़ के हालिया अपडेट और Json.Net के बाद, मैं इसमें भाग लिया System.MissingMethodException: SupportedMediaTypes। मेरे मामले में समाधान, अप्रत्याशित रूप से एक ही अप्रत्याशित अपवाद का अनुभव करने वाले अन्य लोगों के लिए उपयोगी है, स्थापित करना है System.Net.Http। नुगेट स्पष्ट रूप से कुछ परिस्थितियों में इसे हटा देता है। मैन्युअल स्थापना के बाद, समस्या हल हो गई थी।


-3

मैं एक एपीआई में एक एकल उपयोग के मामले (GET) को बदलने के लिए कोडिंग की आवश्यकता के इतने सारे उत्तरों को देखकर हैरान हूं कि एक उचित उपकरण का उपयोग करने के बजाय जो एक बार स्थापित किया जाना है और किसी के लिए उपयोग किया जा सकता है एपीआई (स्वयं या तीसरे पक्ष) और सभी के बक्सों का इस्तेमाल करें।

तो अच्छा जवाब है:

  1. यदि आप केवल json या अन्य सामग्री प्रकार का अनुरोध करना चाहते हैं तो Requestly स्थापित करें या इसी तरह का एक टूल करें और हेडर स्वीकार करें।
  2. यदि आप POST का भी उपयोग करना चाहते हैं और आपके पास अच्छी तरह से स्वरूपित json, xml आदि हैं, तो Postman या ARC जैसे उचित API परीक्षण एक्सटेंशन का उपयोग करें ।

कुछ अतिरिक्त टूल और लाइब्रेरी के रूप में ब्लोट को जोड़े बिना चीजों को करना पसंद करते हैं।
tno2007

अभी भी केवल एपीआई में परिवर्तन करना गलत है क्योंकि कोई व्यक्ति नौकरी के लिए गलत टूल का उपयोग कर रहा है। एक वेब ब्राउज़र को एपीआई का परीक्षण करने के लिए डिज़ाइन नहीं किया गया है, यहां तक ​​कि एपीआई के आउटपुट को देखने के लिए नहीं बल्कि दस्तावेजों को देखने के लिए। यह और भी बुरा है अगर किसी को लगता है कि एपीआई परीक्षक उपकरण किसी भी एपीआई डेवलपर के लिए अनिवार्य टूलकिट के हिस्से के बजाय फूला हुआ है, और ईमानदारी से मैं फ्रंट एंड डेवलपर्स को भी जोड़ दूंगा क्योंकि उन्हें एपीआई के साथ भी बातचीत और प्रयोग करने की आवश्यकता है। यह भी शायद पर्याप्त नहीं है क्योंकि बिना एडिंस के ब्राउज़र हेडर सेट करने की अनुमति नहीं देता है, एक एपीआई पर पोस्ट करता है या यहां तक ​​कि प्रतिक्रिया हेडर का भी निरीक्षण करता है।
user3285954

मैं समझता हूं कि आप क्या कह रहे हैं और आप गलत नहीं हैं। लेकिन सिर्फ ऑफ-टॉपिक, आपके द्वारा डाउन-वोट किए जाने का कारण वह टोन है जिसमें आप प्रश्न का उत्तर देते हैं। आप बहुत जुझारू ध्वनि करते हैं और उस डेवलपर के रूप में आते हैं जो सोचते हैं कि वे सब कुछ जानते हैं, और यह बहुत ही अप्रिय है। मुझे यकीन है कि आप एक महान डेवलपर हैं, आपकी प्रतिक्रियाओं को देखते हुए। लेकिन, आपको इस तरह के एक पेशेवर क्यूए वातावरण में सीखना चाहिए, एक मित्र और अधिक मानवीय तरीके से लोगों को संबोधित करने और समझाने के लिए। शायद, पहले वे जो जवाब चाहते हैं, उसे दें, फिर बेहतर तरीके से समझाएँ, और प्रेरित करें कि यह बेहतर क्यों है।
tno2007
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.