python-requests:订单获取参数

时间:2012-01-10 12:01:31

标签: python http-request python-requests

我正在使用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)))

5 个答案:

答案 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.pylink)的第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'