2012-10-02 10 views
150

के बजाय JSON कैसे भेजें, jQueryquerystring के चरण में json को वास्तविक तरीके से कैसे भेज सकता है?jQuery AJAX, QueryString

$.ajax({ 
    url  : url, 
    dataType : 'json', // I was pretty sure this would do the trick 
    data  : data, 
    type  : 'POST', 
    complete : callback // etc 
}); 

वास्तव में हो जाएगा ताकि कन्वर्ट अपने ध्यान से एक querystring को json तैयार किया। कष्टप्रद चीजों में से एक यह है कि आपकी ऑब्जेक्ट में array: []array[]: [] में परिवर्तित हो जाएगी, शायद querysting की सीमाओं के कारण।

-update-

उचित विधि नीचे दिए गए उत्तर में पाया जा सकता:

$.ajax({ 
    url  : url, 
    dataType : 'json', 
    contentType: 'application/json; charset=UTF-8', // This is the money shot 
    data  : data, 
    type  : 'POST', 
    complete : callback // etc 
}); 

कृपया ध्यान दें कि इस उचित CORS हेडर सर्वर साइड की आवश्यकता है, और कुछ उदाहरणों के विपरीत नेट पर, अनुमति-शीर्षलेख वाइल्डकार्ड का उपयोग नहीं कर सकता। (अनुमति दें-उत्पत्ति कर सकते हैं।)

{ 
    Content-Type     : 'application/json', 
    Access-Control-Allow-Origin : '*', 
    Access-Control-Allow-Headers : 'Content-Type' // You cannot use '*' 
} 

-update-

कृपया ध्यान दें कि jQuery अब दो अनुरोध, एक हाथ मिलाना और एक वास्तविक सामग्री के साथ पूरा करने के लिए भेज देंगे। यह सामान्य HTTP व्यवहार है जिसे प्री-फ्लाइट कहा जाता है। यह निर्धारित करने के लिए कि सर्वर वास्तव में नियोजित अनुरोध के साथ संगत है या नहीं, पहला अनुरोध एक विकल्प शीर्षलेख होगा।

तो यह ध्यान रखें यदि आप अपने सर्वर बहुमुखी होना चाहता हूँ, एक QueryString केवल एक अनुरोध भेजता है का उपयोग कर। सही का उपयोग करना JSON कम से कम दो अनुरोध भेजता है, एक हैंडशेक के लिए।

यह मेरे सिर से गड़बड़ कर रहा था, इसलिए मैंने सोचा कि मैं आपको (संभावित पाठक) को पहले से ही बता दूंगा।

+6

'डेटा टाइप' का डेटा कैसे भेजा जाता है इस पर कोई असर नहीं पड़ता है। यह केवल निर्दिष्ट करता है कि कॉल के द्वारा ** किस प्रकार का डेटा ** ** ** लौटाया गया है। यदि आप सर्वर को इंगित करना चाहते हैं कि आप किस प्रकार के डेटा को 'डेटा' प्रॉपर्टी में निर्दिष्ट कर रहे हैं, तो आपको 'contentType' प्रॉपर्टी 'कंटेंट टाइप टाइप करें:" एप्लिकेशन/जेसन "' – Nope

+0

स्पष्टीकरण के लिए धन्यवाद। लेकिन उस स्थिति में, अगर प्रतिक्रिया में सामग्री-प्रकार शीर्षलेख प्रदान कर रहा है, तो मुझे प्रतिक्रिया प्रकार क्लाइंट-साइड निर्दिष्ट करने की आवश्यकता क्यों है? – Redsandro

+2

आपको इसे निर्दिष्ट करने के लिए * नहीं है, डिफ़ॉल्ट रूप से jQuery प्रतिक्रिया के एमआईएम प्रकार के आधार पर एक बुद्धिमान अनुमान लगाने का प्रयास करेगा। हालांकि, इसे निर्दिष्ट करके आप jQuery को स्पष्ट रूप से बता रहे हैं कि आप सर्वर से किस प्रकार की अपेक्षा कर रहे हैं और jQuery उस प्रकार की ऑब्जेक्ट को प्रतिक्रिया को बदलने का प्रयास करेगा। इसे निर्दिष्ट नहीं करते हैं और jQuery को छोड़कर अनुमान लगाना परिणामस्वरूप jQuery को एक अप्रत्याशित प्रारूप में प्रतिक्रिया को परिवर्तित कर सकता है, भले ही आपने सर्वर से JSON भेजा हो। डेटा टाइप पर अधिक जानकारी के लिए प्रलेखन की जांच करें: http://api.jquery.com/jQuery.ajax/ – Nope

उत्तर

211

