6

私は次のようにjQueryでAJAX POSTを実行しています:

self.post = function (path, data) {
    return $.ajax({
        url: this.createUri(path),
        type: "POST",
        contentType: "application/json",
        dataType: "json",
        data: ko.toJSON(data)
    });
};

ここでは、AJAX Deferred オブジェクトを返すだけです。応答は別のオブジェクトによって処理されます。

api.post(menuItemsUri, self.newItem)
    .done(function (data, textStatus, request) {
        console.log(request.getResponseHeader("Location")); // undefined
    })
    .always(function () {
        // reset the current item
        self.newItem.update({});
    });

サーバーは Response を返し201 Created、Location ヘッダーを設定します。これは Chrome の [ネットワーク] タブで確認できます。

Access-Control-Allow-Origin:*
Cache-Control:no-cache
Content-Length:0
Date:Thu, 07 Feb 2013 10:25:04 GMT
Expires:-1
Location:http://localhost:49978/sites/1/menus/65/items/19
Pragma:no-cache

XmlHttpRequestただし、 jQuery AJAX コールバックで渡されたオブジェクトには Location ヘッダーがありません。

4

2 に答える 2

14

問題は、これが CORS 要求であり、CORS 仕様によると、次の「単純な応答ヘッダー」のみが公開されていることでした。

  • キャッシュ制御
  • コンテンツ言語
  • コンテンツ タイプ
  • 期限切れ
  • 最終更新日
  • プラグマ

追加のヘッダーを公開するには、それらをAccess-Control-Expose-Headersヘッダーに含める必要があります。

Access-Control-Expose-Headers: location

この変更が行われると、Location ヘッダーは を介し​​て XmlHttpRequest オブジェクトで使用できるようになりましたgetResponseHeader("Location")

通常の (非 CORS) リクエストの場合、これは問題ではありません。

于 2013-02-07T15:58:06.880 に答える
0

ロケーションヘッダーを手動で追加していますか、それともサーバースクリプトによって自動的に返されることを期待していますか? 実際には設定されていない可能性があるためです。
リダイレクトしていない限り、設定されていないことが予想されます.Chromeは実際にはそれ自体を「役立つ」ように追加しているだけかもしれません.

おそらく、スクリプトでロケーション ヘッダーを明示的に設定してみてください。そうすれば、間違いなくそこにあるはずですが、望ましくない副作用が生じる可能性があります。

于 2013-02-07T10:50:11.130 に答える