HTTP कंटेंट-टाइप हैडर और JSON


144

मैं हमेशा अज्ञात के डर के लिए HTTP प्रोटोकॉल के अधिकांश गुणों का उपयोग करने से बचने की कोशिश कर रहा हूं।

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

function ajaxHandler(response){
    alert(response.text);
}

और मैंने अपने PHP कोड में कंटेंट-टाइप हेडर सेट किया है:

header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));

मैं सीधे हैंडलर फ़ंक्शन से संपत्ति तक क्यों नहीं पहुंच सकता, जब ब्राउज़र को स्पष्ट रूप से बताया जाता है कि आने वाला डेटा है application/json?


अगर मैं सही तरीके से समझूं, तो आप textहैंडलर में जावास्क्रिप्ट चर के रूप में उपयोग करना चाहेंगे और प्रतिक्रिया नहीं? यह बहुत अजीब कार्यक्षमता होगी। Json_encode आपके PHP सरणी से 1 ऑब्जेक्ट भी बनाता है। इसलिए जब आप इसे जावास्क्रिप्ट में प्राप्त करते हैं, तो इसे एक चर को सौंपा जाना चाहिए।
फ्लैशिन

4
सामग्री टाइप हेडर केवल जानकारी है। ब्राउज़र का उपयोग करेगा कि यदि यह हो सकता है, लेकिन इस मामले में ब्राउज़र बस इसे अनदेखा करते हैं क्योंकि वे आमतौर पर नहीं जानते कि इरादा क्या है। आपका जावास्क्रिप्ट एप्लिकेशन इसका उपयोग कर सकता है। आप मान रहे हैं कि JSON प्रस्तुत किया जाएगा, इसलिए आप इसे डिकोड कर सकते हैं JSON.parse()। यदि गलत सामग्री टाइप दिखती है तो आप कुछ अलग कार्रवाई कर सकते हैं, या एक त्रुटि को लागू कर सकते हैं।

1
ब्राउज़र आपके लिए JSON टेक्स्ट को स्वचालित रूप से पार्स नहीं करता है, इसलिए response.textअभी भी एक स्ट्रिंग है।
nnnnnn

1
तो आप मुझे बताने का मतलब है कि उस हेडर को सेट करने से कोई फर्क नहीं पड़ता कि क्या कभी ऐसा हुआ है? यह अस्तित्व का उद्देश्य क्या है?
php_nub_qq

2
@php_nub_qq: इसका उद्देश्य आपको यह बताना है कि सर्वर ने क्या लौटाया है ताकि आपका एप्लिकेशन इसे अपने अनुसार संभाल सके। ब्राउज़र आप के लिए JSON पार्स नहीं होगा, अपने अनुप्रयोग है कि ऐसा करने के लिए की जरूरत है। यह शीर्ष लेख आपको बता रहा है कि यह (या JSON होना चाहिए)।
रॉकेट हज़मत

जवाबों:


136

Content-Typeशीर्ष लेख सिर्फ अपने आवेदन के लिए जानकारी के रूप में प्रयोग किया जाता है। ब्राउज़र को परवाह नहीं है कि यह क्या है। ब्राउज़र आपको AJAX कॉल से डेटा लौटाता है। यदि आप इसे JSON के रूप में पार्स करना चाहते हैं, तो आपको ऐसा करने की आवश्यकता है।

हेडर वहाँ है तो आपका ऐप यह पता लगा सकता है कि क्या डेटा वापस किया गया था और इसे कैसे संभालना चाहिए। आपको शीर्ष लेख को देखने की आवश्यकता है, और यदि यह application/jsonतब JSON के रूप में पार्स करता है।

यह वास्तव में है कि jQuery कैसे काम करता है। यदि आप यह नहीं बताते हैं कि परिणाम के साथ क्या करना है, तो यह Content-Typeपता लगाने के लिए उपयोग करता है कि इसके साथ क्या करना है।


