web-dev-qa-db-ja.com

python-requests:getパラメータの注文

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)))
19
tback

現在、リクエストではこれを希望どおりに行うことができません。これはもちろん 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 []。私は問題でこの問題を提起しました バイトオブジェクトとして与えられたパラメーターの誤った処理

13
Piotr Dobrogost

リクエストライブラリは、すぐに使用できるようになりました。順序付けされたパラメータを取得するには、代わりに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
22
Jeff Sheffield

requests/models.pyの85行目( link )は、渡されたparamsではなく、dictオブジェクトをプレーンなSortedDictに変換します。ライブラリにパッチを適用しない限り、望んだことを実行できるとは思いません。

self.params = dict(params or [])
1

これは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'
0
Jian

バージョン2.2.0で使用しました。

import requests
yourparams = {'s' : 'value1', 'f': 'value2'}

test = requests.get('https://example.org/private_api', params=yourparams)
print(test.url)

詳細は? こちら で確認してください。

0
hepidad