python-запросы: порядок получения параметров

Я реализую клиентскую библиотеку для частного 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))) 

5 Solutions collect form web for “python-запросы: порядок получения параметров”

В настоящее время запросы не позволяют делать это по вашему желанию. Это, конечно, недостаток, который будет исправлен . Однако, поскольку параметр 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 models.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 []) 

Он используется с версией 2.2.0:

 import requests yourparams = {'s' : 'value1', 'f': 'value2'} test = requests.get('https://example.org/private_api', params=yourparams) print(test.url) 

Подробнее? Пожалуйста, зарегистрируйтесь здесь .

Я обнаружил, что это работает в 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' 
  • Как сделать python Запросы работают через socks proxy
  • Получить код ошибки HTTP из request.exceptions.HTTPError
  • Использование модуля запросов Python для отправки формы без имени ввода
  • Безопасен ли объект Session из библиотеки запросов Python?
  • Использование запросов python с страницами javascript
  • Как получить текст с текстом «быстрый ответ» в googles?
  • Как сделать HTTP POST на веб-сайте, использующем asp.net?
  • Использование «запросов» Python с существующим подключением сокетов
  •  
    Interesting Posts for Van-Lav

    Как получить больше контроля над циклами в Python?

    Скрипт пропускает второй цикл при чтении файла

    фильтровать элементы в словаре python, где ключи содержат определенную строку

    Совместимость шаблонов Python. Match 'c T'

    Как удалить акцент в Python 3.5 и получить строку с unicodedata или другими решениями?

    Как извлечь числа (наряду с прилагательными или диапазонами сравнения)

    Почему встроенные функции, такие как abs, работают в массиве numpy?

    Python 2.7.9 Mac OS 10.10.3 Сообщение «setCanCycle: устарело. Вместо этого используйте setCollectionBehavior вместо "

    Получение sphinx для отображения параметров функции при обёртывании декоратором

    Интерполяция на DataFrame в пандах

    Вызов сценария Python 2 из Python 3

    Как обновить сюжет с помощью python и Matplotlib

    WebDriverException: Сообщение: исполняемый файл geckodriver должен находиться в PATH

    Я пытаюсь выбрать структуру для продукта, который я собираюсь построить, и до сих пор я склоняюсь к Нагаре … Любые мысли?

    Как использовать виртуальную среду python на другом компьютере

    Python - лучший язык программирования в мире.