Python的requests库如何添加Accept头部信息?

8

我使用Python的请求库向服务器发出了一个请求。代码如下(它使用适配器,因此需要匹配某种模式):

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

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

{'Authorization': 'OAuth2 handsOffMyToken', 'Accept': 'application/vnd.huddle.data+json'}

然而我从服务器得到的是一个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

我们可以看到有两个Accept Headers!requests库添加了这个Accept:*/*头,这导致服务器出现问题。请问有人知道我怎样才能停止这个操作吗?


2
在Python 2.7.5上,覆盖两个头文件对我来说很好用。也许这是3.3的问题? - matino
2
似乎是这个错误。尝试更新requests或使用b'Accept'作为解决方法。 - jfs
1个回答

1
根据评论所述,似乎这是3.3版本中requests库存在的问题。在requests库中,有默认的头文件(可以在utils文件夹中找到)。如果您没有指定自己的头文件,则使用这些默认头文件。然而,如果您指定了自己的头文件,则requests会尝试合并头文件以确保您拥有所需的所有头文件。该问题在sessions.py中的def request()方法中显示。它不是合并所有头文件,而是将其自己的头文件和您的头文件一起放入请求中。目前,我只是通过从util中删除默认头文件中的accept标头来执行了一个笨拙的hack。

2
没错,这是一个Requests的bug。我们已经意识到了这个问题,并且有一个未解决的Pull Request将会修复这个问题。由于它改变了Python3的API,所以不能立即合并,我们需要等待一个主要版本的发布。 - Lukasa
与此同时,我将保持 这个分支(其中包含修复)与主分支同步,直到合并完成。 - Lukasa
嗨 zidsal。我遇到了与您所描述的完全相同的问题,即附加标头“Accept-Encoding: identity”。我仍然不清楚您是如何解决它的。您能否粘贴您在util.py中修改的代码?谢谢。 - Just a learner
好的,Youshui,在这里你有两个选择,正确的选择是使用Lukasa发布的分支。第二个选项是恶意地修改requests库,并阻止它将你的字典与默认字典合并(或者你可以将你的Accept-Encoding添加到默认字典中)。我强烈建议你不要像我一样去做,而是使用Lukasa的更改。 - zidsal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接