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 году или позже, не тратьте время на большинство существующих ответов. Если ваша проблема такая же, как у OP, у вас есть два варианта: 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.

rovsen
источник
5
Начиная с jQuery> = 1.5, он должен называться jqXHR , который является надмножеством объекта XHR.
Йохан
136

Если это запрос CORS , вы можете увидеть все заголовки в инструментах отладки (таких как Chrome-> Inspect Element-> Network), но объект xHR будет извлекать заголовок (через 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будет проблем с его получением.

acdcjunior
источник
3
@acdcjunior спасибо, это помогло мне также, после того, как я потратил некоторое время на выяснение, почему не было никакого вывода в ответе заголовка
daniyel
33
 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });
keithics
источник
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

Вот несколько сообщений на эту тему. Некоторые из постов описывают хаки, чтобы обойти эту проблему.

Как управлять запросом на перенаправление после вызова jQuery Ajax

Поймать 302 НАЙДЕН в JavaScript

HTTP перенаправление: 301 (постоянный) против 302 (временный)

DRaehal
источник
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 будет перенаправлен в конечный пункт назначения.

PleaseStand
источник
9

попробуй это:

type: "GET",
async: false,
complete: function (XMLHttpRequest, textStatus) {
    var headers = XMLHttpRequest.getAllResponseHeaders();
}
Кори Баллу
источник
Хм. Большое спасибо за ответ, но это все еще возвращает нуль. Есть еще идеи?
Шейн
может быть, вы используете старую версию jquery.
Ровсен
6

ОБНОВЛЕНИЕ 2018 ДЛЯ JQUERY 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'));
        });
    }
sticky_elbows
источник
2

+1 в PleaseStand, и вот мой другой взломать:

После поиска и выяснения, что «перекрестный запрос ajax» не может получить заголовки ответа от объекта 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()  
Сивей Шен 申思维
источник