$ .ajax - dataType


135

दोनों के बीच क्या अंतर है

contentType: "application/json; charset=utf-8",
dataType: "json",

बनाम

contentType: "application/json",
dataType: "text",

जवाबों:


181
  • contentTypeकिसी विशेष प्रारूप को निर्दिष्ट करते हुए सर्वर पर HTTP हेडर भेजा जाता है।
    उदाहरण: मैं JSON या XML भेज रहा हूं
  • dataTypeक्या आप jQuery को बता रहे हैं कि किस तरह की प्रतिक्रिया की उम्मीद है।
    JSON, या XML, या HTML, आदि की अपेक्षा करना डिफ़ॉल्ट रूप से jQuery के लिए है, इसे आज़माने और इसका पता लगाने के लिए।

$.ajax()प्रलेखन इन के संपूर्ण वर्णन भी है।


आपके विशेष मामले में, पहली प्रतिक्रिया के लिए पूछ रहा है UTF-8, दूसरा परवाह नहीं करता है। पहला भी प्रतिक्रिया को जावास्क्रिप्ट ऑब्जेक्ट के रूप में मान रहा है, दूसरा इसे एक स्ट्रिंग के रूप में मान रहा है।

तो पहला होगा:

success: function(data) {
  // get data, e.g. data.title;
}

द्वितीय:

success: function(data) {
  alert("Here's lots of data, just a string: " + data);
}

1
कौन सा अधिक पसंदीदा तरीका है या सबसे अधिक अनुशंसा करता है।
निक कहन

1
@ अडू - इसके लिए कोई सीधा जवाब नहीं, यह निर्भर करता है कि आप परिणाम के साथ क्या करना चाहते हैं ... वे 2 अलग-अलग चीजें कर रहे हैं। आदर्श रूप से, जब तक कि यह बहुत सरल परिणाम न हो, आप संभवतः JSON के साथ व्यवहार करना चाहते हैं, जिस स्थिति में पहला आसान होगा।
निक Craver

2
मूसा सही है, contentType इंगित करता है कि हम सर्वर (यानी पोस्ट बॉडी) को किस प्रारूप में भेज रहे हैं, न कि वापस क्या अनुरोध किया गया है।
एंटीइनोम

@antinome उन 2 को आमतौर पर बहुत जोड़ दिया जाता है, यह यहां कई जगहों पर स्टैक ओवरफ्लो पर मायने रखता है। कड़ाई से बोलते हुए कि वे स्वतंत्र हैं, मैंने इसे प्रतिबिंबित करने के लिए अपडेट किया है।
निक Craver

अभी भी कोई जगह नहीं है जो मुझे पता है कि क्या डिफ़ॉल्ट है, मेरा मतलब है कि im मैन्युअल जा रहा है, और प्रत्येक कॉल के बाद ऑब्जेक्ट का पुनर्निर्माण कर रहा है, लेकिन रीसेट करने में, समस्या हो रही है। अगर मैं इसे डिफ़ॉल्ट रूप में 'json' पर सेट करता हूं, तो किसी भी तरह से यह बुद्धिमान अनुमान को पूरक नहीं करेगा, लेकिन यह एक निश्चित सीमा तक काम करता है, जब तक कि यह उस कॉल तक नहीं पहुंच जाता जहां मैं निर्दिष्ट किया गया था (जो कि JSON कॉल ही नहीं है), तब अगर मैं इसे खाली स्ट्रिंग, या अशक्त करने के लिए सेट करता हूं, तो यह सब कुछ तोड़ देता है। क्या मैं 'डिफ़ॉल्ट' या f 'के लिए' Intellgent Guess 'की तरह कुछ सेट कर सकता हूं? तकनीकी डिफ़ॉल्ट क्या है, यानी दो उद्धरणों के बीच परिभाषित dataType = ""?
ब्लैंब

51

(पीएस: निक क्रेवर द्वारा दिया गया उत्तर गलत है)

contentType अनुरोध के भाग के रूप में सर्वर को भेजे जा रहे डेटा के प्रारूप को निर्दिष्ट करता है (इसे प्रतिक्रिया के हिस्से के रूप में भी भेजा जा सकता है, उस पर बाद में और अधिक)।

dataType क्लाइंट (ब्राउज़र) द्वारा प्राप्त किए जाने वाले डेटा के अपेक्षित प्रारूप को निर्दिष्ट करता है।

दोनों विनिमेय नहीं हैं।

  • contentTypeसर्वर को भेजा जाने वाला हेडर है, जो डेटा के प्रारूप को निर्दिष्ट करता है (यानी संदेश की सामग्री) सर्वर पर होने के नाते। इसका उपयोग POST और PUT अनुरोधों के साथ किया जाता है। आमतौर पर जब आप POST का अनुरोध भेजते हैं, तो संदेश निकाय में पैरामीटर जैसे पास होते हैं:

==============================

नमूना अनुरोध:

POST /search HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
<<other header>>

name=sam&age=35

==============================

