JQuery.ajax में 'एप्लिकेशन / json' के लिए सामग्री-प्रकार सेट नहीं कर सकते


106

जब मेरे पास यह कोड है

$.ajax({
    type: 'POST',
    //contentType: "application/json",
    url: 'http://localhost:16329/Hello',
    data: { name: 'norm' },
    dataType: 'json'
});

Fiddler में मैं कच्चे अनुरोध के बाद देख सकता हूं

POST http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:14693/WebSite1/index.html
Content-Length: 9
Origin: http://localhost:14693
Pragma: no-cache
Cache-Control: no-cache

name=norm

लेकिन मैं जो कोशिश कर रहा हूं वह एप्लिकेशन / x-www-www-form-urlencoded से एप्लिकेशन / json तक सामग्री-प्रकार सेट करने के लिए है । लेकिन यह कोड

$.ajax({
    type: "POST",
    contentType: "application/json",
    url: 'http://localhost:16329/Hello',
    data: { name: 'norm' },
    dataType: "json"
});

विचित्र अनुरोध उत्पन्न करता है (जिसे मैं फिडलर में देख सकता हूं)

OPTIONS http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://localhost:14693
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

ऐसा क्यों है? जब वहाँ POST होना चाहिए तो विकल्प क्या है? और मेरा कंटेंट-टाइप एप्लीकेशन / जसन के लिए कहाँ सेट है? और अनुरोध पैरामीटर किसी कारण से चले गए हैं।

अद्यतन १

सर्वर की ओर मैं वास्तव में सरल सेवा है।

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class RestfulService : IRestfulService
{
    [WebInvoke(
        Method = "POST",
        UriTemplate = "Hello",
        ResponseFormat = WebMessageFormat.Json)]
    public string HelloWorld(string name)
    {
        return "hello, " + name;
    }
}

लेकिन किसी कारण से मैं इस पद्धति को मापदंडों के साथ नहीं कह सकता।

अद्यतन २

इतने लंबे समय तक जवाब न देने के लिए क्षमा करें।

मैंने अपने सर्वर की प्रतिक्रिया में इन शीर्षकों को जोड़ा है

 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: Content-Type
 Access-Control-Allow-Methods: POST, GET, OPTIONS

यह मदद नहीं की, मेरे पास सर्वर से त्रुटि की अनुमति नहीं है।

यहाँ मेरे फिडलर का कहना है

यहां छवि विवरण दर्ज करें

इसलिए, अब मैं यह सुनिश्चित कर सकता हूं कि मेरा सर्वर POST, GET, OPTIONS स्वीकार करता है (यदि रिस्पॉन्स हेडर काम करता है जैसे मुझे उम्मीद है)। लेकिन "विधि की अनुमति नहीं है" क्यों?

सर्वर से WebView प्रतिक्रिया में (आप ऊपर चित्र पर रॉ की प्रतिक्रिया देख सकते हैं ) ऐसा दिखता है

यहां छवि विवरण दर्ज करें


2
आपको JSON.stringfy () विधि की कोशिश करनी चाहिए
सिंह

इधर देखो। यह मेरे लिए बहुत अच्छा काम करता है: stackoverflow.com/questions/9754767/…
फंदा

मैं एक ही मुद्दा है, लेकिन मैं NodeJS के साथ काम कर रहा हूँ बैकएंड के रूप में, मैं भी न केवल स्वीकार किए जाने के लिए सभी वैकल्पिक अनुरोध सेट करता हूं, बल्कि सभी वैकल्पिक अनुरोधों पर 200 की प्रतिक्रिया देने के लिए ताकि बाकी याचिकाएं अपेक्षित रूप से काम करें कोई प्रतिक्रिया के साथ ...
HeberLZ

1
हाय @VitaliiKorsakov। क्या आपने अपनी समस्या हल कर ली है? मैं एक ही समस्या को पूरा करता हूं, अर्थात कंटेंट टाइप को संशोधित नहीं कर सकता।
दुनियादार

1
मेरे पास एक ही समस्या थी और बस काम कर रहा था .. समाधान इस पृष्ठ पर उत्तर में है: stackoverflow.com/questions/20295080/… .. इस पर योग करें: "जब सामग्री का उपयोग कर रहे हों: 'आवेदन / json' $ _POST पर निर्भर होने में सक्षम नहीं है। $ _POST केवल फ़ॉर्म-एन्कोडेड सामग्री प्रकारों के लिए आबादी है। इस प्रकार, आपको PHP कच्चे इनपुट से अपना डेटा पढ़ने की आवश्यकता है ".. मुझे लगता है कि अब आप सर्वर पर php का उपयोग नहीं कर रहे हैं। पक्ष लेकिन उम्मीद है कि यह जानकारी किसी तरह से मदद करती है।
सारा

