Python HTTP请求,具有HTTP头的受控顺序

Python HTTP请求,具有HTTP头的受控顺序,python,http,rest,webservices-client,Python,Http,Rest,Webservices Client,我正在用python为restful web服务编程一个客户端接口,不幸的是,web服务需要在请求中显示自定义头。我一直在为此使用请求,但是web服务还要求头在请求中按特定顺序排列。我还没有弄清楚请求是如何对头进行排序的,也没有办法控制这种排序 如果有人提出建议,我也愿意在我的应用程序中使用请求以外的其他模块。您可以尝试使用OrderedDict类来存储标题,而不是请求的默认标题: >>> from collections import OrderedDict >>

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


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

您可以尝试使用
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')])
最新答案 下面的答案涉及2.9.2以下的版本。自版本2.9.2(2016年4月左右)起,使用
OrderedDict

旧答案 不久前,似乎可以只使用内置功能()。我认为它不再是()了,其中一个原因是在另一篇评论中提到的。我使用了以下解决方案/变通方法

导入请求
导入集合
类SortedHTTPAdapter(requests.adapters.HTTPAdapter):
def add_标题(自我、请求、**kwargs):
request.headers=collections.OrderedDict(
((键,值)用于键,排序后的值(request.headers.items()))
)
会话=请求。会话()
mount(“http://”,SortedHTTPAdapter())
在本例中,标题仅被排序,但可以以任何方式对其排序。我在通过
请求
代码并读取该方法的docstring后选择了该方法:

添加连接所需的任何标头。从v2.0开始,这没有任何作用 默认情况下,但留给子类化
HTTPAdapter
class


对于绝对控制,可能可以覆盖
send
方法。

如果我是你,我会向API的维护人员提交一份错误报告,因为这显然违反了HTTP规范。声明:
接收具有不同字段名的头字段的顺序并不重要。
需要特定的顺序标题不只是不方便,它是不正确的。完全同意,但不幸的是,这将需要一些时间,我在压力下完成这个项目。谢谢。不幸的是,如果您发送请求r=s.get(url),然后用r.request.headers检查这些头,那么尽管它们在s.headers中是正确的,但它们的顺序与s.headers不同。奇怪。这不起作用,因为请求使用自己的不区分大小写的dict子类。当您传入头时,它会用您提供的头初始化自己的dict。@num1:声明它应该足以覆盖会话头(使用
OrderedDict
)。建议它应该起作用。@jfs感谢您注意到这一变化。这2年是相当大的近似值(我可以看到GitHub正好显示了这一点)。更准确地说,OrderedDict似乎是从2016年4月开始提交的,从2.9.2版开始。之前的答案来自2013年和2015年。也许可以添加另一个答案,并注意,从版本2.9.2开始,这也是可能的?它可以帮助当前用户。
s.headers=OrderedDict(…)
是当前的答案。给你。如果你愿意的话,你也可以更新你的答案。我已经在对@michaelmeyer的原始答案的评论中回答了,这就足够了。