python-requests:排序GET参数

22 投票
5 回答
66447 浏览
提问于 2025-04-17 09:55

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

撰写回答