21

Python requestsを使用して、プライベート HTTP-API 用のクライアント ライブラリを実装しています。API(私が制御していない)は、パラメーターが特定の順序になっていることを期待していますが、python-requests はソートされた辞書をパラメーターとして尊重しません。

これは私が試したものです:

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)))
4

5 に答える 5

14

現在、リクエストでは、希望どおりにこれを行うことはできません。もちろん、これは修正される欠点です。ただし、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 []この問題は、バイトオブジェクトとして指定されたパラメーターの間違った処理の問題で提起しました

于 2012-01-10T12:34:35.057 に答える
2

バージョン 2.2.0 で使用されます。

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

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

詳細は?こちらからチェックインしてください。

于 2014-02-02T11:13:24.633 に答える
1

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

self.params = dict(params or [])
于 2012-01-10T12:35:55.113 に答える
0

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'
于 2013-09-26T08:39:36.270 に答える