具有受控的HTTP头排序的Python HTTP请求

时间:2013-06-21 16:21:16

标签: python http rest webservices-client

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

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

2 个答案:

答案 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')])