【问题标题】:Cannot properly set the Accept HTTP header with jQuery无法使用 jQuery 正确设置 Accept HTTP 标头
【发布时间】:2010-11-11 20:21:47
【问题描述】:

我正在尝试使用此 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 Header 似乎是:Accept: */*, text/xml

【问题讨论】:

    标签: jquery ajax internet-explorer http header


    【解决方案1】:

    我也遇到了这个问题,不仅在 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) {
            ...
        }
    })
    

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

    【讨论】:

      【解决方案2】:

      使用 jQuery 1.5+,您可以根据 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: "应用程序/json, 文本/javascript" },'
      • 所以这些是预期的接受,如上所述,您也必须设置 dataType。
      【解决方案3】:

      您的问题似乎是此处描述的问题:http://www.grauw.nl/blog/entry/470。问题是XMLHttpRequest specification 当前声明用户代理默认情况下不应为请求设置任何 Accept 标头,因此 req.setRequestHeader() 可以只附加新的 Accepts。不幸的是,浏览器还没有遵守这一点。问题记录让您可以测试您的浏览器以查看它是否正常工作,不幸的是 IE7、Chrome、Safari、Firefox 和 Opera 都失败了。

      Laurens Grauw 还谈到了首先尝试使用

      将 Accept 标头清空的效果
      setRequestHeader('Accept', '')
      

      setRequestHeader('Accept', null)
      

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

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

      【讨论】:

      • setRequestHeader('Accept', null) 在 IE8 中给出“类型不匹配” 将其设置为“”第一次有效!
      【解决方案4】:

      我认为原始发布者可能指的是此链接:http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx 但是,这并不能解释您看到的行为。

      IE 本身并没有您描述的行为,并且通过 XMLHTTPRequest 设置 Accept 标头应该可以正常工作。我已经在 IE8 中进行了测试以确认。

      您的 jQuery 版本可能存在问题,或者您有一些插件破坏了您的流量?

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我不相信 IE(任何版本)与 Accept 标头配合得很好。见此链接:[http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

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

          祝你好运!

          编辑:

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

          【讨论】:

          • 它不只添加 /。它实际上添加了: */* 问题中的格式问题
          • 是的,我认为这是格式问题......我遇到了同样的事情
          猜你喜欢
          • 2011-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-21
          • 1970-01-01
          • 2014-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多