jQuery और AJAX प्रतिक्रिया हेडर


163

तो मुझे यह jQuery AJAX कॉल मिला है, और प्रतिक्रिया 302 रीडायरेक्ट के रूप में सर्वर से आती है। मैं इस रीडायरेक्ट को लेना चाहता हूं और इसे एक iframe में लोड करना चाहता हूं, लेकिन जब मैं हेडर की जानकारी को जावास्क्रिप्ट अलर्ट के साथ देखने की कोशिश करता हूं, तो यह अशक्त हो जाता है, भले ही फायरबग इसे सही तरीके से देखता है।

यहाँ कोड है, अगर यह मदद करेगा:

$j.ajax({
    type: 'POST',
    url:'url.do',
    data: formData,
    complete: function(resp){
        alert(resp.getAllResponseHeaders());
    }
});

URL को रिस्पॉन्स बॉडी में ले जाने के लिए मेरे पास वास्तव में सर्वर-साइड सामान तक पहुंच नहीं है, जो मुझे पता है कि सबसे आसान समाधान होगा, इसलिए हेडर के पार्सिंग के साथ कोई भी मदद शानदार होगी।


3
यदि आप 2017 में या बाद में इस प्रश्न का दौरा कर रहे हैं, तो कृपया मौजूदा उत्तरों में से अधिकांश के साथ समय बर्बाद न करें। यदि आपकी समस्या ओपी के समान है, तो आपके पास दो विकल्प हैं: 1) एक प्रॉक्सी सर्वर सेट करें जो postमूल सर्वर होगा और टारगेट-डेटा निकाल देगा और फ्रंट-एंड जेएस इस प्रॉक्सी-सर्वर को लक्ष्य-डेटा के लिए अनुरोध करेगा। या, 2) CORS की अनुमति देने के लिए सर्वर का कोड बदलें।
kmonsoor

जवाबों:


186

यदि आप jquery के पुराने संस्करण का उपयोग कर रहे हैं तो cballou का समाधान काम करेगा। नए संस्करणों में आप भी आज़मा सकते हैं:

  $.ajax({
   type: 'POST',
   url:'url.do',
   data: formData,
   success: function(data, textStatus, request){
        alert(request.getResponseHeader('some_header'));
   },
   error: function (request, textStatus, errorThrown) {
        alert(request.getResponseHeader('some_header'));
   }
  });

डॉक्स के अनुसार XMLHttpRequest ऑब्जेक्ट jQuery 1.4 के रूप में उपलब्ध है।


5
JQuery> = 1.5 के रूप में, इसे jXXHR कहा जाना चाहिए , जो कि XHR ऑब्जेक्ट का सुपरसेट है।
जोहान

136

यदि यह एक CORS अनुरोध है , तो आप डिबग टूल (जैसे Chrome-> निरीक्षण तत्व-> नेटवर्क) में सभी हेडर देख सकते हैं, लेकिन xHR ऑब्जेक्ट केवल हेडर को पुनः प्राप्त करेगा ( xhr.getResponseHeader('Header')यदि) तो ऐसा हेडर एक साधारण प्रतिक्रिया हेडर है :

  • Content-Type
  • Last-modified
  • Content-Language
  • Cache-Control
  • Expires
  • Pragma

यदि यह इस सेट में नहीं है, तो यह सर्वर द्वारा लौटाए गए एक्सेस-कंट्रोल-एक्सपोज़-हेडर्स हेडर में मौजूद होना चाहिए ।

प्रश्न के मामले के बारे में, यदि यह एक CORS अनुरोध है, तो कोई केवल Locationहेडर को XMLHttpRequestऑब्जेक्ट के माध्यम से पुनः प्राप्त करने में सक्षम होगा , और केवल यदि, नीचे हेडर भी मौजूद है:

Access-Control-Expose-Headers: Location

यदि इसका कोर्स अनुरोध नहीं है, XMLHttpRequestतो इसे पुनर्प्राप्त करने में कोई समस्या नहीं होगी।


3
@acdcjunior धन्यवाद, इसने मेरी मदद भी की, जब मैंने कुछ समय के लिए यह पता लगाने में लगा दिया कि हेडर रिस्पांस में कोई आउटपुट क्यों नहीं है
daniyel

33
 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });

