Python-Requests:注文パラメーターを取得します
-
26-10-2019 - |
質問
私はプライベート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)
詳細は?親切にチェックインしてください ここ.
所属していません StackOverflow