Python-Requests: заказ получает параметры
-
26-10-2019 - |
Вопрос
Я внедряю клиентскую библиотеку для частного HTTP-API с использованием Python запросы. Анкет API (который я не контролирую) ожидает, что параметры будут в определенном порядке, но Python-запросы не выполняют отсортированный DICT в качестве параметра.
Это то, что я попробовал:
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
Это то, чего я пытаюсь избежать:
requests.get('https://example.org?{0}'.format(urlencode(params)))
Решение
В настоящее время запросы не позволяют делать это так, как вы хотите. Это, конечно, недостаток исправлено. Анкет Однако как params
Параметр может занять не только словарь, но и байты, вы должны быть в состоянии сделать что -то между ними:
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))
Это не работает, как я вижу из -за ошибки в строке 85 моделей.py: self.params = dict(params or []
Анкет Я поднял эту проблему в речь Неправильная обработка параметров, указанных как объект байтов
Другие советы
Запросы LIB теперь поддерживают этот вне коробки: чтобы получить упорядоченные параметры, которые вы используете вместо этого последовательность двухзначных кортежей. Это устраняет дополнительное требование OrderedDict.
payload = (('key1', 'value1'), ('key2', 'value2'))
r = requests.get("http://httpbin.org/get", params=payload)
Демонстрация:
>>> 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
Строка 85 requests/models.py
(ссылка на сайт) поворачивает params
объект в простой dict
, а не SortedDict
Вы проходили. Я не думаю, что вы сможете делать то, что хотите, если вы не исправляете библиотеку.
self.params = dict(params or [])
Я обнаружил, что это работает в 1.2.3
так же как 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'
Он использовался с версией 2.2.0:
import requests
yourparams = {'s' : 'value1', 'f': 'value2'}
test = requests.get('https://example.org/private_api', params=yourparams)
print(test.url)
Более подробная информация? Пожалуйста, зарегистрируйтесь здесь.