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


75

我正在尝试使用此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());
    }              
});

在Firefox中,效果很好。

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

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

更新:由于某些原因,我输入星号时未出现。IE中的“接受标头”似乎是:Accept: */*, text/xml

Answers:


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) {
        ...
    }
})

如果仍然给您带来麻烦,请尝试。


24

使用jQuery 1.5+,您可以设置每个的accepts标头,dataType因此您可以执行以下操作:

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

从1.11.1-的来源开始,接受:{“ *”:allTypes,text:“ text / plain”,html:“ text / html”,xml:“ application / xml,text / xml”,json:“ application / json,text / javascript“},'
nicodemus13

因此,这些是预期的接受,并且如上所述,您还必须设置dataType。
nicodemus13 2015年

9

您的问题似乎是这里描述的问题:http : //www.grauw.nl/blog/entry/470。问题在于,XMLHttpRequest规范当前规定用户代理默认不应为该请求设置任何Accept标头,以便req.setRequestHeader()可以追加新的Accepts。不幸的是,浏览器还没有遵守。通过问题记录,您可以测试浏览器是否正常运行,不幸的是IE7,Chrome,Safari,Firefox和Opera均失败。

Laurens Grauw还谈到了先尝试用

setRequestHeader('Accept', '')

要么

setRequestHeader('Accept', null)

这些可能会在这里有所帮助。

丑陋的服务器端黑客:如果您可以控制服务器端应用程序,则可以硬连线使其始终返回XML,添加对自定义媒体类型(例如“ application / i-really-want-xml”)的支持,或添加对自定义HTTP标头,例如“ X-Accept”。


setRequestHeader('Accept',null)在IE8中给出“类型不匹配”,将其设置为“”首先起作用!
mplungjan


1

尽管这不是文档说明需要完成的方式,但它对我有用。

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

0

我不认为IE(任何版本)都可以与Accept标头一起使用。看到此链接:[ http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

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

祝好运!

编辑:

链接上的操作。我的直觉是IE总是添加/,设置accept标头只是在/之后添加所需的mime类型。


它不只添加/。它实际上添加了:* / *问题中的格式设置问题

是的,我认为这是一个格式问题...我也遇到了同样的事情
BStruthers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.