$.ajax:如何覆盖默认的http标头

$.ajax: How to override default http headers

本文关键字:默认 http 标头 覆盖 ajax 何覆盖      更新时间:2023-09-26

我正在使用jQuery.ajax建立HTTP连接。在我的项目中,我想设置自定义 http 标头,但我只想发送我设置的标头。目前我的标头正在发送,但除此之外,还有许多其他我没有设置的标头。

这就是我添加自定义标头的方式:

$.ajax("http://fakedomain.foo", {headers: {header1: "value1", header2: "value2"}});

即使无法设置整个标题集合,而只能添加额外的标题,我也可能没问题。但即使在这种情况下,有时我的标头在发送之前也会被修改。例如,如果我添加这些标头

    {
         "Connection": "close",
         "Accept-Encoding": "deflate, gzip",
         "Accept": "text/plain",
    }

然后这就是实际发送的内容(我使用 Wireshark 进行了捕获只是为了验证这一点(

    {
        "Connection": "close",
        "Accept-Encoding": "gzip,deflate,sdch",
        "Accept": "text/plain, */*; q=0.01",
        "Accept-Language": "es-ES,es;q=0.8",
        "Dnt": "1", 
        "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
        ...
    }

正如你所看到的,一些邪恶的吞噬正在调整我的头,它把"sdch"编码添加到"接受编码"头上,还改变了"接受"头,以便它也接受*/*。如果 WS 很挑剔并且需要根据标头采取不同的操作,这是一个真正的问题。

所以总结一下:

  1. 有没有办法只发送我的标题而不发送额外的标题?

    2.如果没有,有没有办法按原样添加我的自定义标题,而无需对其进行修改?

<小时 />

更新:
我的错,我没有正确设置标题。(我发布的代码是正确的,但是我的单元测试中存在一个错误,因此实际上没有添加我的标头,而是发送了默认标头。修复此问题后,我可以看到我的标题是使用正确的文本发送的,并且没有修改。所以忘记#2。问题#1仍然适用。

规范(W3C,WHATWG(禁止覆盖某些标头,包括Accept-Encoding

有趣的是,该规范并没有说任何关于Accept的特殊之处,这意味着浏览器必须按照给定的方式使用它。在这种情况下,是jQuery出了问题,为了以防万一,它添加了最后一部分。它从 6 年前就在那里。

该规范还要求浏览器发送一些其他标头,例如AuthorizationHostConnectionKeep-Alive等。