12
यह पूरी तरह सच नहीं है। यदि आप उपयोग नहीं करते हैं header('Content-Type: application/json');और Content-Disposition: attachment; filename=myfile.jsonतब तक डाउनलोड करने के लिए बाध्य नहीं करते हैं, तो आप एक के साथ समाप्त करेंगे myfile.json.html। इस जसन हेडर का उपयोग करके, आपको मिलेगा myfile.json
रेमी ग्रुमे

4
@RemiGrumeau 'पूरी तरह से सच नहीं है' क्या है? ब्राउज़र के साथ फ़ाइलों को डाउनलोड करना कुछ पूरी तरह से अलग है। ब्राउज़र शायद HTML की अपेक्षा करने के लिए डिफ़ॉल्ट होगा, इसलिए यह कुछ भी ग्रहण करता है जो HTML है अन्यथा जब तक निर्दिष्ट नहीं किया जाता है। डाउनलोड करते समय, यह .htmlफ़ाइल पर निर्भर करता है, क्योंकि यही वह है जो इसे डिफॉल्ट करता है।
बज़्मैन

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

7

Content-Type: application/jsonकेवल सामग्री हेडर है। कंटेंट हेडर सिर्फ लौटाए गए डेटा के प्रकार के बारे में जानकारी है, उदा :: JSON, इमेज (png, jpg, आदि ..), html।

ध्यान रखें, जावास्क्रिप्ट में JSON एक सरणी या ऑब्जेक्ट है। यदि आप सभी डेटा देखना चाहते हैं, तो अलर्ट के बजाय कंसोल का उपयोग करें:

alert(response.text); // Will alert "[object Object]" string
console.log(response.text); // Will log all data objects

यदि आप मूल JSON सामग्री को स्ट्रिंग के रूप में सचेत करना चाहते हैं, तो एकल उद्धरण चिह्न (') जोड़ें:

echo "'" . json_encode(array('text' => 'omrele')) . "'";
// alert(response.text) will alert {"text":"omrele"}

दोहरे उद्धरण चिह्नों का उपयोग न करें। यह जावास्क्रिप्ट को भ्रमित करेगा, क्योंकि JSON प्रत्येक मूल्य और कुंजी पर दोहरे उद्धरण चिह्नों का उपयोग करता है:

echo '<script>var returndata=';
echo '"' . json_encode(array('text' => 'omrele')) . '"';
echo ';</script>';

// It will return the wrong JavaScript code:
<script>var returndata="{"text":"omrele"}";</script>

ऐसा कभी न करें, यह एकल उद्धरणों का उपयोग करके किसी भी तार पर टूट जाएगा (और यह कई भाषाओं में अक्सर होता है): echo "'" . json_encode(array('text' => 'it\'s wrong')) . "'"; इस टूटे हुए आउटपुट का उत्पादन करेगा '{"text":"it's wrong"}':। बजाय इस का उपयोग करें: json_encode(json_encode(array('text' => 'it\'s good')))। आउटकम सही ढंग से बच जाएगा:"{\"text\":\"it's wrong\"}"
PofMagicfingers

1

नीचे दिए गए कोड से मुझे जावास्क्रिप्ट के लिए सामने के छोर पर एक JSON ऑब्जेक्ट वापस करने में मदद मिलती है

मेरा टेम्पलेट कोड

template_file.json

{
    "name": "{{name}}"
}

अजगर समर्थित कोड

def download_json(request):
    print("Downloading JSON")
    # Response render a template as JSON object
    return HttpResponse(render_to_response("template_file.json",dict(name="Alex Vera")),content_type="application/json")    

फ़ाइल url.py

url(r'^download_as_json/$', views.download_json, name='download_json-url')

फ्रंट एंड के लिए jQuery कोड

  $.ajax({
        url:'{% url 'download_json-url' %}'        
    }).done(function(data){
        console.log('json ', data);
        console.log('Name', data.name);
        alert('hello ' + data.name);
    });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.