我正在使用私人http-api实施客户库 Python请求. 。 API(我不控制)期望参数处于一定顺序,但是Python-Requeests并未将分类为参数进行尊重。

这就是我尝试的:

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)))
有帮助吗?

解决方案

当前请求不允许按照您的意愿执行此操作。当然,这将是 固定的. 。但是 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 []。我提出了这个问题 错误地处理给定为字节对象的参数

其他提示

请求LIB现在支持此开箱即用:要获取有序参数,您可以使用一组两个值的元素。这消除了订购的附加要求。

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

第85行 requests/models.py (关联)转 params 对象进入平原 dict, ,而不是 SortedDict 您通过了。除非您修补库,否则我认为您无法做自己想做的事。

self.params = dict(params or [])

我发现这有效 1.2.32.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'

它与版本2.2.0一起使用:

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

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

更多细节?请检查 这里.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top