官方标准定义:JSON-RPC 2.0 Specification (英文版) 百度百科解释:json rpc 2.0 & 1.0 介绍
- 什么是 RPC ? RPC 是 Remote Procedure Call ,字面意思是“远程过程调用”。但是说白了就是从本地机器去执行服务器上的一个函数。所以说 RPC 指的是一类日常的操作,是个很宽泛的概念。
- 什么是 HTTP ?首先说 “HTTP 请求” 本身也可以看做是 RPC 的一种具体形式。HTTP 请求也一样是可以从本地发一个信号到服务器,服务器上执行某个函数,然后返回一些信息给客户端。
- 两者的区别:HTTP 好比普通话,而 RPC 是各地方言,其实这里的 RPC 精确的来讲指的是开发者自己手写的某种 RPC 形式,所以才能跟 HTTP 形成平行关系。这句话可以理解为 HTTP 请求是如此的常见,以至于如果我们自己想开放自己机器的部分功能给任意的人用,那么使用 HTTP API 的形式是非常合适的,因为 HTTP 请求是大家都经常使用的方式。而很多时候,对于公司内部的两台机器之间,大家会按照实际需要去自定制一套 RPC ,这样做的好处是灵活高效,但是坏处就是没有通用性,所以是一种方言。
- 什么是 JSON ?JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。可以理解为一种数据格式定义。JSON是可以表示四个基本类型(String、Numbers、Boolean 和 Null)和两个结构化类型(Objects 和 Array)。任何时候文档涉及JSON数据类型,第一个字母都必须大写:Object、Array、String、Number、Boolean、Null。包括 True 和 False 也要大写。
- 什么是 JSON-RPC ?是一个无状态且轻量级的远程过程调用(RPC)传送协议,其传递内容透过 JSON 。JSON-RPC 直接在内容中定义了欲调用的函数名称(如 {"method": "getUser"})。它允许运行在基于 Socket、HTTP 等诸多不同消息传输环境的同一进程中。其使用 JSON(RFC 4627)作为数据格式。
下面一个json rpc 执行的例子:完成一个减法动作
- 兼容性编辑 :JSON-RPC 2.0 的请求对象和响应对象可能无法在较旧的 JSON-RPC 1.0 客户端或服务端正常运行,然而我们可以很容易在两个版本间区分出 2.0。因为 2.0 版本中必须夹带一个命名为 jsonrpc 且值为 2.0 的字段。而 1.0 版本是没有此字段的。大部分的 2.0 实现应该考虑尝试兼容或者处理 1.0 的对象,即使不是对等的也应给其相关提示。
- 请求对象:发送一个请求对象至服务端代表一个RPC调用,一个请求对象包含下列成员:
- 在请求对象中不建议使用 NULL 作为 id 值,因为该规范将使用空值认定为未知id的请求。
- 不建议使用小数,因为 使用小数是不确定性的,许多十进制小数不能精准的表达为二进制小数。
{"jsonrpc": "2.0", "method": "sayHello", "params": ["Hello JSON-RPC"], "id": 1} //举例:前端发起一个 “请求 ”对象至服务端: “sayHello”
- 通知:没有包含 id 成员的请求对象为通知, 作为通知的请求对象表明客户端对相应的响应对象并不感兴趣,本身也没有响应对象需要返回给客户端。服务端必须不回复一个通知,包含那些批量请求中的。由于通知没有返回的响应对象,所以通知不确定是否被定义。同样,客户端不会意识到任何错误(例如参数缺省,内部错误)。
{"jsonrpc": "2.0", "method": "sayHello", "params": ["Hello JSON-RPC"]} //举例:前端发起一个 “通知 ”对象至服务端: “sayHello” //没有id,不需要回复
- 响应对象:当发起一个RPC调用时,除通知之外,服务端都必须回复响应。响应表示为一个 JSON 对象,使用以下字段:
响应对象必须包含 result 或 error 字段,但两个字段不能同时存在,至少有一个是null,不允许两个同时都是非null的数据
{"jsonrpc": "2.0", "result": "Hello JSON-RPC", "error": null, "id": 1 } //服务器发回一个相应对象,id == 1 和发出的请求一致,这里 “result” 和 “error” 至少一个是 null,不允许两个同时都是非null的数据。
- 错误对象:当一个RPC调用遇到错误时,返回的响应对象必须包含错误成员参数,并且为带有下列成员参数的对象:
-32768 至 -32000 为保留的预定义错误代码。在该范围内的错误代码不能被开发者自己定义,保留下列以供将来使用。错误代码基本与XML-RPC建议的一样
除此之外剩余的错误类型代码可供应用程序作为自定义错误。