Python-Requests: Auftrag Parameter erhalten
-
26-10-2019 - |
Frage
Ich implementiere eine Clientbibliothek für einen privaten HTTP-API mithilfe Python -Anfragen. Die API (die ich nicht kontrolliere) erwartet, dass die Parameter in einer bestimmten Reihenfolge liegen, aber Python-Requests achtet keinen sortierten Diktieren als Parameter.
Das habe ich versucht:
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
Das versuche ich zu vermeiden:
requests.get('https://example.org?{0}'.format(urlencode(params)))
Lösung
Derzeit können Anfragen dies nach Belieben nicht ermöglichen. Dies ist natürlich der Mangel, der sein wird Fest. allerdings da params
Der Parameter kann nicht nur ein Wörterbuch, sondern auch Bytes einnehmen. Sie sollten in der Lage sein, etwas dazwischen zu tun:
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))
Dies funktioniert nicht wie ich aufgrund des Fehlers in Zeile 85 von Models sehe.py: self.params = dict(params or []
. Ich habe dieses Problem in der Probleme angesprochen Falsche Handhabung der als Bytes -Objekt angegebenen Parameter
Andere Tipps
Die Anfragen LIB unterstützt jetzt diese Out-of-the-Box: Um geordnete Parameter zu erhalten, verwenden Sie stattdessen eine Abfolge von zweiwertigen Tupeln. Dadurch werden die zusätzlichen Anforderungen des geordneten Angabens gestrichen.
payload = (('key1', 'value1'), ('key2', 'value2'))
r = requests.get("http://httpbin.org/get", params=payload)
Demo:
>>> 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
Zeile 85 von requests/models.py
(Verknüpfung) dreht die params
Objekt in eine Ebene dict
, eher als das SortedDict
Sie sind eingegangen. Ich glaube nicht, dass Sie in der Lage sein werden, das zu tun, was Sie wollen, es sei denn, Sie patchen die Bibliothek.
self.params = dict(params or [])
Ich fand, dass dies in funktioniert 1.2.3
ebenso gut wie 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'
Es verwendet mit Version 2.2.0:
import requests
yourparams = {'s' : 'value1', 'f': 'value2'}
test = requests.get('https://example.org/private_api', params=yourparams)
print(test.url)
Mehr Details? Bitte einchecken hier.