我正在使用python requests为私有HTTP-API实现客户端库。 API(我无法控制)期望参数按特定顺序排列,但python-requests不会将排序的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)))
答案 0 :(得分:21)
请求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
答案 1 :(得分:12)
目前请求不允许您按照自己的意愿执行此操作。这当然是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行中的错误,我无法看到这种情况。
我在问题Wrong handling of params given as bytes object
答案 2 :(得分:1)
requests/models.py
(link)的第85行将params
对象变为普通dict
,而不是您传入的SortedDict
。我不知道我认为除非你修补图书馆,否则你将能够做你想做的事。
self.params = dict(params or [])
答案 3 :(得分:1)
它与版本2.2.0一起使用:
import requests
yourparams = {'s' : 'value1', 'f': 'value2'}
test = requests.get('https://example.org/private_api', params=yourparams)
print(test.url)
更多细节?请登入here。
答案 4 :(得分:0)
我发现这适用于1.2.3
以及2.0.0
>>> import requests
>>> requests.__version__
'2.0.0'
>>> data = [('first', 1), ('second', 2), ('third', 3)]
>>> requests.get('http://example.org/private_api', data=data).request.body
'first=1&second=2&third=3'