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)))
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top