JSON RPC返回';无效的API参数';应python的请求

JSON RPC返回';无效的API参数';应python的请求,python,Python,我正在尝试使用python和请求为项目创建自己的jsonrpc客户端。在线搜索一个小时后,大多数错误都与执行get的人有关,而不是与发布或收到不同错误的人有关。根据JSONRPC规范(在这里找到),它应该可以工作。任何帮助都将不胜感激。谢谢,山姆 请求和代码如下: 请求后机构: {"method": "GudMethod", "params": {"ur": "HELLO"}, "jsonrpc": "2.0", "id": 1} 请求-响应: { "jsonrpc": "2.0", "res

我正在尝试使用python和请求为项目创建自己的jsonrpc客户端。在线搜索一个小时后,大多数错误都与执行get的人有关,而不是与发布或收到不同错误的人有关。根据JSONRPC规范(在这里找到),它应该可以工作。任何帮助都将不胜感激。谢谢,山姆

请求和代码如下:

请求后机构:

{"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
分配给名称
jsonrpc

根据以下情况,不仅服务器解析您的请求不正确,而且响应也无效:

1) 不应有
结果
字段:

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

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

错误
出现错误时需要此成员。
如果调用过程中未触发错误,则此成员不得存在。
此成员的值必须是第5.1节中定义的对象

3)
error
字段应该是包含以下字段的JSON对象:

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

由于服务器错误地认为
jsonrpc
字段不等于
2.0
,因此错误
code
字段应为-32600,消息字段
无效请求
表示

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


几天前试过,现在才试过。不起作用。规范以字符串形式请求它。参数的顺序在请求中重要吗?在常规JSON中,我知道这不是真的,但是规范中的所有示例都将jsonrpc作为第一个字段。您可以尝试使用OrderedDict构建请求,以便请求json具有正确的order.Nope。作为快速试用,我从spec demo部分复制了一个请求,并替换了其中的字符串。body='{jsonrpc:“2.0”,“method:“#method#”,“params:#PRMS#”,“id:#id#}”。replace(#method#),self.method,1)。replace(#PRMS#),json.dumps(self.PRMS),1)。replace(#id#),str(self.client.id),1)