5

我正在用python编写一个restful web服务的客户端接口,不幸的是,web服务需要在请求中出现自定义标头。我一直在为此使用请求,但是 Web 服务还要求标头在请求中按特定顺序排列。我无法弄清楚 Requests 如何对标头进行排序,看看是否有办法控制这种排序。

如果有人有推荐,我也愿意在我的应用程序中使用请求以外的其他模块。

4

2 回答 2

4

更新的答案

下面的答案涉及 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方法。

于 2015-04-06T16:09:09.743 回答
3

您可以尝试使用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')])
于 2013-06-21T16:47:31.047 回答