带有POST或PUT的jQuery.ajax没有IE8和IE9的响应头

时间:2012-09-19 22:54:23

标签: jquery ajax http-headers xmlhttprequest jqxhr

我注意到使用IE8和IE9,如果我使用带有 POST PUT 动词的jQuery.ajax()调用我的RESTful API,那么我不会在jqXHR中找回任何响应标头。但是,GET请求按预期工作。

此行为与所有其他浏览器不同。我已经确认Chrome,FF,Opera和Safari都会在POST和PUT请求的响应中返回完整的预期标头集。只有IE8和IE9似乎在地板上扔标题。 (我没有检查的一件事是HEAD请求会发生什么。)

我已经验证了 Fiddler 标题实际上是通过网络实现的,所以问题出在jQuery本身或IE8和IE9上。

这是一个已知问题吗?如果是这样,是否有解决方法。我可以在jQuery中重载/覆盖某些内容以保留POST和PUT后的头文件吗?我目前的解决方法是在成功回调中使用GET简单地重新获取修改后的数据,因为IE8和IE9不会弄乱 GET 操作的标题。

这是我基于jQuery的主要AJAX工作方法的片段:

    $.ajax({
        url: String.format(um.proxy.url, url),
        type: ajaxParams.verb,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: String.format('{0}', ajaxParams.jsonData),
        headers: mapOfHeaders,
        success: function (data, textStatus, jqXHR) {
            //...
        },
        error: function (msg, textStatus, errorThrown) {
            //...
        }
    });

2 个答案:

答案 0 :(得分:5)

事实证明,这是一个已知问题,包含所有当前风格的IE(7,8和9)。如果响应代码是 204 ,那么IE只会抛出所有标题。对于像我这样编写需要最新eTag进行并发检查的纯AJAX实现的人来说,IE杀死了纯AJAX方法,迫使我立即进行GET来获取当前的eTag。 :捂脸:

以下是我设法挖掘的几篇文章:

缺少HTTP中的ETag标头在Internet Explorer中没有内容响应

http://dalelane.co.uk/blog/?p=2043

response.headers.ETag undefined

http://datajs.codeplex.com/discussions/398295

一个部分解决方法是嗅探IE,然后立即执行HEAD请求来获取ETag,但这种方法的问题是,如果有人设法潜入你的前方并更新记录,你将成为获取她的更改的eTag,而不是您的。所以这不是一个可接受的解决方法。

所以,我嗅了IE并立即进行GET。否则对于所有其他浏览器,我只需使用jQuery的jqXHR.getResponseHeader(namespace.constants.headers.eTag)来获取eTag。

答案 1 :(得分:0)

如果您的REST服务与您请求的应用程序位于不同的服务器上,则可能需要查看此文章。接受的答案解释了为什么需要使用JSONP内容类型。

jQuery ajax call to REST service