जवाबों:


91

ऐसा लगता है कि http://यूआरएल विकल्प से हटाने से सही HTTP POST हेडर भेजा जाता है।

मुझे नहीं लगता कि आपको मेजबान के नाम को पूरी तरह से अर्हता प्राप्त करने की आवश्यकता है, बस नीचे के रूप में एक रिश्तेदार URL का उपयोग करें।

   $.ajax({
      type: "POST",
      contentType: "application/json",
      url: '/Hello',
      data: { name: 'norm' },
      dataType: "json"
   });

मेरा एक उदाहरण जो काम करता है:

        $.ajax({
            type: "POST",
            url: siteRoot + "api/SpaceGame/AddPlayer",
            async: false,
            data: JSON.stringify({ Name: playersShip.name, Credits: playersShip.credits }),
            contentType: "application/json",
            complete: function (data) {
            console.log(data);
            wait = false;
        }
    });

संभवतः संबंधित: jQuery $ .ajax (), $ .post "विकल्प" भेजने के रूप में फ़ायरफ़ॉक्स में REQUEST_METH

संपादित करें: कुछ और शोध के बाद मुझे पता चला कि क्या ऑप्शन हेडर का उपयोग यह जानने के लिए किया जाता है कि ओरिजिनल डोमेन से अनुरोध की अनुमति है या नहीं। फ़िडलर का उपयोग करते हुए, मैंने अपने सर्वर से रिस्पॉन्स हेडर के लिए निम्नलिखित जोड़ा।

 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: Content-Type
 Access-Control-Allow-Methods: POST, GET, OPTIONS

एक बार जब ब्राउज़र को यह प्रतिक्रिया मिल गई तो उसने json डेटा के साथ सही POST अनुरोध भेज दिया। ऐसा लगता है कि डिफ़ॉल्ट फ़ॉर्म-urlencoded सामग्री प्रकार सुरक्षित माना जाता है और इसलिए अतिरिक्त क्रॉस डोमेन चेक से गुजरना नहीं होता है।

ऐसा लगता है कि आपको पहले बताए गए हेडर को विकल्प अनुरोध में अपने सर्वर की प्रतिक्रिया में जोड़ना होगा। आपको निश्चित रूप से विशिष्ट डोमेन से अनुरोधों की अनुमति देने के लिए उन्हें कॉन्फ़िगर करना चाहिए।

इसका परीक्षण करने के लिए मैंने निम्नलिखित jQuery का उपयोग किया।

$.ajax({
   type: "POST",
   url: "http://myDomain.com/path/AddPlayer",
   data: JSON.stringify({
      Name: "Test",
       Credits: 0
   }),
   //contentType: "application/json",
   dataType: 'json',
   complete: function(data) {
       $("content").html(data);
  }
});​

संदर्भ:


मैं क्लाइंट और सर्वर के बीच कपलिंग को ढीला करना चाहता हूं। सर्वर रेस्टफुल सर्विस है और इस सर्विस के सभी क्लाइंट को इसके बारे में पता होना चाहिए।
विटालि कोर्साकोव

क्या आप इस प्रश्न के परिदृश्य के बारे में अपनी पोस्ट में कुछ और जानकारी प्रदान कर सकते हैं? यदि आपके ग्राहक विभिन्न डोमेन पर जा रहे हैं, तो आप एक ही मूल मुद्दों का सामना कर सकते हैं।
माइक वेड

मैंने सर्वर साइड के बारे में अतिरिक्त जानकारी पोस्ट की है। अभी सर्वर और क्लाइंट दोनों लोकलहोस्ट पर हैं लेकिन पोर्ट में भिन्न हैं। बाद में वे सबसे अधिक संभावना विभिन्न डोमेन पर होंगे।
विटालि कोर्साकोव

ऐसा लगता है कि जिस मुद्दे का आप अनुभव कर रहे हैं, वही मूल नीति के साथ करना है, यह jsonp को देखने के लायक हो सकता है और इन लिंक के अलावा मेरे सवाल से जुड़ा हुआ प्रश्न - संबंधित प्रश्नjquery क्रॉस डोमेन गाइड - मुझे क्रॉस डोमेन अनुरोधों के साथ बहुत अनुभव नहीं है, लेकिन उम्मीद है कि वे लिंक आपके उपयोग के लिए होंगे।
माइक वेड

मुझे नहीं लगता कि यह एक समस्या है क्योंकि जब मैं किसी भी पैरामीटर को पारित नहीं करता हूं तो सब कुछ ठीक रहता है और सामग्री-प्रकार अनुप्रयोग / x-www-form-urlencoded है। लेकिन मुझे किसी भी पैरामीटर को पास नहीं करने पर POST अनुरोध की आवश्यकता नहीं है।
विटालि कोर्साकोव

