質問

私はプライベートHTTP-APIを使用してクライアントライブラリを実装しています Pythonリクエスト. 。 API(私は制御しません)は、パラメーターが特定の順序であると予想していますが、Python-Requestsはパラメーターとしてソートされた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行目のバグのために見られるように機能しません。 self.params = dict(params or []。私は問題でこの問題を提起しました バイトオブジェクトとして与えられたパラメーションの誤った処理

他のヒント

リクエストLIBは、このすぐに使えるボックスをサポートしています。注文されたパラメーターを取得するには、代わりに2価値のタプルのシーケンスを使用します。これにより、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)

詳細は?親切にチェックインしてください ここ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top