我正在使用python编写一个客户端接口到一个安静的Web服务,不幸的是,Web服务需要在请求中出现自定义头文件。我一直在使用请求,但Web服务还要求标头在请求中按特定顺序排列。我无法弄清楚Requests如何命令标题,看看是否有办法控制这种排序。
如果有人有推荐,我也愿意在我的应用程序中使用除请求之外的其他模块。
答案 0 :(得分:3)
以下答案涉及2.9.2以下的版本。自版本2.9.2(2016年4月左右)起使用OrderedDict
works again。
看起来前段时间只使用内置功能(issue 179)。我认为它不再是issue 2057,其中一个原因在num1的另一个评论中提到。我使用了以下解决方案/解决方法。
import requests
import collections
class SortedHTTPAdapter(requests.adapters.HTTPAdapter):
def add_headers(self, request, **kwargs):
request.headers = collections.OrderedDict(
((key, value) for key, value in sorted(request.headers.items()))
)
session = requests.Session()
session.mount("http://", SortedHTTPAdapter())
在示例标题中只是排序,但可以以任何方式对它们进行排序。我在完成requests
代码并阅读方法的docstring后选择了该方法:
添加连接所需的任何标头。从v2.0开始,这没有任何作用 默认情况下,但是由子类化的用户覆盖
HTTPAdapter <requests.adapters.HTTPAdapter>
上课。
对于绝对控制,可能会覆盖send
方法。
答案 1 :(得分:1)
您可以尝试使用OrderedDict
类来存储标头,而不是请求的默认标头:
>>> from collections import OrderedDict
>>> from requests import Session
>>> s = Session()
>>> s.headers
CaseInsensitiveDict({'Accept-Encoding': ... 'User-Agent': ... 'Accept': '*/*'})
>>> s.headers = OrderedDict([('User-Agent', 'foo-bar'), ('Accept', 'nothing')])
>>> s.headers
OrderedDict([('User-Agent', 'foo-bar'), ('Accept', 'nothing')])