jQuery返回的getResponseHeader总是“未定义”?

16

我有一个表单,通过ajax提交。我正在使用jquery表单插件。我的目标是获取从服务器返回的“Location”头信息。我可以在firebug中看到它。但是每当我在成功回调中调用getResponseHeader()函数时,它总是返回“undefined”。

代码:

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

location未定义。但是我可以在firebug中看到“Location”标头。我缺少什么?即使我从xhr对象调用getAllResponseHeaders(),它也返回“未定义”


只是补充一下:这已经在Firefox和Opera中进行了测试。结果相同。 - demersus
3个回答

38
如果这是一个CORS请求,您可以在调试工具(例如Chrome->检查元素->网络)中看到所有标题,但是xHR对象仅在以下情况下检索标题(通过xhr.getResponseHeader('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并且遇到这些问题,那么这就是正确的答案。 - s.froehlich

6

XMLHttpRequest会透明地跟随重定向,因此最终请求不会有头部,它已经跟随了该重定向,您正在查看来自请求的响应头(而不是具有Location头的初始请求)。


服务器生成了一个201 Created响应。我真希望jQuery不会将其解释为重定向。Firebug也没有显示第二个请求。 - demersus
@Nik - 你有一个我可以看到这个的服务器吗?你确定初始响应是201,带有Location头的初始响应...而不是第二个? - Nick Craver
好的,我很感激你的帮助。这是一个比较敏感的项目,所以我无法让它上线,但我或许可以创建一个模拟版本,保持相同的请求/响应周期和问题。 - demersus
@Nik - 如果你能做到,请在这里评论,我很乐意看一下。 - Nick Craver
我制作了一个测试应用程序,使用标准的ajax请求仅发送文本字段。它按预期工作。我认为问题与我使用表单插件进行ajax文件上传有关。问题必须是因为它使用了隐藏的iframe而不是实际的xhr请求。很抱歉浪费您的时间。 - demersus
显示剩余5条评论

4
我正在使用rails/rest的方式进行类似的操作,返回一个带有Location标头的201“已创建”响应和空正文。由于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
}

希望这能帮到你!

只需将dataType: 'text'设置为参数,您就可以在complete回调中捕获201(或者更好的是:jqXHR.done)。 - GijsjanB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接