python - JSON RPC 根据 python 中的请求返回“无效的 API 参数”
问题描述
我正在尝试使用 python 和请求为项目创建自己的 jsonrpc 客户端。经过一个小时的在线搜索,大多数错误与执行获取的人有关,而不是与发布帖子或人们收到不同的错误有关。根据 JSONRPC 规范(在此处找到http://www.jsonrpc.org/specification)它应该可以工作。任何帮助将不胜感激。谢谢山姆。
请求和代码如下:
发布请求正文:
{"method": "GudMethod", "params": {"ur": "HELLO"}, "jsonrpc": "2.0", "id": 1}
请求响应:
{
"jsonrpc": "2.0",
"result": {
"method": "GudMethod",
"success": false,
"error": "Invalid API parameter [jsonrpc] must be 2.0 [\"GudMethod\"]",
"extra": [],
"metrics": {
"st": "2018-05-24 22:16:37",
"sspt": 0.0006299018859863281
}
},
"id": null
}
代码:
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 = self.client.url + "?method={}".format(self.method)
jb = {}
jb["jsonrpc"] = "2.0"
jb["method"] = self.method
jb["params"] = self.prms
jb["id"] = self.client.id
body = json.dumps(jb)
return url,body
def execute(self):
url , body = self.buildRequest()
self.rq = requests.post(url,data=body)
print(body)
print(self.rq.text)
另外,不要让我使用现成的。我已经被告知了,但是由于项目将在哪里使用,我无法安装任何库。幸运的是请求会被安装,否则会很痛苦
解决方案
您客户的请求看起来不错。
服务器必须错误地解析您的请求,将值分配给GudMethod
name jsonrpc
。
不仅服务器解析您的请求不正确,而且根据JSON-RPC 规范,响应也是无效的:
1)不应该有result
字段:
结果
成功时需要此成员。
如果调用该方法时出错,则该成员不得存在。
此成员的值由在服务器上调用的方法确定。
2)应该有一个顶级error
字段:
错误
此成员在错误时是必需的。
如果在调用期间没有触发错误,则此成员不得存在。
该成员的值必须是第 5.1 节中定义的对象。
3) 该error
字段应为具有以下字段的 JSON 对象:
code
一个数字,指示发生的错误类型。
这必须是一个整数。
message
提供错误简短描述的字符串。
信息应该被限制在一个简洁的句子中。
数据
包含有关错误的附加信息的原始或结构化值。
这可以省略。
该成员的值由服务器定义(例如详细的错误信息、嵌套错误等)。
由于服务器错误地认为该jsonrpc
字段不等于2.0
,错误code
字段应为 -32600 并且消息字段Invalid Request
指示
发送的 JSON 不是有效的请求对象。
推荐阅读
- javascript - 在 JS 上积累时如何使用 CSS 过渡?(代码突然不起作用)
- java-8 - 仅在包含字母和整数的字符串中查找整数出现
- python - 获取数据框中不正确拼写单词的字典
- json - 如何停止 JSON 路径返回对象
- spring-boot-maven-plugin - MappingException:无法确定类型:org.springframework.boot.configurationprocessor.json.JSONObject
- python-3.x - Termux 中的 Firefox Selenium
- r - 更快地实现对所有可能组合的过滤
- vba - VBA 中是否有任何 C 样式的字符串格式?
- python - 如何使用 docker 依赖项运行 python 程序(或其他 cmd)?
- python - 在 seaborn 计数图中生成子集