请求在Accept标头中添加python lib

zid*_*sal 6 python http-headers python-requests

所以我向带有pythons请求库的服务器发出了请求.代码看起来像这样(它使用适配器,因此它需要匹配某个模式)

def getRequest(self, url, header):
    """
    implementation of a get request
    """

    conn = requests.get(url,  headers=header)
    newBody = conn.content
    newHeader = conn.headers
    newHeader['status'] = conn.status_code

    response  = {"Headers" : newHeader, "Body" : newBody.decode('utf-8')}

    self._huddleErrors.handleResponseError(response)
    return response
Run Code Online (Sandbox Code Playgroud)

我正在解析的头参数是这个

{'Authorization': 'OAuth2 handsOffMyToken', 'Accept': 'application/vnd.huddle.data+json'}
Run Code Online (Sandbox Code Playgroud)

但是我从服务器返回xml响应.检查fiddler后,我看到发送的请求是:

Accept-Encoding: identity
Accept: */*
Host: api.huddle.dev
Authorization: OAuth2 HandsOffMyToken
Accept: application/vnd.huddle.data+json
Accept-Encoding: gzip, deflate, compress
User-Agent: python-requests/1.2.3 CPython/3.3.2 Windows/2008ServerR2
Run Code Online (Sandbox Code Playgroud)

我们可以看到有2个接受标题!请求库正在添加此Accept:*/*标头,这将丢弃服务器.有谁知道我怎么能阻止这个?

zid*_*sal 1

正如评论中所述,这似乎是 3.3 中 requests 库的问题。请求中有默认标头(可以在 utils 文件夹中找到)。当您不指定自己的标头时,将使用这些默认标头。但是,如果您指定自己的标头,则请求会尝试将标头合并在一起,以确保您拥有所需的所有标头。

问题在sessions.py 中的def request() 方法中显现出来。它不是合并所有标头,而是将其放入其标头中,然后放入您的标头中。现在我刚刚完成了从 util 中找到的默认标头中删除接受标头的肮脏黑客行为

  • 正确,这是一个请求错误。我们已经意识到这一点,并且有一个[未完成的 Pull 请求](https://github.com/kennethreitz/requests/pull/1338) 可以解决该问题。这不能立即合并,因为它改变了 Python3 API,所以我们需要等待主要版本。 (2认同)