1. 一句话定义
JSON-RPC 是一种基于 JSON 格式的远程调用协议,允许你像调用本地函数一样,通过网络操作远程服务。它的核心是:“告诉服务端做什么,怎么传数据我说了算”。
2. 核心特性(用比喻理解)
① 协议无关的“万能遥控器”
- 不挑设备:JSON-RPC 不依赖特定传输方式,可以跑在 HTTP、WebSocket、TCP 甚至信鸽(理论上🐦)上。
- 核心能力:无论用哪种方式传输,只需保证数据格式是 JSON-RPC 规范。
② 方法导向的“指令集”
-
像遥控器按键:每个远程操作对应一个“方法名”(如
playMovie、turnOffLight)。 -
示例指令:
json { "jsonrpc": "2.0", "method": "startCoffeeMachine", // 按下“煮咖啡”按钮 "params": {"type": "Latte", "size": "Large"}, // 参数:咖啡类型和大小 "id": 1 // 标记这是第1个请求 }
③ 无状态的“临时工”
- 不记仇:每次请求独立,服务端不保存客户端状态。
- 场景举例:就像每次点外卖都要重新告诉骑手地址,即使你昨天刚点过。
3. 工作原理(快递员比喻)
请求发送流程
- 打包数据(你写快递单):
将方法名、参数按 JSON-RPC 格式封装成请求体。 - 选择快递公司(传输层):
选 HTTP、WebSocket 等“快递渠道”发送数据。 - 派送与处理(服务端拆包裹):
服务端解析 JSON,执行对应方法,返回结果。
响应示例
json
{
"jsonrpc": "2.0",
"result": "Coffee is ready! ☕️", // 煮咖啡成功
"id": 1 // 对应请求ID
}
4. 核心数据结构
请求格式
| 字段 | 说明 | 必填 |
|---|---|---|
jsonrpc | 协议版本(固定"2.0") | ✔️ |
method | 要调用的方法名(如 getUser) | ✔️ |
params | 方法参数(对象或数组) | ❌ |
id | 请求标识(用于匹配响应) | ❌(通知类请求可省略) |
响应格式
| 字段 | 说明 |
|---|---|
jsonrpc | 协议版本(固定"2.0") |
result | 成功时的返回结果 |
error | 失败时的错误信息(含错误码) |
id | 对应请求的ID |
5. 应用场景(什么情况用它?)
① 复杂业务逻辑
- 场景:需要执行多步骤操作(如电商下单:扣库存、生成订单、发短信)。
- JSON-RPC 优势:一个请求封装复杂逻辑,避免 RESTful 多次调用。
② 实时交互系统
- 场景:在线游戏指令、聊天消息推送。
- 传输层选择:通过 WebSocket 实现低延迟通信。
③ 跨协议混合架构
- 场景:物联网设备通过 TCP 上报数据 + 手机 App 通过 HTTP 控制设备。
- JSON-RPC 优势:统一数据格式,不同协议无缝衔接。
6. 与 RESTful 的对比(点菜 vs 遥控器)
| 对比维度 | JSON-RPC | RESTful |
|---|---|---|
| 设计哲学 | 遥控器式操作(按按钮执行方法) | 菜单式操作(选资源 + 标准动作) |
| 接口语义 | 方法名自定义(如 launchRocket) | 依赖 HTTP 方法(GET/POST等) |
| 灵活性 | 高(参数结构自由) | 低(需符合资源化设计) |
| 典型场景 | 复杂逻辑、跨协议通信 | 简单 CRUD、标准化 API |
| 传输层依赖 | 不依赖(可适配任何协议) | 必须基于 HTTP |
7. 代码示例(3 分钟上手)
Python 客户端发送请求
python
import requests
# 调用远程方法:获取天气
response = requests.post(
"http://api.weather.com/rpc",
json={
"jsonrpc": "2.0",
"method": "getWeather",
"params": {"city": "Beijing"},
"id": 1
}
)
print(response.json())
# 输出:{"jsonrpc": "2.0", "result": "Sunny 26°C", "id": 1}
Node.js 服务端处理请求
javascript
const http = require('http');
const server = http.createServer((req, res) => {
if (req.method === 'POST') {
let body = '';
req.on('data', chunk => body += chunk);
req.on('end', () => {
const request = JSON.parse(body);
if (request.method === 'getWeather') {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify({
jsonrpc: "2.0",
result: "Sunny 26°C",
id: request.id
}));
}
});
}
});
server.listen(3000);
8. 优缺点总结
优点
- 灵活自由:方法名、参数结构完全自定义。
- 跨协议兼容:适配 HTTP、WebSocket、TCP 等多种传输方式。
- 适合复杂逻辑:单次请求可封装多步骤操作。
缺点
- 缺乏约定:方法名和参数设计依赖开发者规范,易导致混乱。
- 不适合简单 CRUD:对资源型操作不如 RESTful 直观。
9. 什么时候不用 JSON-RPC?
- 场景:构建公开的、标准化的资源型 API(如开放平台接口)。
- 替代方案:选择 RESTful,利用 HTTP 语义天然易懂。
10. 总结
JSON-RPC 就像编程界的“万能遥控器”:
- 你定义按钮(方法),它负责跨网络按下按钮。
- 不挑设备(传输协议),但需要自己贴标签(设计接口)。
- 适合场景:需要灵活性和复杂逻辑的远程调用,而非简单的资源管理。
记住它的核心口诀:
“方法我来定,数据我封装,传输你随意,结果返回来!”
文章由AI生成