jQuery AJAX POST上缺少Location标头

时间:2013-02-07 10:26:56

标签: jquery ajax xmlhttprequest

我正在使用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({});
    });

服务器返回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

但是,在jQuery AJAX回调中传递的XmlHttpRequest对象中缺少Location标头。

2 个答案:

答案 0 :(得分:13)

问题在于这是一个CORS请求,根据CORS Spec,只有以下“简单响应标头”被暴露:

  • 缓存控制
  • 内容的语言
  • 内容类型
  • 到期
  • 上次修改
  • 附注

要公开其他标题,您需要将它们包含在Access-Control-Expose-Headers标题中,例如:

Access-Control-Expose-Headers: location

完成此更改后,位置标头可通过getResponseHeader("Location")对XmlHttpRequest对象使用。

对于正常(非CORS)请求,这不是问题。

答案 1 :(得分:0)

您是手动添加位置标头,还是希望服务器脚本自动返回它?因为它实际上可能没有设置。
除非你重定向,否则我希望它不会被设置,Chrome实际上可能只是将它自己添加为“有用”。

也许只是尝试在脚本中明确设置位置标题,然后它肯定会存在,但这可能会产生不良的副作用。