Python 请求:指定参数时使用列表

Python Requests: Using lists when specifying parameters

正在尝试从 Oanda 的 API 获取货币报价。这是我的代码:

s = requests.Session()
url = "https://stream-fxpractice.oanda.com/v1/prices"
headers = {'Authorization': 'Bearer ' + access_token}
params = {'instruments': pairs_oanda, 'accountId': account_id}
resp = s.get(url, headers=headers, params=params, stream=True)

access_token和account_id是对API的认证。当我提供一种货币对时,例如 "EUR_USD",到 pairs_oanda 它工作正常,导致以下 url:

https://streamfxpractice.oanda.com/v1/prices?instruments=GBP_USD&accountId=*******

但是,例如,当我提供货币对列表时

["EUR_USD", "GBP_USD"]

到pairs_oanda,我得到这个URL:

https://stream-fxpractice.oanda.com/v1/prices?instruments=EUR_USD&instruments=GBP_USD&accountId=*******

但是,我需要 url 看起来像才能正确访问 API 是这样的:

https://stream-fxpractice.oanda.com/v1/prices?instruments=EUR_USD%2CGBP_USD&accountId=*******

有没有办法让 Requests 以不同的方式解析列表?

API 希望您使用 逗号 来分隔货币对。你必须自己这样做;在此处使用 str.join()

pairs_oanda = ["EUR_USD", "GBP_USD"]
params = {'instruments': ','.join(pairs_oanda), 'accountId': account_id}

%2C 字符序列是 , 编码为 URL 编码:

>>> from urlparse import unquote
>>> unquote('%2C')
','

requests 负责为您提供报价,前提是您为其提供未加引号的参数值:

>>> from requests import Request
>>> url = "https://stream-fxpractice.oanda.com/v1/prices"
>>> pairs_oanda = ["EUR_USD", "GBP_USD"]
>>> params = {'instruments': ','.join(pairs_oanda), 'accountId': 'foobarbaz'}
>>> r = Request('GET', url, params=params)
>>> r.prepare().url
'https://stream-fxpractice.oanda.com/v1/prices?instruments=EUR_USD%2CGBP_USD&accountId=foobarbaz'