python-requests:订单获取参数

tba*_*ack 19 python http-request python-requests

我正在使用python请求实现私有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 
Run Code Online (Sandbox Code Playgroud)

这就是我想要避免的:

requests.get('https://example.org?{0}'.format(urlencode(params)))
Run Code Online (Sandbox Code Playgroud)

Jef*_*eld 22

请求lib现在支持这种开箱即用:要获得有序参数,请使用一系列二值元组.这消除了OrderedDict的额外要求.

payload = (('key1', 'value1'), ('key2', 'value2'))
r = requests.get("http://httpbin.org/get", params=payload)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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
Run Code Online (Sandbox Code Playgroud)


Pio*_*ost 13

目前请求不允许您按照自己的意愿执行此操作.这当然是将要修复的缺点.但是,由于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))
Run Code Online (Sandbox Code Playgroud)

由于models.py第85行中的错误,我无法看到这种情况self.params = dict(params or [].我提出了这个问题错误处理作为字节对象给出的params