使用Python Requests构造URL时curl转请求调用失败如何解决
问题根因
你的代码存在两个核心错误:
- 误将curl的命令行功能参数
--data-urlencode当作接口的请求参数名,该参数是curl自带的URL编码工具配置,不属于要传给后端的业务参数 - 未明确参数传递位置:curl中使用
--data-urlencode时,如果未附加-G/--get参数,默认会将编码后的参数放在POST请求的表单请求体中,而非URL查询参数中
与原curl行为完全一致的实现代码
原curl默认发送POST请求,参数以application/x-www-form-urlencoded格式放在请求体中,对应requests写法如下,requests会自动完成参数的URL编码,无需手动处理:
import requests form_data = { 'match[]': 'up' } resp = requests.post("http://localhost:9090/api/v1/series", data=form_data) print(resp.json())
GET请求的实现(Prometheus接口常用调用方式)
如果你实际需要将参数拼接在URL后发送GET请求(原curl如果要实现这个效果需要额外加-G参数),对应写法如下:
import requests query_params = { 'match[]': 'up' } resp = requests.get("http://localhost:9090/api/v1/series", params=query_params) print(resp.json())
注意事项
- 无需在URL末尾手动添加
?,requests会自动处理参数拼接的格式问题 - 无需手动对
[]这类特殊字符做转义编码,requests会自动完成符合规范的URL编码 -g是curl用来关闭通配符解析的参数,避免curl把[]识别为通配符报错,requests本身没有这个通配符解析逻辑,不需要额外处理
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

