使用jQuery无法正确设置Accept HTTP标头

我试图设置接受HTTP标头“text / xml”与此jquery代码:

$.ajax({ beforeSend: function(req) { req.setRequestHeader("Accept", "text/xml"); }, type: "GET", url: "[proper url]", contentType: "text/plain; charset=utf-8", dataType: ($.browser.msie) ? "text" : "xml", username: '---', password: '-------', success: function(data) { var xml; if (typeof data == "string") { alert("Data is string:" + data); xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.loadXML(data); } else { xml = data; alert("Data is not string:" + $(xml).text()); } // Returned data available in object "xml" //alert("Status is: " + xml.statusText); $("#ingest_history").html($(xml).text()); } }); 

在Firefox中,它效果很好。

但在IE中,我试图为Accept头设置的值似乎被附加到结尾,所以它变成: Accept: */*, text/xml 。 这导致我的ajax调用返回html版本,而不是我想要的xml版本。

有谁知道如何正确设置/清除IE 8中的Accept头?

更新:由于某些原因,星号没有出现,因为我进入他们。 IE中的Accept Header看起来是: Accept: */*, text/xml

我也遇到了这个问题,不仅在IE中,而且在Chrome和Safari中使用jQuery 1.6.2。 这个解决scheme似乎在我尝试过的所有浏览器(Chrome,Safari,IE,Firefox)中按预期工作。

 $.ajax({ headers: { Accept : "text/plain; charset=utf-8", "Content-Type": "text/plain; charset=utf-8" }, data: "data", success : function(response) { ... } }) 

试试,如果这仍然给你麻烦。

使用jQuery 1.5+,你可以设置每个dataType的接受头,所以你可以做这样的事情:

 $.ajax({ dataType: ($.browser.msie) ? "text" : "xml", accepts: { xml: "text/xml", text: "text/xml" } }); 

你的问题似乎是这里描述的: http : //www.grauw.nl/blog/entry/470 。 问题在于, XMLHttpRequest规范目前规定用户代理不应该为请求默认设置任何Accept头,以便req.setRequestHeader()可以添加新的Accepts。 不幸的是,浏览器还没有遵守这一点。 问题描述可以让你testing你的浏览器,看它是否正常工作,不幸的是IE7,Chrome,Safari,Firefox和Opera都失败了。

Laurens Grauw也谈到了首先试图用Accept来删除Accept头的效果

 setRequestHeader('Accept', '') 

要么

 setRequestHeader('Accept', null) 

这些可能有帮助。

丑陋的服务器端黑客:如果你有控制你的服务器端应用程序,你可以硬连接它总是返回XML,添加支持自定义媒体types,如“application / i-really-want-xml”,或者添加对自定义的HTTP头像“X-Accept”。

我认为原来的海报可能是指这个链接: http : //blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx然而,这不解释你看到的行为。

IE浏览器本身不具备你所描述的行为,通过XMLHTTPRequest设置Accept头应该可以正常工作。 我已经在IE8中testing确认。

这可能是你的jQuery版本有问题,或者你有一些插件可以阻止你的stream量?

虽然这不是如何说明文件需要完成,这是对我有用。

  jQuery.ajax({ type: "POST", url: "...", data: ..., contentType: "text/xml", beforeSend: function(req) { req.setRequestHeader("Accept", "text/xml"); }, ...}); 

我不认为IE浏览器(任何版本)在Accept头部中performance不错。 看到这个链接:[ http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx%5D

一个可能的解决scheme可能是检查用户代理,看看它是否是IE。 如果是,则检查是否存在text / xml。

祝你好运!

编辑:

Opps的链接。 我的直觉是IE总是添加/和设置接受标题只是添加所需的MIMEtypes后的/