web-dev-qa-db-ja.com

jquerygetResponseHeaderは常に「未定義」を返しますか?

Ajax経由で送信するフォームがあります。 jqueryフォームプラグインを使用しています。私がやろうとしているのは、サーバーから返される「Location」ヘッダーを取得することです。私はそれをfirebugで見ることができます。しかし、成功コールバックでgetResponseHeader()関数を呼び出すと、常に「undefined」が返されます。

コード:

form.ajaxForm({
  dataType: 'xml',
  data: {format: 'xml'},
  resetForm: true,
  success: function(xml,status,xhr){
    var location = xhr.getResponseHeader('Location');
    alert(location);
  });

場所は未定義です。しかし、firebugに「Location」ヘッダーが表示されます。何が足りないのですか? xhrオブジェクトからgetAllResponseHeaders()を呼び出しても、「undefined」が返されます。

16
demersus

これが 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は問題なく取得できます。

31
acdcjunior

XMLHttpRequestは 透過的にリダイレクトに従う であるため、finalリクエストにはヘッダーがなく、すでにそのリダイレクトに従い、 thatリクエストからのレスポンスヘッダーが表示されています(Locationヘッダーを含む最初のリクエストではありません)。

6
Nick Craver

Rails/restの方法を使用して、Locationヘッダーを含む201 "created"を新しいオブジェクトと空の本体に返す、同様のことを行っています。 jQueryのajaxメソッドは、jsonを予期しているが何も返さないため、これに遭遇すると「parseerror」をスローします。私は単に次のようにエラーコールバックで201リダイレクトをキャッチします:

function request_error(req, textStatus, errorThrown) 
{
    if (req.status == 201 ) {
        var created_loc = req.getResponseHeader('Location');
        console.log('(201) created: ' + created_loc);

        // ... manual redirect here i.e. issue another ajax request to created_loc
        return;
    }

    // ... handle an actual error here
}

お役に立てれば!

4
esfourteen