jQuery та заголовок відповіді AJAX


163

Тому я отримав цей виклик jQuery AJAX, і відповідь надходить від сервера у вигляді перенаправлення 302. Я хотів би взяти це переспрямування і завантажити його в iframe, але коли я намагаюся переглянути інформацію заголовка з попередженням JavaScript, він стає нульовим, навіть якщо firebug бачить його правильно.

Ось код, якщо він допоможе:

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

Я не маю доступу до ресурсів на сервері для того, щоб перенести URL-адресу до тіла відповідей, що, як я знаю, було б найпростішим рішенням, тому будь-яка допомога з розбором заголовка була б фантастичною.


3
якщо ви відвідуєте це питання у 2017 році чи пізніше, не витрачайте час на більшість існуючих відповідей. Якщо ваша проблема збігається з ОП, у вас є два варіанти: 1) налаштувати проксі-сервер, який буде postоригінальним сервером і витягує цільові дані, а передній JS запитає цей проксі-сервер для цільових даних. Або 2) змінити код сервера, щоб дозволити CORS.
kmonsoor

Відповіді:


186

Рішення cballou працюватиме, якщо ви використовуєте стару версію jquery. У нових версіях ви також можете спробувати:

  $.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, його слід називати jqXHR , який є надмножиною об'єкта XHR.
Йоган

136

Якщо це запит CORS , ви можете побачити всі заголовки в інструментах налагодження (наприклад, Chrome-> Inspect Element-> Network), але об’єкт xHR отримає заголовок (via xhr.getResponseHeader('Header')) лише тоді, коли такий заголовок є простим заголовком відповіді :

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

Якщо його немає в цьому наборі, він повинен бути присутнім у заголовку Access-Control-Expose-Headers, поверненому сервером.

Щодо розглядуваного випадку, якщо це запит CORS, ви зможете отримати Locationзаголовок через XMLHttpRequestоб’єкт лише тоді, і лише тоді, якщо заголовок нижче також присутній:

Access-Control-Expose-Headers: Location

Якщо це не запит CORS, не XMLHttpRequestбуде проблем із його отриманням.


3
@acdcjunior спасибі, мені це допомогло і після того, як я вклав деякий час, щоб з'ясувати, чому не було результату у відповіді заголовка
daniyel

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

1
не працює для мене. можливо я роблю запит на інший сайт? (запит на веб-сайт за допомогою ajax)
Siwei Shen 申思维

9
Для людей, які не могли його працювати, як я. Можливо, тому, що ви робите міждоменний доступ, jquery не використовує XHR. api.jquery.com/jQuery.get
h - n

Прокинувся як шарм .. +1
ErShakirAnsari

18

Невдала правда про AJAX та переспрямування 302 полягає в тому, що ви не можете отримати заголовки з повернення, оскільки браузер ніколи їх не дає XHR. Коли браузер бачить номер 302, він автоматично застосовує переспрямування. У цьому випадку ви побачили б заголовок у firebug, оскільки браузер його отримав, але ви не бачили б його в ajax, оскільки браузер не передав його. Ось чому ніколи не викликають обробників успіху та помилок. Викликається лише повний обробник.

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

Ось декілька публікацій stackoverflow на цю тему. У деяких публікаціях описані хаки, щоб обійти цю проблему.

Як керувати запитом на переадресацію після виклику jQuery Ajax

Ловля 302 ЗНАЙДЕНО в JavaScript

Переспрямування HTTP: 301 (постійне) проти 302 (тимчасове)


10

Основний об'єкт XMLHttpRequest, використовуваний jQuery , завжди мовчки слідкувати за переспрямуванням, а не повертає код стану 302. Тому ви не можете використовувати функцію запиту AJAX jQuery для отримання повернутої URL-адреси. Натомість потрібно поставити всі дані у форму та надіслати форму з набором targetатрибутів до значення nameатрибута iframe:

$('#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.
rovsen

6

ОНОВЛЕННЯ 2018 ДЛЯ ЖКВЕРІ 3 І ПІСНЕ

Я знаю, що це давнє питання, але жодне з вищезазначених рішень не працювало для мене. Ось рішення, яке спрацювало:

//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 до PleaseStand, і ось мій інший хак:

Після пошуку та виявив, що "запит на перехресний аякс" не може отримати заголовки відповідей від об'єкта XHR, я відмовився. і замість цього використовуйте 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.