如何将curl POST请求转为Python requests POST?解决val1未定义报错
解决requests POST请求参数传递错误的问题
嘿,你踩了个很常见的小坑——把POST请求体的参数和URL查询参数搞混了!咱们一步步理清楚问题出在哪,再给你正确的写法:
原curl命令的逻辑拆解
先看看你原来的curl命令到底在做什么:
-d '{"val1": ...}'是把JSON数据放在**POST请求的请求体(body)**里发送给服务器http://some-site:6000?t=1234567890里的t=1234567890是URL上的查询参数
而你写的Python代码里,把val1这些本该放在请求体的参数全塞到params里了——这会让requests把它们拼到URL后面,服务器自然找不到请求体里的val1,所以才返回"val1 is not defined"的错误。
正确的Python代码写法
用requests的json参数传递请求体数据,把URL查询参数单独放在params里就好:
import requests # 基础URL(不带查询参数) url = "http://some-site:6000" # URL查询参数只有t这一项 query_params = {"t": 1234567890} # POST请求体的JSON数据(如果val1等是变量,直接替换成对应变量名即可) payload = { "val1": -1000, "val2": 15, "val3": "20000", "val4": "22" } # 发送请求:params传URL参数,json传请求体数据 r = requests.post(url, params=query_params, json=payload) # 可以验证一下:URL只会带?t=1234567890,请求体是正确的JSON print(r.url) print(r.request.body)
补充说明
- 使用
json=payload时,requests会自动帮你设置Content-Type: application/json请求头,不用手动添加 - 如果你非要用
data参数传递,需要先把payload转成JSON字符串,同时手动设置headers,写法如下(但显然用json参数更省心):import json headers = {"Content-Type": "application/json"} r = requests.post(url, params=query_params, data=json.dumps(payload), headers=headers)
内容的提问来源于stack exchange,提问作者Hrvoje T
相关产品推荐
相关产品推荐

