Python自定义JSON RPC客户端请求返回‘Invalid API parameter’问题排查
解决你的JSON RPC客户端请求错误
看起来你的问题出在请求构造的两个关键细节上,结合错误响应和代码来看,我帮你梳理下:
问题分析
从错误信息Invalid API parameter [jsonrpc] must be 2.0 ["GudMethod"]和你的代码来看,有两个明显的问题:
- 你在请求URL里拼接了
?method={}参数,但按照JSON RPC规范,POST请求的所有RPC相关信息(包括method)都应该放在请求体中,URL只需要是API端点地址即可。服务器可能把URL里的method参数和请求体里的内容混在一起,导致解析jsonrpc字段时出现混乱。 - 你发送POST请求时没有设置
Content-Type: application/json头,requests.post用data参数传字符串时,默认的Content-Type是application/x-www-form-urlencoded,服务器可能无法正确解析你的JSON请求体,进而导致参数校验错误。
修改后的代码
我调整了你的代码,修复了这两个问题:
import json import requests class Client(): def __init__(self, url): self.url = url self.id = 0 def request(self, method, prms): rq = Request(self, method, prms) return rq class Request(): def __init__(self, client, method, prms): self.client = client self.method = method self.prms = prms self.rq = None def buildRequest(self): self.client.id = self.client.id + 1 # 移除URL中的method查询参数,直接使用原始端点地址 url = self.client.url jb = { "jsonrpc": "2.0", "method": self.method, "params": self.prms, "id": self.client.id } body = json.dumps(jb) return url, body def execute(self): url, body = self.buildRequest() # 设置Content-Type头为application/json,确保服务器正确解析请求体 headers = {"Content-Type": "application/json"} self.rq = requests.post(url, data=body, headers=headers) print(body) print(self.rq.text)
关键修改点说明
- 移除URL中的method参数:JSON RPC的POST请求不需要在URL里指定method,所有信息都封装在请求体的JSON中,这样服务器才能正确按照规范解析请求。
- 添加Content-Type头:明确告诉服务器请求体是JSON格式,避免服务器以表单编码的方式解析你的JSON字符串,导致参数识别错误。
你可以试试修改后的代码,应该能解决当前的参数校验错误问题。
内容的提问来源于stack exchange,提问作者SamHDev
相关产品推荐
相关产品推荐