"नाम = सम और आयु = 35" के ऊपर की अंतिम पंक्ति संदेश निकाय है और सामग्री टाइप इसे अनुप्रयोग / x-www-form-urlencoded के रूप में निर्दिष्ट करता है क्योंकि हम संदेश शरीर में प्रपत्र पैरामीटर पारित कर रहे हैं। हालाँकि हम केवल पैरामीटर भेजने तक सीमित नहीं हैं, हम json, xml भेज सकते हैं, ... इस तरह (विभिन्न प्रकार के डेटा भेजना विशेष रूप से Restful वेब सेवाओं के साथ उपयोगी है):

==============================

नमूना अनुरोध:

POST /orders HTTP/1.1
Content-Type: application/xml
<<other header>>

<order>
   <total>$199.02</total>
   <date>December 22, 2008 06:56</date>
...
</order>

==============================

तो इस बार ContentType है: Application / xml, कारण वही है जो हम भेज रहे हैं। उपरोक्त उदाहरणों ने नमूना अनुरोध दिखाया, इसी तरह सर्वर से प्रतिक्रिया भेजने पर सामग्री-प्रकार के हेडर को भी निर्दिष्ट किया जा सकता है जो यह बताता है कि सर्वर इस प्रकार है:

==============================

नमूना प्रतिक्रिया:

HTTP/1.1 201 Created
Content-Type: application/xml
<<other headers>>

<order id="233">
   <link rel="self" href="http://example.com/orders/133"/>
   <total>$199.02</total>
   <date>December 22, 2008 06:56</date>
...
</order>

==============================

  • dataTypeउम्मीद करने के लिए प्रतिक्रिया का प्रारूप निर्दिष्ट करता है। इसका शीर्षक Accept से संबंधित है। JQuery, सामग्री-प्रकार की प्रतिक्रिया के आधार पर इसका अनुमान लगाने की कोशिश करेगा।

==============================

नमूना अनुरोध:

GET /someFolder/index.html HTTP/1.1
Host: mysite.org
Accept: application/xml
<<other headers>>

==============================

उपरोक्त अनुरोध सर्वर से XML की अपेक्षा कर रहा है।

आपके प्रश्न के बारे में,

contentType: "application/json; charset=utf-8",
dataType: "json",

यहां आप UTF8 कैरेक्टर सेट का उपयोग करके json डेटा भेज रहे हैं, और आप सर्वर से json डेटा की अपेक्षा करते हैं। डेटा टाइप के लिए JQuery डॉक्स के अनुसार,

Json प्रकार एक डेटा ऑब्जेक्ट को जावास्क्रिप्ट ऑब्जेक्ट के रूप में पार्स करता है और परिणामी डेटा के रूप में निर्मित ऑब्जेक्ट को वापस करता है।

तो जो आपको सफलता हैंडलर में मिलती है वह उचित जावास्क्रिप्ट ऑब्जेक्ट है (JQuery आपके लिए json ऑब्जेक्ट को कनवर्ट करता है)

जहाँ तक

contentType: "application/json",
dataType: "text",

यहाँ आप JSON डेटा भेज रहे हैं, क्योंकि आपने JQuery डॉक्स के अनुसार एन्कोडिंग का उल्लेख नहीं किया है,

यदि कोई चारसेट निर्दिष्ट नहीं है, तो सर्वर के डिफ़ॉल्ट चारसेट का उपयोग करके डेटा सर्वर पर प्रेषित किया जाएगा; आपको सर्वर पर यह उचित रूप से डिकोड करना होगा।

और चूंकि डेटाटाइप को टेक्स्ट के रूप में निर्दिष्ट किया जाता है, आपको सफलता हैंडलर में जो मिलता है वह डेटा टेक्स्ट के लिए डॉक्स के अनुसार सादा टेक्स्ट है,

टेक्स्ट और xml प्रकार बिना किसी प्रोसेसिंग के डेटा लौटाते हैं। डेटा को केवल सफलता हैंडलर को दिया जाता है


7

डॉक्स के अनुसार :

  • "json": JSON के रूप में प्रतिक्रिया का मूल्यांकन करता है और एक जावास्क्रिप्ट ऑब्जेक्ट देता है। JQuery 1.4 में JSON डेटा को सख्त तरीके से पार्स किया गया है; किसी भी विकृत JSON को अस्वीकार कर दिया जाता है और एक पार्स त्रुटि डाली जाती है। (उचित JSON फॉर्मेटिंग के बारे में अधिक जानकारी के लिए json.org देखें।)
  • "text": एक सादा पाठ स्ट्रिंग।

2

जब आप एक साथ दो एपीआई कॉल करते हैं तो jQuery Ajax लोडर अच्छी तरह से काम नहीं कर रहा है। इस समस्या को हल करने के लिए आपको isAsyncअजाक्स सेटिंग में संपत्ति का उपयोग करके एक-एक करके एपीआई कॉल करना होगा। आपको यह भी सुनिश्चित करने की आवश्यकता है कि सेटिंग में कोई त्रुटि नहीं होनी चाहिए। अन्यथा, लोडर काम नहीं करेगा। उदाहरण के लिए अपरिभाषित सामग्री-प्रकार, POST / PUT / DELETE / GET कॉल के लिए डेटा-प्रकार।


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