jQueryおよびAJAX応答ヘッダー


163

したがって、このjQuery AJAX呼び出しがあり、応答はサーバーから302リダイレクトの形式で返されます。このリダイレクトを取得してiframeにロードしたいのですが、JavaScriptアラートでヘッダー情報を表示しようとすると、firebugが正しく認識しているにもかかわらず、nullになります。

それが助けになるなら、これがコードです:

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

URLを応答本文に移動するためにサーバー側のものに実際にアクセスすることはできません。これが最も簡単な解決策であることがわかっているので、ヘッダーの解析の助けは素晴らしいでしょう。


3
2017年以降にこの質問にアクセスする場合は、既存の回答のほとんどで時間を無駄にしないでください。問題がOPと同じ場合は、2つのオプションがあります。1)post元のサーバーとターゲットデータを抽出するプロキシサーバーをセットアップし、フロントエンドJSがターゲットデータのこのプロキシサーバーを要求します。または、2)CORSを許可するようにサーバーのコードを変更します。
kmonsoor 2017

回答:


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以降は、XHRオブジェクトのスーパーセットであるjqXHRと呼ばれる必要があります。
ヨハン

136

これがCORSリクエストの場合、デバッグツール(Chrome-> Inspect Element-> Networkなど)にすべてのヘッダーが表示されることがありますが、xhr.getResponseHeader('Header')そのようなヘッダーが単純な応答ヘッダーである場合、xHRオブジェクトは(を介して)ヘッダーのみを取得します。

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

このセットにない場合は、サーバーから返されるAccess-Control-Expose-Headersヘッダーに存在する必要があります。

問題のケースについて、それがCORSリクエストの場合、以下のヘッダーも存在する場合にのみLocationXMLHttpRequestオブジェクトを介してヘッダーを取得できます。

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

これが件名のスタックオーバーフロー投稿です。一部の投稿では、この問題を回避するためのハッキングについて説明しています。

jQuery Ajax呼び出し後のリダイレクト要求を管理する方法

JavaScriptで302 FOUNDをキャッチする

HTTPリダイレクト:301(永続)と302(一時)


10

jQueryによって使用される基になるXMLHttpRequestオブジェクトは、302ステータスコードを返すのではなく、常に暗黙的にリダイレクトに従います。したがって、jQueryのAJAX要求機能を使用して、返されたURLを取得することはできません。代わりに、フォームにすべてのデータを置くとしてフォームを送信する必要があるtarget属性の値に設定しnameIFRAMEの属性:

$('#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();
}

うーん。応答ありがとうございますが、それでもnullが返されます。他のアイデアはありますか?
シェーン、

古いバージョンのjqueryを使用している可能性があります。
rovsen 2010年

6

JQUERY 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

PleaseStandへの+1と私の他のハックは次のとおりです。

検索したところ、「クロス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()  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.