JSON RPC 2.0:请求对象上的额外字段是否违反规范?

JSON RPC 2.0: Do Extra Fields on Request Objects Violate Specification?

我正在编写一个 JSON RPC 符合 js 库。规范是否允许客户端沿 params 字段向 Request 对象添加自定义字段(例如 headers)?

例如

{"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "headers": { "original-client": 12 }, "id": 1}

规范 (https://www.jsonrpc.org/specification#request_object) 没有提及任何关于添加额外字段的内容。

如果我的图书馆确实添加了 header 字段,是否违反规范?

同样的问题。 (我想添加用户身份验证信息/消息签名...)

您是对的,Specification 没有提及任何关于附加字段的内容。所以legally-speaking,不禁止就是允许

另一方面,我在这里至少找到了一个参考实现:www.simple-is-better.org/rpc/jsonrpc.py,如果解码消息包含额外字段,它会抛出异常。此代码来自 JSON-RPC 2.0 规范的作者之一 Roland Köbler。

所以,YMMV。

  • 如果您的库只是专有系统的内部构建块,请继续。
  • 如果您需要与其他 JSON-RPC 实现交互,请测试每一个。
  • 如果库是供 public 使用的,请不要使用。

编辑:我使用以下协议解决了这个问题:

  • 在 "payload" 消息之前,使用方法 "rpc.secinfo" 发送 standard-compliant 通知。 (rpc. 前缀是 per-spec 为扩展保留的)
  • "params" 字段包含适用的任何元数据(例如用户名、签名)
  • 示例:{"jsonrpc": "2.0", "method": "rpc.secinfo", "params": {"user":"root", "signature":"0xDEADBEEF"}}<DELIM><payload><DELIM>
  • 如果 header 数据为空,则假装没有特殊方法(即行为与标准 json-rpc 完全相同)。

接收方可以像任何其他调用一样解码 header 消息,只需要将 header 应用(检查 sig,无论什么)到以下消息。

讨论:

  • 允许在不触及负载的情况下构建框架
  • 允许在不解码负载的情况下解码 header
  • 允许按原样使用byte-payload,特别是允许加密+文字有效负载共存(但是加密有效负载会破坏JSON-RPC兼容性!)
  • "Unaware"接收者:会无声或大声地把rpc.secinfo呼叫丢掉,但可以操作。缺少 ID 表示通知,即接收方不会根据 JSON-RPC 规范发回响应。
  • "Unaware" 发件人:收到的消息有效,no-header 条消息。

请随意重用此协议,但请注明此 SO 答案。