web-dev-qa-db-fra.com

python-request: commande récupère les paramètres

J'implémente une bibliothèque client pour une API HTTP privée à l'aide de requêtes python . L'API (que je ne contrôle pas) s'attend à ce que les paramètres soient dans un certain ordre, mais python-request n'accepte pas un dict trié en tant que paramètre.

C'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 

C'est ce que j'essaie d'éviter:

requests.get('https://example.org?{0}'.format(urlencode(params)))
14
tback

Actuellement, les demandes ne permettent pas de faire cela comme vous le souhaitez. Ceci est bien sûr une lacune qui sera corrigé . Cependant, comme le paramètre params peut prendre non seulement le dictionnaire mais aussi les octets, vous devriez pouvoir faire quelque chose entre les deux:

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 à cause d'un bogue dans la ligne 85 de models.py: self.params = dict(params or []. J'ai soulevé ce problème dans le problème Mauvaise gestion des paramètres donnés sous forme d'objet octets

11
Piotr Dobrogost

La requête lib prend désormais en charge les opérations suivantes: Pour obtenir les paramètres ordonnés, utilisez plutôt une séquence de nuplets à deux valeurs. Cela élimine 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
21
Jeff Sheffield

La ligne 85 de requests/models.py ( link ) transforme l’objet params en une simple dict, plutôt que la SortedDict que vous avez fournie. Je ne pense pas que vous pourrez faire ce que vous voulez, à moins de patcher la bibliothèque.

self.params = dict(params or [])
1
Andrew Wilkinson

Il a utilisé avec la version 2.2.0: 

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

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

Plus de détails? Veuillez vérifier dans ici .

1
hepidad

J'ai trouvé 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'
0
Jian