由于RPC使用形式上调用同一个进程内存空间的函数或方法一样,因此需要解决以下3个问题
JSON-RPC是一个无状态且轻量级的RPC协议,其传输内容以JSON方式,相对于一般的HTTP请求通过URI调用远程服务器,JSON-RPC直接在内容中定义了要调用的函数名称(如 {“method”: “getUser”}),对于开发者来说非常的方便。Bitcoin和Ethereum都支持JSON-RPC通过客户端直接调用节点上的函数或方法。
注意: 以rpc开头的方法名预留作为系统扩展,且必须不能用于其他地方。
一个JSON-RPC的请求必须包含以下4个字段:
当发起一个RPC调用时,除通知之外服务端都必须有响应,响应表示为一个JSON对象包含以下几个字段:
1、-32700: Parse error语法解析错误 (服务端接收到无效的json。该错误发送于服务器尝试解析json文本)
2、-32600: Invalid Request (发送的json不是一个有效的请求对象)
3、-32601: Method not found (该方法不存在或无效)
4、-32602: Invalid params (无效的方法参数)
5、-32603: Internal error (JSON-RPC内部错误)
6、-32000 ~ -32099: Server error (预留用于自定义的服务器错误)
7、-32768 ~ -32000: 保留的预定义错误代码, 保留下列以供将来使用
1. 带索引数组参数的rpc调用
--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}
2. 带关联数组参数的rpc调用
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3}
<-- {"jsonrpc": "2.0", "result": 19, "id": 3}
3. rpc批量调用
--> [{"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"}]
1. 不包含调用方法的rpc调用
--> {"jsonrpc": "2.0", "method": "foobar", "id": "1"}
<-- {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "1"}
2. 包含无效json的rpc调用
--> {"jsonrpc": "2.0", "method": "foobar, "params": "bar", "baz]
<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}
3. 无效请求对象的rpc调用
--> {"jsonrpc": "2.0", "method": 1, "params": "bar"}
<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
HTTP 请求,可以认为是 RPC 的一种具体形式。
HTTP可以理解为普通话,RPC是方言。
很多时候,对于公司内部的两台机器之间,大家会按照实际需要去自定制一套 RPC ,这样做的好处是灵活高效,但是坏处就是没有通用性。