JSON-RPC
JSON-RPC 是一种无状态且轻量级的远程过程调用(RPC)传送协议,并且以传递 JSON 数据为主。相较于一般的 REST 通过网址(如 GET /user)调用远程服务器,JSON-RPC 直接在内容中定义了欲调用的函数名称(如 {"method": "getUser"}),这使得开发者不会陷于该使用 PUT 或者 PATCH 的问题之中。
本文主要介绍 JSON-RPC 的一些数据结构及其相关的处理规则,它使用 JSON(RFC 4627)作为数据格式,可以运行在基于 Socket、HTTP 等诸多不同消息传输环境的同一进程中。
约定
由于 JSON-RPC 使用 JSON,它具有与其相同的类型系统。JSON 可以表示四个基本类型(String、Numbers、Boolean 和 Null)和两个结构化类型(Objects 和 Array)。注意当我们使用 JSON 数据类型时,第一个字母都必须大写,例如 Object、Array、String、Number、Boolean、Null,以及 True 和 False 也要大写。
在客户端与任何被匹配到的服务端之间交换的所有成员名字应是区分大小写的。函数、方法、过程都可以认为是可以互换的。客户端被定义为请求对象的来源及响应对象的处理程序,服务端被定义为响应对象的起源和请求对象的处理程序,如下图所示。

兼容性
目前存在两种 JSON-RPC 规范,分别是 JSON-RPC 1.0 和 JSON-RPC- 2.0。
- JSON-RPC 1.0 在多个方面缺乏实用性,特别是缺少名称参数和错误消息解释,引起的麻烦超出了预期。使得它更像是一种点对点的交流方式。
- JSON RPC 2.0 规范则解决了 1.0 版本的缺陷,表现得更加先进。使用客户机-服务器模式,同时增加了多种传输方式的支持。
值得注意的是,JSON-RPC 2.0 的请求对象和响应对象可能无法在较旧的 JSON-RPC 1.0 客户端或服务端正常运行。不过我们可以很容易地区分出两个版本,因为 2.0 版本中必须夹带一个命名为 jsonrpc 且值为 2.0 的字段,而 1.0 版本是没有此字段的。大部分的 2.0 实现应该考虑尝试兼容或者处理 1.0 的对象,即使不是对等的也应给其相关提示。