如何让Python requests GET方法按EIA API要求传递data数组参数?
问题
我尝试通过EIA数据API(v2)获取数据,在API仪表板中使用指定参数能成功返回数据,但用Python的requests库GET方法传递相同参数时却失败。
我的代码如下:
url = 'https://api.eia.gov/v2/electricity/retail-sales/data/?api_key=' + API_KEY params = { "frequency": "monthly", "data": [ "revenue", "sales", "price" ], "start": "2013-01" } # 注:原代码中x未定义,推测是x = requests.get(url, params=params) if x.status_code == 200: print('Success') else: print('Failed') res = x.json()['response'] data = res['data']
对比生成的URL发现问题出在data参数的传递格式:
- 仪表板生成的有效URL格式:
data[0]=price&data[1]=revenue&data[2]=sales requests默认生成的无效URL格式:data=revenue&data=sales&data=price
请问如何让GET请求按照API仪表板的格式传递data参数?
解决方案
requests默认会把列表参数转为重复的键值对(如data=a&data=b),但EIA API需要的是带索引的数组格式(如data[0]=a&data[1]=b)。可以通过以下两种方式解决:
方法1:手动构造带索引的参数键
直接把data参数拆分成带索引的键值对,完全匹配API要求的格式:
import requests API_KEY = "你的API密钥" url = 'https://api.eia.gov/v2/electricity/retail-sales/data/' params = { "api_key": API_KEY, "frequency": "monthly", "start": "2013-01", "data[0]": "price", "data[1]": "revenue", "data[2]": "sales" } x = requests.get(url, params=params) if x.status_code == 200: print('Success') res = x.json()['response'] data = res['data'] else: print('Failed', x.status_code)
方法2:使用requests的array_format参数(需requests 2.25.0+)
从requests 2.25.0版本开始,支持通过array_format指定数组参数的编码方式,设置为'index'即可自动生成带索引的格式:
import requests API_KEY = "你的API密钥" url = 'https://api.eia.gov/v2/electricity/retail-sales/data/' params = { "api_key": API_KEY, "frequency": "monthly", "data": ["price", "revenue", "sales"], "start": "2013-01" } x = requests.get(url, params=params, array_format='index') if x.status_code == 200: print('Success') res = x.json()['response'] data = res['data'] else: print('Failed', x.status_code)
补充说明
建议把api_key放在params字典中,而非直接拼接在URL里,这种方式更安全规范,也便于参数统一管理。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

