JSON-RPC 一览

  • Jonathan Allen
  • 张健欣

2017 年 12 月 18 日

话题:语言 & 开发

在 12 月 13 日关于Visual Studio 支持语言服务器协议(Language Server Protocol,LSP)的报道中,我们提到其 LSP 是基于JSON-RPC 2.0实现的。尽管早在十多年前就已经被创建,JSON-RPC 并没有像 SOAP 或 REST 那样有名。

顾名思义,JSON-RPC 是基于 JSON 的,用来发起远程程序调用。它与 REST 不同的地方在于,REST 是以数据为中心的;而使用 JSON-RPC,你写的代码大部分是关于创建、修改、检索文档或记录。RPC 设计强调对外部程序函数的调用。当然,正如 REST 调用一样,那些函数也会操作文档,而不仅仅是存储数据。

在很多情况下,JSON-RPC 2.0 可以被当作SOAP的一个轻量级替代方案。和 SOAP 类似,它主要关注消息格式。其它问题,例如传输层(sdtio、sockets、HTTP、named pipes 等),不在这个协议的考虑范围。

JSON-RPC 可以和消息队列之类的异步传输方法一起使用,之所以能够这样,是因为每个请求都必须包含一个 correlation id。这使得比普通 HTTP 更高效的通信成为可能,因为它支持在无需多个连接的情况下同时挂起多个请求。

JSON-RPC 的另一个非常有用的功能是,它支持批量操作。也就是说,一条消息可以在一个数组中包含无限数量的请求。对这些请求可以以任意顺序单独响应或者以数组的方式响应,由此也可以看出,使用 correlation id 是非常重要的。

JSON-RPC 也支持通知。通知有点像请求,但是它不包含 correlation id。因此,服务器不会响应这个消息,即使只是告知客户端发生了错误。因此,不建议使用通知。

备注:在语言服务器协议中,微软使用通知来取消一个挂起的请求。而且即使如此,语言服务器也没有义务响应这些通知。

错误消息包含错误代码和错误说明。从 -32768 到 -32000 这个范围的错误代码被协议保留,用于类似“方法没有找到”或者“参数不合法”之类的异常。

查看英文原文:A Look at JSON-RPC


感谢薛命灯对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

语言 & 开发