python-requests:排序GET参数
我正在用python requests实现一个私有HTTP接口的客户端库。这个接口(我无法控制)要求参数按照特定的顺序传递,但python-requests并不支持将排序后的字典作为参数。
这是我尝试过的:
import requests
from django.utils.datastructures import SortedDict
params = SortedDict()
params['s'] = 'value1'
params['f'] = 'value2'
requests.get('https://example.org/private_api', params=params)
#performs request as https://example.org/private_api?f=value1&s=value2
这是我想要避免的:
requests.get('https://example.org?{0}'.format(urlencode(params)))
5 个回答
2
它是和版本2.2.0一起使用的:
import requests
yourparams = {'s' : 'value1', 'f': 'value2'}
test = requests.get('https://example.org/private_api', params=yourparams)
print(test.url)
想要了解更多细节?请查看这里。
28
现在,requests库自带支持这个功能:如果你想要有序的参数,可以使用一系列包含两个值的元组来代替。这就不需要额外使用OrderedDict了。
payload = (('key1', 'value1'), ('key2', 'value2'))
r = requests.get("http://httpbin.org/get", params=payload)
示例:
>>> import requests
>>> requests.__version__
1.2.3
>>> payload = (('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3'))
>>> r = requests.get("http://httpbin.org/get", params=payload)
>>> print r.json()['url']
http://httpbin.org/get?key1=value1&key2=value2&key3=value3
14
目前,requests库不支持你想要的功能。这当然是一个缺陷,未来会被修复。不过,因为params
这个参数不仅可以接收字典,还可以接收字节,所以你应该能找到一些折中的办法:
from collections import OrderedDict
from urllib import urlencode
import requests
params = OrderedDict([('first', 1), ('second', 2), ('third', 3)])
requests.get('https://example.org/private_api', params=urlencode(params))
我发现这个方法不管用,是因为models.py文件第85行有个bug:self.params = dict(params or []
。我在这个问题上提出了反馈,链接是错误处理作为字节对象的params