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

73 ajax jquery internet-explorer header http

我正在尝试使用此jquery代码将Accept HTTP标头设置为"text/xml":

$.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());
    }              
});
Run Code Online (Sandbox Code Playgroud)

在Firefox中它很棒.

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

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

更新:出于某种原因,当我输入时,星号没有出现.IE中的Accept Header似乎是:Accept: */*, text/xml.

Joe*_*erg 70

我也遇到了麻烦,不只是在IE中,还在使用jQuery 1.6.2的Chrome和Safari中.此解决方案似乎在我尝试过的所有浏览器中都能正常运行(Chrome,Safari,IE,Firefox).

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

如果这仍然给你带来麻烦,试试看.


gna*_*arf 24

使用jQuery 1.5+,您可以设置每个接受标头,dataType这样您就可以执行以下操作:

$.ajax({
    dataType: ($.browser.msie) ? "text" : "xml",
    accepts: {
        xml: "text/xml",
        text: "text/xml"
    }
});
Run Code Online (Sandbox Code Playgroud)


Jim*_*ans 8

您的问题似乎是这里描述的问题:http://www.grauw.nl/blog/entry/470.问题是XMLHttpRequest规范当前声明用户代理不应该为请求默认设置任何Accept头,因此req.setRequestHeader()可以只添加新的Accepts.不幸的是,浏览器还没有坚持这一点.问题编写可让您测试浏览器以查看它是否正常工作,不幸的是IE7,Chrome,Safari,Firefox和Opera都失败了.

Laurens Grauw还谈到了首先尝试将Accept标头置空的效果

setRequestHeader('Accept', '')
Run Code Online (Sandbox Code Playgroud)

要么

setRequestHeader('Accept', null)
Run Code Online (Sandbox Code Playgroud)

这些可能会有所帮助.

丑陋的服务器端黑客攻击:如果您可以控制服务器端应用程序,则可以将其硬连接以始终返回XML,添加对"application/i-really-want-xml"等自定义媒体类型的支持,或者添加对自定义HTTP标头,如"X-Accept".


BSt*_*ers 0

我不相信 IE(任何版本)都能很好地处理 Accept 标头。请参阅此链接:[ http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

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

祝你好运!

编辑:

链接上的 Opps。我的预感是 IE 总是添加/并设置接受标头只是在/之后添加所需的 mime 类型。