我正在使用python requests实现一个私有HTTP的客户端库。API(我不能控制)要求参数按一定的顺序排列,但是python-request不会将已排序的dict作为参数。
这是我尝试过的:
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)))发布于 2012-01-10 20:34:35
目前,requests不允许您这样做。这当然是fixed的缺点。但是,由于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:self.params = dict(params or []的第85行出现了错误。我在issue Wrong handling of params given as bytes object中提出了这个问题
发布于 2013-08-28 22:23:54
requests lib现在支持这种开箱即用的方式:要获得有序参数,可以使用一系列二值元组。这消除了对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发布于 2014-02-02 19:13:25
它与2.2.0版一起使用:
import requests
yourparams = {'s' : 'value1', 'f': 'value2'}
test = requests.get('https://example.org/private_api', params=yourparams)
print(test.url)更多细节?敬请关注here。
https://stackoverflow.com/questions/8802945
复制相似问题