python-requêtes: paramètres de commande get
-
26-10-2019 - |
Question
Je suis une bibliothèque de mise en œuvre de client pour un privé HTTP-API en utilisant . L'API (que je ne contrôle pas) attend que les paramètres soient dans un certain ordre, mais python-requêtes ne respecte pas dict triée comme paramètre.
est ce que j'ai essayé:
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
est ce que je suis en train d'éviter:
requests.get('https://example.org?{0}'.format(urlencode(params)))
La solution
demande actuellement ne permet pas de le faire que vous le souhaitez. Ceci est lacune du cours qui sera fixe . Cependant, comme paramètre params
peut prendre non seulement le dictionnaire mais octets ainsi vous devriez être en mesure de faire quelque chose entre:
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))
Cela ne fonctionne pas comme je vois en raison de bogue dans la ligne 85 du models.py: self.params = dict(params or []
.
J'ai soulevé ce problème en cause mauvaise manipulation des params données sous forme d'octets objet
Autres conseils
Les demandes lib prend désormais en charge cette out-of-the-box: Pour obtenir les paramètres commandés vous utilisez une séquence de deux valeurs tuples à la place. Cela permet d'éliminer l'exigence supplémentaire de OrderedDict.
payload = (('key1', 'value1'), ('key2', 'value2'))
r = requests.get("http://httpbin.org/get", params=payload)
Démo:
>>> 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
Je trouve que cela fonctionne dans 1.2.3
ainsi que 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'