21

我正在使用python requests为私有 HTTP-API 实现客户端库。API(我无法控制)期望参数按特定顺序排列,但 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)))
4

5 回答 5

27

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
于 2013-08-28T14:23:54.357 回答
14

当前请求不允许按照您的意愿执行此操作。这当然是会被修复的缺点。但是,由于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 行中的错误,这不起作用self.params = dict(params or []。我在问题中提出了这个问题错误处理作为字节对象给出的参数

于 2012-01-10T12:34:35.057 回答
2

它与版本 2.2.0 一起使用:

import requests
yourparams = {'s' : 'value1', 'f': 'value2'}

test = requests.get('https://example.org/private_api', params=yourparams)
print(test.url)

更多细节?请在这里登记。

于 2014-02-02T11:13:24.633 回答
1

requests/models.py( link ) 的第 85行将params对象变成一个 plain dict,而不是SortedDict你传入的。我认为你不能做你想做的事,除非你修补库。

self.params = dict(params or [])
于 2012-01-10T12:35:55.113 回答
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'
于 2013-09-26T08:39:36.270 回答