1

我注意到对于 IE8 和 IE9,如果我使用带有POSTPUT动词的 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) {
            //...
        }
    });
4

2 回答 2

5

事实证明,这是所有当前 IE 风格(7、8 和 9)的已知问题。如果响应代码是204,那么 IE 会简单地将所有标题扔到地板上。对于像我这样编写纯 AJAX 实现需要最新 eTag 进行并发检查的人,IE 放弃了纯 AJAX 方法并迫使我立即执行 GET 以获取当前 eTag。:facepalm:

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

HTTP 中缺少 ETag 标头 Internet Explorer 中的无内容响应

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

response.headers.ETag 未定义

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

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

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

于 2012-10-12T21:50:57.917 回答
0

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

对 REST 服务的 jQuery ajax 调用

于 2012-09-19T23:17:51.547 回答