41

मैं आपको दिखा सकता हूं कि मैंने इसका उपयोग कैसे किया

  function GetDenierValue() {
        var denierid = $("#productDenierid").val() == '' ? 0 : $("#productDenierid").val();
        var param = { 'productDenierid': denierid };
        $.ajax({
            url: "/Admin/ProductComposition/GetDenierValue",
            dataType: "json",
            contentType: "application/json;charset=utf-8",
            type: "POST",
            data: JSON.stringify(param),
            success: function (msg) {
                if (msg != null) {
                    return msg.URL;
                }
            }
        });
    }

अगले उत्तर में भी यही बात है। मैं सर्वर पर url निर्दिष्ट नहीं कर सकता, जहां सभी सेवा कार्यों की मेजबानी की जाती है
विटालि कोर्साकोव

@VitaliiKorsakov मैं चला गया, क्या आपने अपनी समस्या सुलझा ली है।
अमृतपाल सिंह

जवाब के लिए धन्यवाद! मेरा मानना ​​है कि यह कहीं और वर्तनी नहीं है। यह ज़रूर लगता है कि जब आप निर्दिष्ट प्रकार 'Json' है, तो JQuery को json पोस्ट करेगा, लेकिन मुझे नहीं लगता ...
जेसन Goemaat

1
@ JasonGoemaat jT में डेटा टाइप पैरामीटर केवल रिस्पॉन्स बॉडी को पार्स करने के लिए उपयोग किया जाता है। यदि आप दस्तावेज़ पढ़ते हैं, तो आप देखेंगे कि इसकी आवश्यकता भी नहीं है। डेटाटाइप के लिए डिफ़ॉल्ट मान बुद्धिमान अनुमान है। आपकी समस्या यह है कि jquery में डेटा विशेषता कॉन्फ़िगर करने योग्य नहीं है। आप नहीं बता सकते हैं कि कैसे jquery को डेटा ऑब्जेक्ट को पार्स करना चाहिए। इसीलिए आपको पहले json को serialize करना होगा। क्योंकि jquery केवल url-form-encode
Lo Fac Faure-Lacroix

12

तो आप यह करने के लिए काम करने के लिए सभी की जरूरत है जोड़ने के लिए है:

headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
}

आपके पोस्ट अनुरोध के क्षेत्र के रूप में और यह काम करेगा।


api.jquery.com/jquery.ajax यदि आप दस्तावेज़ में देखते हैं तो यह कहता है कि इसे निर्दिष्ट किए बिना 'एप्लिकेशन / x-www-form-urlencoded में चूक; charset = UTF-8 '(यही वजह है कि ऐसा हो रहा है। सिर्फ सामग्री सेट करना क्यों आसान है, हालांकि यह काम नहीं करता है। आप जाँच सकते हैं कि आपके पास jQuery का कौन सा संस्करण है और यदि आप पुराने संस्करण में हैं तो अपडेट करें)।
कोड़ी जाक

ये काम नहीं कर रहा है। मेरे पास होते हुए type: "POST"भी यह भेज रहा है OPTIONS
user9645

5

मैंने उन स्क्रीन को पहचाना, मैं CodeFluentEntities का उपयोग कर रहा हूं, और मुझे समाधान मिल गया है जो मेरे लिए भी काम करता है।

मैं उस निर्माण का उपयोग कर रहा हूं:

$.ajax({
   url: path,
   type: "POST",
   contentType: "text/plain",
   data: {"some":"some"}
}

जैसा कि आप देख सकते हैं, अगर मैं उपयोग करता हूं

contentType: "",

या

contentType: "text/plain", //chrome

सब कुछ ठीक काम करता है।

मुझे यकीन नहीं है कि यह 100% है जिसकी आपको आवश्यकता है, क्योंकि मैंने हेडर भी बदल दिए हैं।


5

यदि आप इसका उपयोग करते हैं:

contentType: "application/json"

AJAX सर्वर को GET या POST पैरामेट्स नहीं भेजेगा .... पता नहीं क्यों।

आज मुझे इसे समझने में घंटों लग गए।

महज प्रयोग करें:

$.ajax(
  { url : 'http://blabla.com/wsGetReport.php',
    data : myFormData, type : 'POST', dataType : 'json', 
    // contentType: "application/json", 
    success : function(wsQuery) { }
  }
)

1
दुख की बात है मेरे लिए सही जवाब। OIT कंटेंट टाइप करें और बस डेटाटाइप का उपयोग करें CORS विकल्प कचरे को बायपास करने के लिए जो कई सेवाओं को ठीक से लागू नहीं करते हैं। गुस्सा कर देने वाला।

2

मुझे इस समस्या का हल यहां मिला । IIS ऐप सेवा हैंडलर पर क्रिया विकल्प की अनुमति देना न भूलें।

ठीक काम करता है। शुक्रिया आंद्रे पेड्रोसो। :-)


