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

时间:2013-10-03 10:55:30

标签: javascript jquery ajax http http-headers

我正在使用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",
        ...
    }

正如你可以看到一些邪恶的gobling出现在调整我的标题,它已经将“sdch”编码添加到“Accept-Encoding”标题中,并且还更改了“Accept”标题以便它也接受*/*。如果WS很挑剔并且需要根据标题采取不同的操作,这是一个真正的问题。

总结一下:

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

    <击> 2。如果没有,有没有办法按原样添加我的自定义标题,而不修改它们?


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

1 个答案:

答案 0 :(得分:2)

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

有趣的是,规范没有说明Accept的任何特殊内容,这意味着浏览器必须按照给定的方式使用它。在这种情况下,它是jQuery故障,其中adds that last part以防万一。 自6 years ago以来它就在那里。

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