我正在用python编写一个restful web服务的客户端接口,不幸的是,web服务需要在请求中出现自定义标头。我一直在为此使用请求,但是 Web 服务还要求标头在请求中按特定顺序排列。我无法弄清楚 Requests 如何对标头进行排序,看看是否有办法控制这种排序。
如果有人有推荐,我也愿意在我的应用程序中使用请求以外的其他模块。
我正在用python编写一个restful web服务的客户端接口,不幸的是,web服务需要在请求中出现自定义标头。我一直在为此使用请求,但是 Web 服务还要求标头在请求中按特定顺序排列。我无法弄清楚 Requests 如何对标头进行排序,看看是否有办法控制这种排序。
如果有人有推荐,我也愿意在我的应用程序中使用请求以外的其他模块。
下面的答案涉及 2.9.2 以下的版本。自 2.9.2 版(2016 年 4 月左右)再次使用OrderedDict
作品。
看起来前段时间只使用内置功能是可能的(问题 179)。我认为它不再是(第 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
在浏览了代码并阅读了该方法的文档字符串后,我选择了该方法:
添加连接所需的任何标头。从 v2.0 开始,默认情况下它什么都不做,但留给继承类的用户覆盖
HTTPAdapter <requests.adapters.HTTPAdapter>
。
对于绝对控制,可能会覆盖该send
方法。
您可以尝试使用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')])