当前位置: 首页 > news >正文

理解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 规范的完整交互示例,包含请求、成功响应和错误响应三种典型场景:

// 客户端请求(位置参数版本)
{
  "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. 命名参数调用(更适合复杂参数)
// 带命名参数的请求
{
  "jsonrpc": "2.0",
  "method": "calculateDistance",
  "params": {
    "start": {"lat": 31.2304, "lng": 121.4737},
    "end": {"lat": 39.9042, "lng": 116.4074}
  },
  "id": "geo_001"
}
  1. 通知型请求(不需要响应)
// 服务端不会返回响应的通知
{
  "jsonrpc": "2.0",
  "method": "logEvent",
  "params": {
    "eventType": "user_login",
    "timestamp": "2025-04-09T14:30:00Z"
  }
}
  1. 批处理请求
// 同时发送两个查询请求
[
  {"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 范围

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

相关文章:

  • 力扣HOT100之链表:24. 两两交换链表中的节点
  • 1. Git 下载和安装
  • docker compose安装智能体平台N8N
  • 蓝桥杯嵌入式按键长按双击
  • 408 计算机网络 知识点记忆(5)
  • Go 微服务框架 | 中间件
  • C++17模板编程与if constexpr深度解析
  • LLM实现模型并行训练:deepspeed 是什么; transformers` 怎么实现模型并行训练吗?
  • 嵌入式Linux驱动——3 总线设备驱动模型
  • C++23新特性详解:迈向更现代化的C++
  • 微服务之间调用外键“翻译”的方法概述
  • 47常用控件_QWidget的toolTip属性
  • 使用Conda创建环境存在问题
  • 力扣448.找到数组中所有消失的元素
  • 从繁琐到高效,2025年AI PPT工具选秒出PPT
  • Java性能调优2025:从JVM到Kubernetes的全链路优化策略
  • SpringWebFlux WebClient:非阻塞HTTP请求客户端
  • 1.认识C语言
  • Helm核心概念与常见操作介绍
  • 设计模式 --- 原型模式
  • 网站建设中企动力推荐/seo网络推广知识
  • 深圳做网站乐云seo598/网络广告营销的特点
  • 网站a记录吗/seo是什么意思 seo是什么职位
  • 网站主要栏目/东莞seo网站排名优化公司
  • 广州网站制作服务/seo培训一对一
  • 网站建设项目的结论/网店代运营合同