簡體   English   中英

python-requests:訂單獲取參數

[英]python-requests: order get parameters

我正在使用python請求實現私有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)))

請求lib現在支持這種開箱即用:要獲得有序參數,請使用一系列二值元組。 這消除了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

目前請求不允許您按照自己的意願執行此操作。 這當然是將要修復的缺點。 但是,因為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 [] 。我提出了這個問題錯誤處理作為字節對象給出的params

requests/models.pylink )的第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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM