深入分析 json2(新)与标准的 jsonrpc的区别
这两个模块都用于实现 JSON 风格的远程过程调用(RPC)接口,但设计哲学、使用方式、安全性和现代化程度有显著差异。
📂 对比背景
文件 | 功能 | 来源 |
| 标准的 JSON-RPC 2.0 兼容接口 | Odoo 内核已有逻辑 |
| 自定义的 类 REST + RPC 混合风格 API | 更现代、更可控的尝试 |
💡 虽然名字相似,但 json2.py
并 不是 JSON-RPC 2.0 协议的“升级版”,而是一种新风格 API 的探索。
🔍 详细对比分析
对比维度 |
|
|
✅ 是否符合 JSON-RPC 2.0 标准 | ✅ 是 | ❌ 否 |
🔄 请求路径 | 固定: | 动态: |
🧩 协议格式 | 完整 JSON-RPC 协议结构 | 简化类 RPC 结构 |
🔐 认证方式 |
|
|
🔍 方法定位 |
| 路径直接指定 |
🛠️ 使用复杂度 | 高(需构造完整协议包) | 低(路径直观,参数清晰) |
⚙️ 参数传递 | 通过 JSON-RPC 的 | 通过 JSON body + URL 参数 |
🧱 底层分发机制 | 通用 | 自定义 |
📦 返回格式 | JSON-RPC 规范格式 | 自定义结构(自动包装为 JSON) |
🔒 安全控制 | 弱(默认无认证) | 强(Token + readonly 动态判断) |
🧪 可读性 / 易用性 | 差(对前端不友好) | 好(类似 REST) |
💬 适用场景 | 旧系统兼容、外部工具集成 | 现代 Web App、移动端 API |
🧩 1. 协议规范性对比
✅ jsonrpc.py
—— 符合 JSON-RPC 2.0 协议
典型请求:
{"jsonrpc": "2.0","id": 1,"method": "call","params": {"service": "object","method": "execute_kw","args": ["dbname",1,"api_key","res.partner","search_read",[[["is_company", "=", true]]],{"fields": ["name", "email"]}]}
}
- 使用统一入口
/jsonrpc
- 方法调用依赖嵌套参数(
execute_kw
) - 完全兼容标准协议,可用于通用客户端(如
jsonrpclib
)
✅ 优势:标准化、工具链丰富
❌ 劣势:参数嵌套深,难以调试,不直观
❌ json2.py
—— 非标准协议,更像 “RESTful RPC”
典型请求:
POST /json/2/res.partner/search_read
Authorization: Bearer abc123
Content-Type: application/json
{"args": [],"kwargs": {"domain": [["is_company", "=", true]],"fields": ["name", "email"]},"context": {"lang": "en_US"}
}
或更简化:
{"domain": [["is_company", "=", true]],"fields": ["name", "email"]
}
- 路径即操作:
/json/2/<模型>/<方法>
- 方法参数扁平化,易于理解
- 不需要写
execute_kw
这种“元调用”
✅ 优势:开发者友好、类 REST、易集成
❌ 劣势:不是标准协议,不能用通用 JSON-RPC 客户端直接连接
🔐 2. 认证机制对比
jsonrpc.py
@route('/jsonrpc', type='jsonrpc', auth="none", save_session=False)
auth="none"
:不进行任何内置认证;- 安全性依赖于传递的
dbname
,uid
,password/api_key
在args
中; - 极易被滥用或泄露凭证;
- 实际使用时需额外中间件或封装保护。
❗ 安全隐患较大,尤其暴露 /jsonrpc
给公网时。
json2.py
auth='bearer'
- 使用标准
Authorization: Bearer <token>
头; - 与 OAuth2、JWT 或 Odoo 的 token 服务集成;
- 无需在 body 中传递数据库名、用户 ID、密码等敏感信息;
save_session=False
表示无状态;- 更适合现代 API 架构。
✅ 更安全、更现代化。
🚪 3. 路由与调用方式对比
项目 |
|
|
API 入口 | 单一 | 多路径 |
方法选择 | 通过 | 通过 URL 路径指定 |
参数结构 | 深嵌套数组/对象( | 扁平结构,recordset 自动构造 |
可读性 | 差 | 好 |
✅ json2.py
的方式更符合 开发者直觉,类似 Django REST Framework 或 FastAPI。
⚙️ 4. 内部机制对比
特性 |
|
|
分发器 | 内置 | 自定义 |
参数合并 | 由 | 自主合并 `json |
错误处理 | 框架默认返回 JSON-RPC error | 自定义 |
模型方法调用 | 通过 | 直接调用模型方法( |
参数校验 | 几乎无校验 | 使用 |
✅ json2.py
实现了更强的 可控性与安全性。
🧱 5. 模型方法调用逻辑对比
jsonrpc.py
return dispatch_rpc(service, method, args)
service
: 如object
、db
、common
method
: 如execute
,execute_kw
- 实际执行的是
odoo.service.web_services.object_proxy.dispatch()
- 是一个通用网关,适合多种服务
json2.py
func = get_public_method(Model, method)
result = func(records, **kwargs)
- 直接获取模型上的公开方法;
- 自动构造 records(基于
ids
); - 支持签名验证;
- 排除非法调用(如
_api_model
+ids
);
✅ 更精细控制,更少中间层。
📦 6. 响应格式对比
jsonrpc.py
返回(标准 JSON-RPC):
{"jsonrpc": "2.0","id": 1,"result": [...]
}
或错误:
{"jsonrpc": "2.0","id": 1,"error": {"code": 404,"message": "Not Found","data": { ... }}
}
json2.py
返回(Odoo 封装):
成功:
{"result": [1, 2, 3],"jsonrpc": "2.0","id": null
}
错误(统一 JSON 化):
{"error": {"code": 400,"message": "Bad Request","data": { "name": "odoo.exceptions.BadRequest", "debug": "..." }},"jsonrpc": "2.0","id": null
}
✅json2.py
虽然也返回jsonrpc
字段,但其实只是 借用格式,并非真正遵循协议(缺少id
传递等)。
🧪 使用体验对比
场景 |
|
|
前端调用 | 需要封装 | 直接 |
文档生成 | 难以自动生成 | 路径清晰,可做 API 文档 |
测试 | 麻烦,参数深嵌套 | 可直接在 Postman 测试 |
权限控制 | 弱 | 支持动态 readonly、token 校验 |
扩展性 | 低(固定协议) | 高(可加入版本、过滤等) |
✅ 总结:核心区别一览表
功能 |
|
|
是否标准协议 | ✅ 是(JSON-RPC 2.0) | ❌ 否(自定义风格) |
路径设计 | 固定 | 动态 |
易用性 | ❌ 低(参数嵌套深) | ✅ 高(类 REST) |
安全性 | ❌ 弱(无默认认证) | ✅ 强(Bearer Token) |
参数校验 | 无 | 有( |
只读控制 | 无 | 有(动态 |
返回格式 | 标准 JSON-RPC | 借用 JSON-RPC 格式 |
适用人群 | 老系统、工具对接 | 新项目、现代前端 |
可维护性 | 中等 | 高(代码结构清晰) |
是否推荐用于新项目 | ❌ 不推荐 | ✅ 推荐 |
🎯 结论
选择建议 | 推荐场景 |
✅ 使用 | 新项目、内部 API、移动 App、SPA 前端(React/Vue) |
⚠️ 保留 | 兼容旧客户端、第三方工具(如 ERP 集成工具)、需要标准协议支持 |
💡 理想情况:
用json2.py
构建 主业务 API;
用jsonrpc.py
保留 兼容入口;
将两者统一网关管理(如通过 API Gateway)。
🚀 进一步优化建议(基于 json2.py
)
- 加入 OpenAPI/Swagger 支持(可通过路由注册生成文档)
- 支持 GET 请求自动推断为
read
/search_read
- 加入速率限制(rate limiting)
- 增加字段过滤、分页、排序等通用参数支持
- 支持
batch
批量操作 - 返回结果支持
links
、meta
分页信息
如果你正在设计一个现代 Odoo API 接口,强烈建议基于 json2.py
的模式进行扩展,它代表了 Odoo 向更现代化、更安全、更易用的 API 演进的方向。