1
मेरे लिए काम नहीं करता है। शायद मैं दूसरी साइट के लिए अनुरोध कर रहा हूं? (क्रॉस साइट अनुरोध ajax का उपयोग कर)
Siwei शेन '

9
ऐसे लोगों के लिए जो मेरे जैसा काम नहीं कर सकते थे। यह शायद इसलिए है क्योंकि आप एक क्रॉस डोमेन एक्सेस कर रहे हैं, जिसमें jquery XHR का उपयोग नहीं करता है। api.jquery.com/jQuery.get
h - n

एक आकर्षण की तरह .. +1
ErShakirAnsari

18

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

http://www.checkupdown.com/status/E302.html

The 302 response from the Web server should always include an alternative URL to which redirection should occur. If it does, a Web browser will immediately retry the alternative URL. So you never actually see a 302 error in a Web browser

इस विषय पर कुछ स्टैकओवरफ़्लो पोस्ट हैं। कुछ पोस्ट इस समस्या को हल करने के लिए हैक का वर्णन करती हैं।

JQuery Ajax कॉल के बाद पुनर्निर्देशित अनुरोध को कैसे प्रबंधित करें

जावास्क्रिप्ट में 302 FOUND को पकड़ना

HTTP पुनर्निर्देशित: 301 (स्थायी) बनाम 302 (अस्थायी)


10

JQuery द्वारा प्रयुक्त अंतर्निहित XMLHttpRequest ऑब्जेक्ट हमेशा 302 स्थिति कोड को वापस करने के बजाय चुपचाप रीडायरेक्ट का पालन करेगा । इसलिए, आप दिए गए URL को प्राप्त करने के लिए jQuery के AJAX अनुरोध कार्यक्षमता का उपयोग नहीं कर सकते। इसके बजाय, आपको सभी डेटा को फ़ॉर्म में रखना होगा और iframe की विशेषता के मूल्य के लिए सेट targetविशेषता के साथ फ़ॉर्म सबमिट करना होगा name:

$('#myIframe').attr('name', 'myIframe');

var form = $('<form method="POST" action="url.do"></form>').attr('target', 'myIframe');
$('<input type="hidden" />').attr({name: 'search', value: 'test'}).appendTo(form);

form.appendTo(document.body);
form.submit();

सर्वर का url.doपेज iframe में लोड किया जाएगा, लेकिन जब इसकी 302 स्थिति आती है, तो iframe को अंतिम गंतव्य पर पुनः निर्देशित किया जाएगा।


9

इसे इस्तेमाल करे:

type: "GET",
async: false,
complete: function (XMLHttpRequest, textStatus) {
    var headers = XMLHttpRequest.getAllResponseHeaders();
}

हम्म। प्रतिक्रिया के लिए बहुत बहुत धन्यवाद, लेकिन यह अभी भी अशक्त लौट रहा है। कोई अन्य विचार?
शेन

शायद आप jquery के पुराने संस्करण का उपयोग कर रहे हैं।
रॉवसेन 21'10

6

3 और लेटर के लिए अपडेट 2018

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन उपरोक्त समाधानों में से किसी ने भी मेरे लिए काम नहीं किया है। यहाँ समाधान है कि काम किया है:

//I only created this function as I am making many ajax calls with different urls and appending the result to different divs
function makeAjaxCall(requestType, urlTo, resultAreaId){
        var jqxhr = $.ajax({
            type: requestType,
            url: urlTo
        });
        //this section is executed when the server responds with no error 
        jqxhr.done(function(){

        });
        //this section is executed when the server responds with error
        jqxhr.fail(function(){

        })
        //this section is always executed
        jqxhr.always(function(){
            console.log("getting header " + jqxhr.getResponseHeader('testHeader'));
        });
    }

2

+1 toStStand और यहाँ मेरी अन्य हैक है:

खोज करने के बाद और पाया कि "क्रॉस अजाक्स अनुरोध" को एक्सएचआर ऑब्जेक्ट से प्रतिक्रिया हेडर नहीं मिल सका, मैंने छोड़ दिया। और इसके बजाय iframe का उपयोग करें।

1. <iframe style="display:none"></iframe>
2. $("iframe").attr("src", "http://the_url_you_want_to_access")
//this is my aim!!!
3. $("iframe").contents().find('#someID').html()  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.