आपको अपनी ऑब्जेक्ट JSON पर क्रमबद्ध करने के लिए JSON.stringify का उपयोग करने की आवश्यकता है, और फिर सामग्री-प्रकार निर्दिष्ट करें ताकि आपका सर्वर इसके JSON को समझ सके। इस चाल करना चाहिए: समर्थन जावास्क्रिप्ट 1.7/ECMAScript 5 या बाद

$.ajax({ 
    url: url, 
    type: "POST", 
    data: JSON.stringify(data), 
    contentType: "application/json", 
    complete: callback 
}); 

ध्यान दें कि JSON वस्तु ब्राउज़रों में मूल रूप से उपलब्ध है। यदि आपको विरासत समर्थन की आवश्यकता है तो आप json2 का उपयोग कर सकते हैं।

+12

यह काम नहीं करेगा, आप 'सामग्री टाइप:' एप्लिकेशन/जेसन गायब हैं ' '। – Ohgodwhy

+0

@ ओहगोद्वी ओह हाँ। यह थोड़ा तेज़ हो गया;) – mekwall

+1

वहां हम जाते हैं, अब यह काम करेगा। +1 – Ohgodwhy

26

नहीं, dataType option प्राप्त डेटा को पार्स करने के लिए है।

JSON पोस्ट करने के लिए, आपको इसे JSON.stringify के माध्यम से स्वयं को स्ट्रिंग करना होगा और processData विकल्प false पर सेट करना होगा।

$.ajax({ 
    url: url, 
    type: "POST", 
    data: JSON.stringify(data), 
    processData: false, 
    contentType: "application/json; charset=UTF-8", 
    complete: callback 
}); 

ध्यान रखें कि सभी ब्राउज़रों का समर्थन JSON वस्तु, और हालांकि jQuery .parseJSON है, यह कोई stringifier शामिल है; आपको एक और पॉलीफिल लाइब्रेरी की आवश्यकता होगी।

+2

पोस्ट किया है 'प्रक्रिया डेटा' को 'false' पर सेट करना जरूरी नहीं है क्योंकि 'JSON.stringify' पहले से ही एक स्ट्रिंग देता है। – mekwall

+0

@MarcusEkwall: Afaik यह अभी भी 'encodeURIComponent'ed होगा, है ना? – Bergi

+0

ठीक है, इसकी आवश्यकता नहीं हो सकती है, लेकिन क्या आपको सच में लगता है कि यह अनुरोध विफल हो जाएगा? – Bergi

1

यदि आप इसे वापस एएसपीनेट पर भेज रहे हैं और request.form में डेटा की आवश्यकता है [] तो आपको सामग्री प्रकार को "एप्लिकेशन/एक्स-www-form-urlencoded" सेट करना होगा; charset = utf- 8 "

मूल पोस्ट here

दूसरे डाटाटाइप से छुटकारा पाने के लिए, अपने लिए एक वापसी के बाद असफल होने से पहले के बारे में 4 मिनट के लिए इंतजार करेंगे उम्मीद नहीं है। here

5

देखें मैं ASP.NET MVC जैसे कई आर्किटेक्चर पता है निर्मित JSON.stringify contentType के रूप में मेरी स्थिति थोड़ा अलग है संभाल करने के लिए कार्यक्षमता तो शायद यह भविष्य में किसी की मदद कर सकते हैं। मुझे पता है कि यह मुझे घंटे बचा लेगा!

चूंकि मेरे http अनुरोधों को एक अलग सबडोमेन पर आईबीएम (एएस 400 पर्यावरण) से एक सीजीआई एपीआई द्वारा संभाला जा रहा है, इसलिए ये अनुरोध क्रॉस मूल हैं, इसलिए jsonp। मैं वास्तव में जावास्क्रिप्ट ऑब्जेक्ट के माध्यम से अपना AJAX भेजता हूं। यहां मेरे AJAX POST का एक उदाहरण दिया गया है:

var data = {USER : localProfile, 
     INSTANCE : "HTHACKNEY", 
     PAGE : $('select[name="PAGE"]').val(), 
     TITLE : $("input[name='TITLE']").val(), 
     HTML : html, 
     STARTDATE : $("input[name='STARTDATE']").val(), 
     ENDDATE : $("input[name='ENDDATE']").val(), 
     ARCHIVE : $("input[name='ARCHIVE']").val(), 
     ACTIVE : $("input[name='ACTIVE']").val(), 
     URGENT : $("input[name='URGENT']").val(), 
     AUTHLST : authStr}; 
     //console.log(data); 
     $.ajax({ 
      type: "POST", 
      url: "http://www.domian.com/webservicepgm?callback=?", 
      data: data, 
      dataType:'jsonp' 
     }). 
     done(function(data){ 
     //handle data.WHATEVER 
     }); 
+2

इस प्रश्न में अधिक ज्ञान जोड़ने के लिए धन्यवाद! संतोषजनक उत्तर पहले से ही दिया गया था, लेकिन मैंने तुम्हारा उत्थान किया। – Redsandro