2015-10-11 4 views
7

मैं अजाक्स अनुरोध में स्वीकार और डेटा टाइप के बीच अंतर को समझने की कोशिश कर रहा हूं। प्रलेखन राज्यों:डेटा टाइप बनाम स्वीकार करता है - अजाक्स अनुरोध

Documentation

स्वीकार करता है (डिफ़ॉल्ट: डेटा प्रकार पर निर्भर करता है) प्रकार: PlainObject सामग्री अनुरोध हेडर कि सर्वर प्रतिक्रिया किस तरह यह बदले में स्वीकार करेंगे बताता में भेजा प्रकार।

डेटा टाइप (डिफ़ॉल्ट: इंटेलिजेंट अनुमान (एक्सएमएल, जेसन, स्क्रिप्ट, या एचटीएमएल)) टाइप: स्ट्रिंग उस डेटा का प्रकार जिसे आप सर्वर से वापस उम्मीद कर रहे हैं।

असल में, क्या यह वही है ?, इसका एक ही उद्देश्य है।

accepts विकल्प आपको अनुरोध में Accept हैडर बदलने

जब आप इस विकल्प बदलने के लिए, अनुरोध में Accept हैडर सेट होंगे:

+2

"आप भेजते हैं" बनाम "आप उम्मीद कर रहे हैं" – SerCrAsH

+0

भेजने के लिए सामग्री है टाइप करें, मेरा प्रश्न डेटा के बारे में है टाइप करें और स्वीकार करता है कि उनमें से दोनों स्पष्ट रूप से सर्वर से अपेक्षा कर रहे हैं। –

+0

ऐसा लगता है कि सर्वर को यह बताने का तरीका है कि आप किस प्रकार का उत्तर चाहते हैं, यदि आपके पास ऑफ़र करने के कई विकल्प हैं, जबकि 'डेटा टाइप' वह है जिसे आप प्रतिक्रिया के रूप में उम्मीद कर रहे हैं, इसलिए प्रतिक्रिया मूल रूप से है पार्स। –

उत्तर

8

यहाँ एक, उम्मीद है कि, सटीक जवाब है निर्दिष्ट (ओं) के लिए। ध्यान दें कि यह एक स्ट्रिंग नहीं है, लेकिन एक ऑब्जेक्ट स्वीकृत प्रतिक्रियाओं के एमआईएमई प्रकार का मानचित्रण कर रहा है। { text: "text/plain", html: "text/html" } की तरह। अनुरोध द्वारा अपेक्षित प्रारूप में प्रतिक्रिया प्रदान करने के लिए Accept शीर्षलेख का उपयोग सर्वर द्वारा किया जा सकता है, या अगर यह अनुरोध द्वारा अपेक्षित स्वरूपों में से किसी एक में प्रतिक्रिया प्रदान नहीं कर पाता है तो विफल हो सकता है। headers: {Accept : "text/json"}:

वास्तव में एक महत्वपूर्ण बात यह है बजाय मैं headers विकल्प का उपयोग हैडर बदलने में कामयाब रहे, कि, कम से कम jQuery 1.11.3 (मैं कहाँ का परीक्षण) में, इस विकल्प काम नहीं कर किया जा रहा है है।

dataType विकल्प आपको पूर्व प्रक्रिया प्रतिक्रिया

जाने आप एक dataType को परिभाषित करते हैं, तो अनुरोध की प्रतिक्रिया jQuery द्वारा उत्तराधिकारी हैंडलर के लिए उपलब्ध होने से पहले पूर्व कार्रवाई की जाएगी। उदाहरण के लिए:

तो json निर्दिष्ट किया जाता है, प्रतिक्रिया पारित किया जा रहा से पहले jQuery.parseJSON उपयोग कर रहा है पार्स, एक वस्तु के रूप में, सफलता हैंडलर के लिए।

यदि script निर्दिष्ट है, $.ajax() एक स्ट्रिंग के रूप में सफलता हैंडलर पर जाने से पहले सर्वर से प्राप्त जावास्क्रिप्ट को निष्पादित करेगा।

"उदाहरण प्रकार" अनुभाग में अधिक उदाहरण here

यदि dataType सेट नहीं है, तो Content-Type प्रतिक्रिया का निर्धारण करेगा कि प्रतिक्रिया के लिए पूर्व-प्रसंस्करण क्या किया जाना चाहिए। ध्यान रखें कि dataType बदलना Accept हेडर भी बदल देगा। आमतौर पर Accept शीर्षलेख को अपने आप में बदलने की आवश्यकता नहीं है।

उदाहरण

अनुरोध।php

<?php 
if(strpos($_SERVER["HTTP_ACCEPT"],"text/javascript") === false) 
    exit("I only provide text/javascript responses"); 

echo "alert('This is my response!')"; 

index.html

<button id="send">Send</button> 
<div id="response"></div> 

<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script> 
<script> 
$(function(){ 

    $("#send").click(function(){ 
     $.ajax({ 
      method: "GET", 
      url: "request.php", 
      dataType: "script" // Change this to "text" and you will see the difference 
     }).done(function(data) { 
      $("#response").text(data); 
     }); 
    }); 


}); 
</script> 

dataType"script" पर सेट होने पर Accept शीर्ष लेख शामिल "text/javascript" तो request.php पर परीक्षा उत्तीर्ण करेंगे। यह "alert('This is my response!')" लौटाएगा और dataType पर सेट किया गया है "script" jQuery इसे जावास्क्रिप्ट के रूप में निष्पादित करने का प्रयास करेगा और फिर सफलता हैंडलर को सादे पाठ के रूप में पास करेगा।

आप को बदलते हैं dataType"text" को Accept हेडर को शामिल नहीं किये जाएंगे "text/javascript" तो request.php पर परीक्षण असफल हो जायेगी। यह "I only provide text/javascript responses" लौटाएगा और dataType को "text" पर सेट किया गया है, jQuery इसे सफलता हैंडलर को सादा पाठ के रूप में पास कर देगा।

+0

धन्यवाद अलवरो, यह एक अच्छा स्पष्टीकरण था। –

+2

मुझे हेडर का उपयोग करके 1.11.2 पर स्वीकार करने वाले शीर्षकों के साथ समस्याएं थीं: {स्वीकार करें: "एप्लिकेशन/जेसन"} ने इसे काम किया। कुछ कारणों से यह 'स्वीकार करें: */* 'भेज रहा था, भले ही सामग्री टाइप और डेट टाइप आदि सभी जेसन के लिए सेट किए गए थे। –

संबंधित मुद्दे