参见https://www.jsonrpc.org/specification
JSON-RPC(javsscript object nonation-Remote Procedure Call Protocol)是基于json的跨语言远程调用协议,是一种轻量级且无状态的远程过程调用(RPC)协议,RPC是把本地函数映射到 API,即每一个公开给客户端的API对应一个服务函数。
一、JSON-RPC特性:
1.JSON-RPC是轻量级的数据格式,小数据通信。
2.JSON-RPC可以在不同的平台和语言之间进行通信。
3.JSON-RPC可以通过添加自定义的方法和参数来扩展协议。
4.客户端和服务器端交换数据时区分大小写。
5.客户端被定义成原始请求对象和响应对象处理器。
6.服务器被定义成原始响应对象和请求对象处理器。
二、数据交互语法格式:
--> data sent to Server
<-- data sent to Client
三、对象请求方式:
request object是一个rpc call发送请求到服务器,请求格式包含如下的成员:
jsonrpc:JSON-RPC协议版本
method:远程调用方法
params: 传递给远程方法的参数列表,若需要参数,则参数为数组或者对象
id:请求对象的唯一标识
四、响应请求方式:
当进行对象请求后,服务器回复响应格式如下:
jsonrpc:JSON-RPC协议版本
result:当调用成功时,返回method方法的结果;若调用失败,则该成员不存下。
error:若出错时该成员返回错误值,若调用成功该成员不存在
id:与请求对象相同的对象标识
五、error对象的说明:
error对象包含如下的成员
code message meaning
-32700 Parse error Invalid JSON was received by the server.An error occurred on the server while parsing the JSON text.
-32600 Invalid Request The JSON sent is not a valid Request object.
-32601 Method not found The method does not exist / is not available.
-32602 Invalid params Invalid method parameter(s).
-32603 Internal error Internal JSON-RPC error.
-32000 to -32099 Server error Reserved for implementation-defined server-errors.
examples:
1.以数组作为参数方式
--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}
--> {"jsonrpc": "2.0", "method": "subtract", "params": [23, 42], "id": 2}
<-- {"jsonrpc": "2.0", "result": -19, "id": 2}
2.以对象做为参数方式
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3}
<-- {"jsonrpc": "2.0", "result": 19, "id": 3}
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 4}
<-- {"jsonrpc": "2.0", "result": 19, "id": 4}
3.不存在method方式
--> {"jsonrpc": "2.0", "method": "foobar", "id": "1"}
<-- {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "1"}
4.error消息方式
--> {"jsonrpc": "2.0", "method": "foobar, "params": "bar", "baz]
<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}
--> {"jsonrpc": "2.0", "method": 1, "params": "bar"}
<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
六、通知方式:
notification是一个没有id成员的Request对象。通知是不需要回复请求对象。
examples:
--> {"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]}
--> {"jsonrpc": "2.0", "method": "foobar"}
七、批处理对象方式:
在同一时间发送几个请求对象为批处理对象。在处理完所有批处理请求对象后,服务器应使用包含相应响应对象的数组进行处理。对通知的响应对象外,每个请求对象都应该存在一个响应对象。服务器可以将批处理rpc调用作为一组并发任务进行处理,从批处理调用返回的响应对象可以在数组中以任何顺序返回。客户端应该根据每个对象中的id成员来匹配请求对象和响应对象。如果批处理rpc调用未能被识别为有效的JSON或至少具有一个值的数组,则来自服务器的响应必须是单个响应对象。
examples:
--> [
{"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
{"jsonrpc": "2.0", "method"
]
<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}
--> [
{"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
{"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
{"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
{"foo": "boo"},
{"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},
{"jsonrpc": "2.0", "method": "get_data", "id": "9"}
]
<-- [
{"jsonrpc": "2.0", "result": 7, "id": "1"},
{"jsonrpc": "2.0", "result": 19, "id": "2"},
{"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},
{"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"},
{"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}
]
批处理通知方式:
--> [
{"jsonrpc": "2.0", "method": "notify_sum", "params": [1,2,4]},
{"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}
]
<-- //Nothing is returned for all notification batches
八、JSON-RPC JavaScript 数据解析