理解JSON-RPC 2.0 协议

JSON-RPC 2.0是指一种基于 JSON 的远程过程调用协议,用于在网络上进行跨平台和跨语言的通信。它提供了一种简单、轻量级的方式来实现客户端和服务器之间的方法调用和数据交换。在原文中,JSON-RPC 2.0被用来描述 STDIO 传输机制中消息的格式,即客户端通过标准输入输出流与服务器通信时,消息是按照 JSON-RPC 2.0 的规范进行编码的。

JSON-RPC 2.0的具体含义包括:

  • 它是一种无状态的轻量级 RPC 协议,使用 JSON 作为数据交换格式。
  • 请求和响应都必须包含 jsonrpc 字段,其值为 "2.0",以指明使用的协议版本。
  • 请求必须包含 method 字段,表示要调用的方法名。
  • 请求可以包含 params 字段,用于传递调用方法的参数。
  • 请求可以包含 id 字段,用于关联请求和响应,但通知类型请求可以省略 id
  • 响应必须包含 jsonrpc 字段,值为 "2.0",以及 id 字段,以便客户端知道哪个请求得到了响应。
  • 成功的响应包含 result 字段,用于返回方法调用的结果。
  • 错误响应包含 error 字段,用于描述错误信息,包括错误代码、错误消息和可选的额外数据。

JSON-RPC 2.0在智能体通信协议MCP中被采用,作为其传输层的一部分,使得AI模型能够通过统一的标准接口与外部数据源和工具进行交互。这不仅简化了集成过程,还提高了灵活性和扩展性。

以下是一个符合 JSON-RPC 2.0 规范的完整交互示例,包含请求、成功响应和错误响应三种典型场景:

json 复制代码
// 客户端请求(位置参数版本)
{
  "jsonrpc": "2.0",
  "method": "getUserInfo",
  "params": [12345],
  "id": "req_20250409_001"
}

// 服务端成功响应
{
  "jsonrpc": "2.0",
  "result": {
    "userId": 12345,
    "name": "张三",
    "email": "zhangsan@example.com",
    "registrationDate": "2024-03-15"
  },
  "id": "req_20250409_001"
}

// 服务端错误响应(当用户不存在时)
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32602,
    "message": "Invalid params",
    "data": "User ID does not exist"
  },
  "id": "req_20250409_001"
}

扩展场景示例:

  1. 命名参数调用(更适合复杂参数)
bash 复制代码
// 带命名参数的请求
{
  "jsonrpc": "2.0",
  "method": "calculateDistance",
  "params": {
    "start": {"lat": 31.2304, "lng": 121.4737},
    "end": {"lat": 39.9042, "lng": 116.4074}
  },
  "id": "geo_001"
}
  1. 通知型请求(不需要响应)
json 复制代码
// 服务端不会返回响应的通知
{
  "jsonrpc": "2.0",
  "method": "logEvent",
  "params": {
    "eventType": "user_login",
    "timestamp": "2025-04-09T14:30:00Z"
  }
}
  1. 批处理请求
json 复制代码
// 同时发送两个查询请求
[
  {"jsonrpc":"2.0","method":"getStockPrice","params":["AAPL"],"id":"stock_1"},
  {"jsonrpc":"2.0","method":"getWeather","params":["Shanghai"],"id":"weather_1"}
]

协议特性说明:

必选字段:所有消息必须包含 "jsonrpc": "2.0"

错误代码规范:

  • -32700 解析错误(Parse error)

  • -32600 无效请求(Invalid Request)

  • -32601 方法未找到(Method not found)

  • -32602 无效参数(Invalid params)

应用级错误建议使用 -32000 至 -32099 范围

参数传递支持两种形式:有序数组(适用于位置参数)或键值对对象(适用于命名参数)。


实际应用中,该协议常用于:

  1. 浏览器插件与宿主程序通信
  2. 微服务间的轻量级交互
  3. IDE 与语言服务器的通信(如VSCode的LSP协议)
  4. IoT设备控制指令传输
相关推荐
梦帮科技1 小时前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
R_.L3 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
无小道5 小时前
Qt——常用控件
开发语言·qt
初次见面我叫泰隆6 小时前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
数据知道6 小时前
PostgreSQL实战:详解如何用Python优雅地从PG中存取处理JSON
python·postgresql·json
牵牛老人7 小时前
【Qt 开发后台服务避坑指南:从库存管理系统开发出现的问题来看后台开发常见问题与解决方案】
开发语言·qt·系统架构
xmRao8 小时前
Qt+FFmpeg 实现 PCM 音频转 AAC 编码
qt·ffmpeg·pcm
xmRao8 小时前
Qt+FFmpeg 实现录音程序(pcm转wav)
qt·ffmpeg
喜欢喝果茶.8 小时前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
wjhx9 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt