我注意到使用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) {
//...
}
});
答案 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内容类型。