理解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设备控制指令传输
相关推荐
范特西.i5 天前
QT聊天项目(8)
开发语言·qt
枫叶丹45 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
十五年专注C++开发5 天前
Qt deleteLater作用及源码分析
开发语言·c++·qt·qobject
kangzerun5 天前
SQLiteManager:一个优雅的Qt SQLite数据库操作类
数据库·qt·sqlite
金刚狼885 天前
qt和qt creator的下载安装
开发语言·qt
追烽少年x5 天前
Qt中使用Zint库显示二维码
qt
谁刺我心5 天前
qt源码、qt在线安装器镜像下载
开发语言·qt
上海合宙LuatOS5 天前
LuatOS核心库API——【json 】json 生成和解析库
java·前端·网络·单片机·嵌入式硬件·物联网·json
敲代码的柯基5 天前
一篇文章理解tsconfig.json和vue.config.js
javascript·vue.js·json
金刚狼885 天前
在qt creator中创建helloworld程序并构建
开发语言·qt