1

मेरी भी यही समस्या थी। मैं jboss सर्वर पर एक जावा रेस्ट ऐप चला रहा हूं। लेकिन मुझे लगता है कि समाधान एएसपी .NET वेबएप पर समान है।

फ़ायरफ़ॉक्स आपके सर्वर के लिए एक प्री कॉल करता है / बाकी यूआरएल की जाँच करने के लिए कि कौन से विकल्प की अनुमति है। यह "विकल्प" अनुरोध है जो आपके सर्वर के अनुसार जवाब नहीं देता है। यदि इस विकल्प कॉल का उत्तर सही है तो दूसरी कॉल की जाती है जो कि json सामग्री के साथ वास्तविक "POST" अनुरोध है।

यह केवल क्रॉस-डोमेन कॉल करते समय होता है। आपके मामले में http://localhost:16329/Helloएक ही डोमेन '/ हैलो' के तहत url पथ पर कॉल करने के बजाय ''

यदि आप एक क्रॉस डोमेन कॉल करने का इरादा रखते हैं, तो आपको एनोटेट विधि के साथ अपने बाकी सेवा वर्ग को बढ़ाना होगा "विकल्प" http अनुरोध का समर्थन करता है। यह जावा कार्यान्वयन के अनुसार है:

@Path("/rest")
public class RestfulService {

    @POST
    @Path("/Hello")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public string HelloWorld(string name)
    {
        return "hello, " + name;
    }

//THIS NEEDS TO BE ADDED ADDITIONALLY IF MAKING CROSS-DOMAIN CALLS

    @OPTIONS
    @Path("/Hello")
    @Produces(MediaType.TEXT_PLAIN+ ";charset=utf-8")
    public Response checkOptions(){
        return Response.status(200)
        .header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Headers", "Content-Type")
        .header("Access-Control-Allow-Methods", "POST, OPTIONS") //CAN BE ENHANCED WITH OTHER HTTP CALL METHODS 
        .build();
    }
}

इसलिए मुझे लगता है कि .NET में आपको एनोटेट के साथ एक अतिरिक्त तरीका जोड़ना होगा

[WebInvoke(
        Method = "OPTIONS",
        UriTemplate = "Hello",
        ResponseFormat = WebMessageFormat.)]

जहां निम्नलिखित हेडर सेट किए गए हैं

.header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Headers", "Content-Type")
        .header("Access-Control-Allow-Methods", "POST, OPTIONS")

0

मुझे jquery ajax के माध्यम से POST अनुरोध द्वारा JSON डेटा भेजने का समाधान मिला। मैंने कोड के नीचे इस्तेमाल किया

    var data = new Object();
    data.p_clientId = 4;
    data =  JSON.stringify(data);

    $.ajax({
      method: "POST",
      url: "http://192.168.1.141:8090/api/Client_Add",
      data: data,
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'text/plain'
    }
    })
      .done(function( msg ) {
        alert( "Data Saved: " + msg );
      });


        });
    });

मैंने 'Content-Type': 'text/plain'कच्चे json डेटा भेजने के लिए हेडर में उपयोग किया ।
क्योंकि यदि हम Content-Type: 'application/json'विकल्प में परिवर्तित अनुरोध विधियों का उपयोग करते हैं, लेकिन Content-Type: 'test/plain'विधि का उपयोग करके परिवर्तित नहीं होता है और POST के रूप में रहता है। उम्मीद है कि यह कुछ मदद करेगा।


3
यह वास्तव में विकल्प में परिवर्तित नहीं हो रहा है, यह देखने के लिए कि क्या पोस्ट की अनुमति है, यह देखने के लिए एक कोर प्रीफेलाइट अनुरोध भेज रहा है। जब यह वापस नहीं आता है, तो POST नहीं होता है।

0

हाय इन दो पंक्तियों ने मेरे लिए काम किया।

कंटेंट टाइप: "एप्लीकेशन / जसन; चारसेट = यूटीएफ -8", डेटाटाइप: "जसन"

 $.ajax({
            type: "POST",
            url: "/v1/candidates",
            data: obj,
            **contentType:"application/json; charset=utf-8",
            dataType:"json",**
            success: function (data) {
                table.row.add([
                    data.name, data.title
                ]).draw(false);
            }

धन्यवाद, प्रशांत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.