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)))
Était-ce utile?

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

Ligne 85 de requests/models.py (lien ) transforme le params objet dans une dict plaine, plutôt que le SortedDict vous avez passé. Je ne pense pas que vous serez en mesure de faire ce que vous voulez, à moins que vous patcher la bibliothèque.

self.params = dict(params or [])

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'

Il est 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? de bien vouloir vérifier .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top