2010-12-06 13 views
16

私はajaxを介して提出しているフォームを持っています。私はjqueryフォームプラグインを使用しています。私がしようとしているのは、私のサーバーから返される 'Location'ヘッダーを取得することです。私は火かき棒でそれを見ることができます。しかし、私は私の成功コールバックでgetResponseHeader()関数を呼び出すたび、それは常に「未定義」を返します。..jquery getResponseHeaderは常に 'undefined'を返しますか?

コード:

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

場所が定義されていません。しかし、私は火かき棒で 'Location'ヘッダーを見ることができます。私は何が欠けていますか?私はXHRオブジェクトからgetAllResponseHeaders()を呼び出した場合でも、それは最終リクエストヘッダーを持っていないので、それはすでにそのリダイレクトを追っていますし、あなたが見ている、

+0

追加するだけ:これは、firefoxとoperaの両方でテストされています。同じ結果 – demersus

答えて

25

これがCORS requestであれば、そのようなヘッダがある場合は、デバッグツールですべてのヘッダを(例えばクロームなど>、エレメント>ネットワークを点検して)表示される場合がありますが、XHRオブジェクトは、のみ(xhr.getResponseHeader('Header')経由)ヘッダを取得しますsimple response header

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

それがこのセット内にない場合、それはサーバによって返さAccess-Control-Expose-Headersヘッダ内に存在しなければなりません。それはCORS要求がある場合に問題となる場合について

、一つのみXMLHttpRequestオブジェクト場合throgh Locationヘッダを取得することができるであろう、とする場合にのみ、以下のヘッダは存在する:

Access-Control-Expose-Headers: Location 

CORSリクエストでない場合、XMLHttpRequestはそれを取得するのに問題ありません。

+1

これはそれでした! * bow * – GijsjanB

+0

CORSを使用してこれらの問題がある場合は、正解です。 –

6

アンのXMLHttpRequestがtransparently follow a redirectます「未定義」を返します応答ヘッダーはからリクエスト(Locationヘッダーを持つ最初のリクエストではありません)です。

+0

サーバは201 Createdレスポンスを生成します。 jqueryがこれをリダイレクトとして解釈しないことを願っています。火かき棒は2番目のリクエストを表示しません。 – demersus

+0

@Nik - これは 'Location'ヘッダーを持っていますが、それはありますか?それはリダイレクトです。 –

+0

ロケーションヘッダーがありますが、HTTP応答コードを理解していれば、30xシリーズはリダイレクトを意味します。 20倍ではありません。 20xはそれ以上のアクションを意味しません。ロケーションヘッダーは情報提供でなければなりません。しかし、多分私は間違っていますか? – demersus

3

私は、新しいオブジェクトと空のボディに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 
} 

これは役に立ちます!

+0

dataType: 'text'をargに設定するだけで、完全なコールバック(あるいはより良い:jqXHR.done)で201を捕まえることができます。 – GijsjanB

関連する問題