【问题标题】:jquery getResponseHeader always returns 'undefined'?jquery getResponseHeader 总是返回“未定义”?
【发布时间】:2011-05-21 04:15:42
【问题描述】:

我有一个通过 ajax 提交的表单。我正在使用 jquery 表单插件。我要做的是获取从我的服务器返回的“位置”标头。我可以在萤火虫中看到它。但是每当我在成功回调中调用 getResponseHeader() 函数时,它总是返回“未定义”..

代码:

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

位置未定义。但我可以在萤火虫中看到“位置”标题。我错过了什么?即使我从 xhr 对象调用 getAllResponseHeaders(),它也会返回 'undefined'

【问题讨论】:

  • 补充一点:这已经在 Firefox 和 Opera 中测试过了。结果相同

标签: jquery ajax xmlhttprequest jquery-forms-plugin


【解决方案1】:

如果这是 CORS request,您可能会在调试工具中看到所有标头(例如 Chrome->Inspect Element->Network),但 xHR 对象将仅检索标头(通过 xhr.getResponseHeader('Header')),如果这样标头是simple response header:

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

如果不在此集合中,则它必须存在于服务器返回的Access-Control-Expose-Headers 标头中。

关于所讨论的情况,如果它是一个 CORS 请求,则只有当且仅当以下标头也存在时,才能通过 XMLHttpRequest 对象检索 Location 标头:

Access-Control-Expose-Headers: Location

如果它不是 CORS 请求,XMLHttpRequest 将没有问题检索它。

【讨论】:

  • 这是正确的答案,如果你必须使用 CORS 并且有这些问题。
【解决方案2】:

我正在做类似的事情,使用 rails/rest 方式将带有 Location 标头的 201“创建”返回到新对象和空主体。 jQuery 的 ajax 方法在遇到这种情况时会抛出“parseerror”,因为它期望 json 但什么也得不到。我只是在我的错误回调中捕获 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
}

希望这会有所帮助!

【讨论】:

  • 只要设置dataType: 'text' 为arg,就可以在完整的回调中捕捉到201(或者更好:jqXHR.done)。
【解决方案3】:

一个 XMLHttpRequest 将 transparently follow a redirect,所以 final 请求没有标头,它已经遵循了该重定向并且您会看到来自 that 的响应标头请求(不是具有Location 标头的初始请求)。

【讨论】:

  • 服务器生成 201 Created 响应。我当然希望 jquery 不会将此解释为重定向。并且萤火虫没有显示第二个请求。
  • @Nik - 它有一个 Location 标题,对吧?这是一个重定向。
  • 它确实有一个位置标头,但如果我理解 http 响应代码,30x 系列意味着重定向。不是 20 倍。 20x 并不意味着采取进一步行动。位置标头应该是信息性的。但也许我错了?
  • @Nik - 你有服务器我可以看到这个吗?您确定初始响应是 201,第一个带有 Location 标头的响应...不是第二个?
  • 检查我的 ruby​​ on rails 应用程序的服务器日志后,在 201 响应之后我没有看到第二个请求。所以 xhr 不会重定向到该位置。这很好,但也许 jquery 变得困惑?还有什么想法吗?谢谢你的帮助。 ;)
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多