【问题标题】:Missing Location header on jQuery AJAX POSTjQuery AJAX POST 上缺少 Location 标头
【发布时间】:2013-02-07 23:58:06
【问题描述】:

我正在使用 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 标头。

【问题讨论】:

  • 你试过输出getAllResponseHeaders()的结果来看看里面有什么吗?
  • 是的:Pragma, Cache-Control, Expires
  • 好吧,我认为您可能无法发送位置标头,这可能是由于 xmlhttprequest 的工作原理。它可能无法跟随位置标头,因此它可能被忽略甚至不发送。没有把握。你能不能只设置一个名为New-Location 之类的新标题并阅读它?显然这并不理想。

标签: jquery ajax xmlhttprequest


【解决方案1】:

问题在于这是一个 CORS 请求,根据 CORS Spec,仅公开了以下“简单响应标头”:

  • 缓存控制
  • 内容-语言
  • 内容类型
  • 过期
  • 最后修改
  • 编译指示

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

Access-Control-Expose-Headers: location

进行此更改后,XmlHttpRequest 对象可以通过 getResponseHeader("Location") 使用 Location 标头。

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

【讨论】:

    【解决方案2】:

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

    也许只是尝试在脚本中明确设置位置标头,那么它肯定应该在那里,但这可能会产生不希望的副作用。

    【讨论】:

    • Location 标头由 API 明确设置。如果响应中未包含标头,Chrome 如何知道将标头设置为什么。
    猜你喜欢
    • 2012-09-21
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 2021-07-30
    • 2013-09-09
    相关资源
    最近更新 更多