JSON-RPC 协议是独立的吗?

Is the JSON-RPC protocol independent?

为了实现服务器和客户端之间的双向通信,我在 JSON 上设计了一个简单的协议(看起来 like this)。

想法是要有这样的层:

  1. 硬件级别 – 系统特定
  2. 消息传递级别——一些任意库处理硬件级别以传递和接收字符串消息
  3. MyJSON库级别 – 使用库调用 RPC 或请求资源并获得响应
  4. 应用级别

在我发现 JSON-RPC 存在之前,我有一种重新发明轮子的感觉。

但似乎 JSON-RPC 将第 2 层和第 3 层组合在一起,所以我无法实现语言 L1 和 L2,也无法实现工具 A、B 或 C 的传输。例如,我想要 python 和 C# 实现,结合 ZeroMQ 库作为传输(第 2 层),或与 websocket 传输。这两种工具都允许传递和接收消息,因此图书馆使用它们。或者UDP,或者基本的HTTP。

问题是JSON-RPC层2和层3合并了吗?如果是,是否有像我想要的替代方案,或者我必须坚持自己的认识?

我假设您指的是 "layer 2" 的 Transport 层和 [=69= 的 JAX-RPC runtime ].


引自 this changelog from JSON-RPC 2.0 (which is linked in the official specifications).

Transport independence [of JSON-RPC 2.0]
JSON-RPC 2.0 doesn't define any transport-specific issues, since transport and RPC are independent.
V1.0 defined that exceptions must be raised if the connection is closed, and that invalid requests/responses must close the connection (and raise exceptions).

事实上,如果您阅读规范1,您将找不到任何关于运输的内容。

JSON-RPC可以在任何传输层上。

如果您想使用现有的库来实现运行时,根据 Wikipedia,大多数实现使用 HTTP 或纯 TCP/IP2.
寻找最合适的运行时的过程很乏味,不幸的是我没有使用过它们中的任何一个,但是由于大多数都是开源的并且 tiny3,应该不难插入在一个新的传输层。

此外,由于 C# 和 Python4 都支持解析 JSON、WebSocket 和 Socket,重新实现一个最小的 JSON-RPC runtime 最多也就几天的事。


1强烈建议这样做,因为它们非常简洁明了。

2Phobos是一个抽象传输层的C++实现。

3对于 C# JayRock 可能有希望进行定制。

4不确定 Python。