首页 > 解决方案 > 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)

另外,不要让我使用现成的。我已经被告知了,但是由于项目将在哪里使用,我无法安装任何库。幸运的是请求会被安装,否则会很痛苦

标签: python

解决方案


您客户的请求看起来不错。

服务器必须错误地解​​析您的请求,将值分配给GudMethodname jsonrpc

不仅服务器解析您的请求不正确,而且根据JSON-RPC 规范,响应也是无效的:

1)不应该有result字段:

结果
  成功时需要此成员。
  如果调用该方法时出错,则该成员不得存在。
  此成员的值由在服务器上调用的方法确定。

2)应该有一个顶级error字段:

错误
  此成员在错误时是必需的。
  如果在调用期间没有触发错误,则此成员不得存在。
  该成员的值必须是第 5.1 节中定义的对象。

3) 该error字段应为具有以下字段的 JSON 对象:

code
  一个数字,指示发生的错误类型。
  这必须是一个整数。
message
  提供错误简短描述的字符串。
  信息应该被限制在一个简洁的句子中。
数据
  包含有关错误的附加信息的原始或结构化值。
  这可以省略。
  该成员的值由服务器定义(例如详细的错误信息、嵌套错误等)。

由于服务器错误地认为该jsonrpc字段不等于2.0,错误code字段应为 -32600 并且消息字段Invalid Request指示

发送的 JSON 不是有效的请求对象。


推荐阅读