在 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 这个范围的错误代码被协议保留,用于类似 "方法没有找到" 或者 "参数不合法" 之类的异常。
来源: http://www.tuicool.com/articles/IVFJNfF