python requests を使用して、プライベートHTTP-APIのクライアントライブラリを実装しています。 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)))
現在、リクエストではこれを希望どおりに行うことができません。これはもちろん fixed になる欠点です。ただし、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))
これは、models.pyの85行目のバグが原因で、私が見ているように機能しません:self.params = dict(params or []
。私は問題でこの問題を提起しました バイトオブジェクトとして与えられたパラメーターの誤った処理
リクエストライブラリは、すぐに使用できるようになりました。順序付けされたパラメータを取得するには、代わりに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
requests/models.py
の85行目( link )は、渡された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)
詳細は? こちら で確認してください。