深入分析 json2(新)与标准的 jsonrpc的区别

这两个模块都用于实现 JSON 风格的远程过程调用(RPC)接口,但设计哲学、使用方式、安全性和现代化程度有显著差异。


📂 对比背景

文件

功能

来源

jsonrpc.py

标准的 JSON-RPC 2.0 兼容接口

Odoo 内核已有逻辑

json2.py

自定义的 类 REST + RPC 混合风格 API

更现代、更可控的尝试

💡 虽然名字相似,但 json2.py不是 JSON-RPC 2.0 协议的“升级版”,而是一种新风格 API 的探索。

🔍 详细对比分析

对比维度

jsonrpc.py

json2.py

✅ 是否符合 JSON-RPC 2.0 标准

✅ 是

❌ 否

🔄 请求路径

固定:/jsonrpc

动态:/json/2/<model>/<method>

🧩 协议格式

完整 JSON-RPC 协议结构

简化类 RPC 结构

🔐 认证方式

auth="none"(需手动认证)

auth='bearer'(支持 Token)

🔍 方法定位

service.method(如 object.execute

路径直接指定 <model>.<method>

🛠️ 使用复杂度

高(需构造完整协议包)

低(路径直观,参数清晰)

⚙️ 参数传递

通过 JSON-RPC 的 params 数组或对象

通过 JSON body + URL 参数

🧱 底层分发机制

通用 dispatch_rpc

自定义 Dispatcher + 控制器

📦 返回格式

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_keyargs 中;
  • 极易被滥用或泄露凭证;
  • 实际使用时需额外中间件或封装保护。
❗ 安全隐患较大,尤其暴露 /jsonrpc 给公网时。

json2.py

auth='bearer'
  • 使用标准 Authorization: Bearer <token> 头;
  • 与 OAuth2、JWT 或 Odoo 的 token 服务集成;
  • 无需在 body 中传递数据库名、用户 ID、密码等敏感信息
  • save_session=False 表示无状态;
  • 更适合现代 API 架构。
✅ 更安全、更现代化。

🚪 3. 路由与调用方式对比

项目

jsonrpc.py

json2.py

API 入口

单一 /jsonrpc

多路径 /json/2/model/method

方法选择

通过 params.service/method 指定

通过 URL 路径指定

参数结构

深嵌套数组/对象(execute_kw(db, uid, pw, model, ...)

扁平结构,recordset 自动构造

可读性

json2.py 的方式更符合 开发者直觉,类似 Django REST Framework 或 FastAPI。


⚙️ 4. 内部机制对比

特性

jsonrpc.py

json2.py

分发器

内置 type='jsonrpc' → 由框架处理

自定义 Json2RpcDispatcher

参数合并

dispatch_rpc 处理

自主合并 `json

错误处理

框架默认返回 JSON-RPC error

自定义 handle_error,统一 JSON 输出

模型方法调用

通过 execute_kw 等中介方法

直接调用模型方法(Model.method()

参数校验

几乎无校验

使用 inspect.signature.bind() 校验

json2.py 实现了更强的 可控性与安全性


🧱 5. 模型方法调用逻辑对比

jsonrpc.py

return dispatch_rpc(service, method, args)
  • service: 如 objectdbcommon
  • 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 传递等)。

🧪 使用体验对比

场景

jsonrpc.py

json2.py

前端调用

需要封装 execute_kw

直接 POST /json/2/model/method

文档生成

难以自动生成

路径清晰,可做 API 文档

测试

麻烦,参数深嵌套

可直接在 Postman 测试

权限控制

支持动态 readonly、token 校验

扩展性

低(固定协议)

高(可加入版本、过滤等)


✅ 总结:核心区别一览表

功能

jsonrpc.py

json2.py

是否标准协议

✅ 是(JSON-RPC 2.0)

❌ 否(自定义风格)

路径设计

固定 /jsonrpc

动态 /json/2/model/method

易用性

❌ 低(参数嵌套深)

✅ 高(类 REST)

安全性

❌ 弱(无默认认证)

✅ 强(Bearer Token)

参数校验

有(inspect.signature

只读控制

有(动态 readonly=

返回格式

标准 JSON-RPC

借用 JSON-RPC 格式

适用人群

老系统、工具对接

新项目、现代前端

可维护性

中等

高(代码结构清晰)

是否推荐用于新项目

❌ 不推荐

✅ 推荐


🎯 结论

选择建议

推荐场景

✅ 使用 json2.py 风格

新项目、内部 API、移动 App、SPA 前端(React/Vue)

⚠️ 保留 jsonrpc.py

兼容旧客户端、第三方工具(如 ERP 集成工具)、需要标准协议支持

💡 理想情况:
json2.py 构建 主业务 API
jsonrpc.py 保留 兼容入口
将两者统一网关管理(如通过 API Gateway)。

🚀 进一步优化建议(基于 json2.py

  1. 加入 OpenAPI/Swagger 支持(可通过路由注册生成文档)
  2. 支持 GET 请求自动推断为 read/search_read
  3. 加入速率限制(rate limiting)
  4. 增加字段过滤、分页、排序等通用参数支持
  5. 支持 batch 批量操作
  6. 返回结果支持 linksmeta 分页信息

如果你正在设计一个现代 Odoo API 接口,强烈建议基于 json2.py 的模式进行扩展,它代表了 Odoo 向更现代化、更安全、更易用的 API 演进的方向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95474.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO_HW_9_3

一、使用消息队列实现两个程序间的相互通信二、思维导图三、牛客网

fastlio配置与过程中遇到的问题

&#x1f680; Fast-LIO 安装与运行指南 我之前已经创建并使用原有的工作空间 catkin_ws,如果没有创建一个。 使用环境 ubantu20.04 ros1 noetic版本 我作的是要在已有的 ~/catkin_ws 中编译 原版 FAST-LIO&#xff08;来自 HKU-MARS 官方仓库&#xff09;。 最终下载官方文档中…

Python 工具: Windows 带宽监控工具

Python 工具&#xff1a; Windows 带宽监控工具环境介绍会使用的库多线程关键代码&#xff1a;系统流量采集&#xff1a;用 psutil 获取网络数据概念&#xff1a;网络流量的“增量”与“总量”代码中的流量采集逻辑Flask Web框架&#xff1a;搭建后端服务前端部分交互逻辑&…

【Java】Redis(中间件)

一、对Redis的理解Reids是一种基于内存的数据库&#xff0c;对数据的读写操作都在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存、消息队列、分布式锁等场景。除此之外&#xff0c;Redis还支持事务、持久化、Lua脚本、多种集群方案&#xff08;主从复制模式…

【题解】洛谷P1776 宝物筛选 [单调队列优化多重背包]

二进制优化还是不够快&#xff0c;如果我们想时间复杂度为 &#xff0c;还得找新的方法。 &#xff08;W 为背包最大可承载量&#xff0c;N 为物品种类数&#xff09; 例题&#xff1a;P1776 宝物筛选 - 洛谷 原来的转移式很普通&#xff1a; 注意到对于每个 &#xff0c;有…

数据结构_循环队列_牺牲一个存储空间_不牺牲额外的存储空间 Circular Queue(C语言实现_超详细)

目录循环队列的引出区别普通队列和循环队列两种循环队列的概念循环队列深入理解题目&#xff1a;此题&#xff0c;分为牺牲一个额外空间和不牺牲一个额外空间不牺牲一个额外空间完成第一步完成第二步完成第三步完成第四步牺牲一个额外空间完成第一步完成第二步完成第三步完成第…

Linux_网络基础

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;LInux_st 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&a…

Portainer:Docker可视化管理神器部署与使用攻略

Portainer是一款优秀的Docker可视化管理工具&#xff0c;它提供了简洁美观的Web界面&#xff0c;可以通过点击鼠标轻松管理Docker环境。 一、Portainer简介 Portainer是一个轻量级的Docker管理界面&#xff0c;具有以下特点&#xff1a; 可视化操作&#xff1a;通过Web界面管…

OVITO3.13.1_ Mac中文_材料科学、物理及化学领域设计的数据可视化和分析软件_安装教程

软件下载 【名称】&#xff1a;****OVITO3.13.1Mac中文 【大小】&#xff1a;****154M 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;****mac 【网站下载链接】&#xff1a; https://a-xing.top/3008.html软件应用 软件应用 Ovito能做什么&#xff1f; Ovito的功能十…

MySQL 开发避坑:DROP TABLE 前你必须知道的几件事

MySQL 中删除表主要使用 DROP TABLE 语句。这是一个需要非常谨慎的操作&#xff0c;因为一旦执行&#xff0c;表结构和表中的所有数据都会被永久删除。1. 基本语法&#xff1a;删除单个表sqlDROP TABLE [IF EXISTS] table_name;* DROP TABLE: 核心命令&#xff0c;用于删除表…

浅谈人工智能之阿里云搭建coze平台

浅谈人工智能之阿里云搭建coze平台 一、部署环境准备 阿里云服务器配置要求 ○ 规格&#xff1a;最低2核CPU 4GB内存&#xff08;推荐4核8GB保障流畅运行&#xff09;&#xff0c;作者原先想要利旧&#xff0c;使用了2核2GB的服务器&#xff0c;但是跑不起来&#xff0c;后来自…

ego(2)---初始轨迹生成后的关键点采样

在初始的多项式轨迹生成后&#xff0c;是要经过一个关键点采样&#xff0c;使用关键点来进行后续的 B 样条曲线拟合的。即&#xff1a;初始多项式拟合->关键点采样->B样条拟合关键点采样的思路关键点采样使用时间步长 ts 来在初始轨迹方程中取点。在上一步的初始轨迹生成…

专项智能练习(信息安全防护措施)

3.以下属于网络安全威胁的是&#xff08;A &#xff09;。 A.非授权访问、病毒感染、信息泄露、拒绝网络服务 B.信息泄露、非授权访问、病毒感染、硬盘损坏 C.信息篡改、非授权访问、病毒感染、硬盘损坏 D.网络异常、非授权访问、信息篡改、病毒感染 解析本题考查网络安全威胁。…

ubuntu编译webrtc库

一. 前言 本文介绍在 ubuntu 下如何通过 webrtc 源码编译出指定版本 webrtc.lib 库&#xff08;以 m94 版本为例&#xff09;。 二. 编译步骤 1. 下载depot_tools工具 depot_tools 是 Google 用来管理大型项目代码&#xff08;例如 WebRTC&#xff09;的工具集&#xff0c;它…

基于ZooKeeper实现分布式锁(Spring Boot接入)及与Kafka实现的对比分析

在分布式系统中,多节点对共享资源的并发访问往往会引发数据一致性问题,分布式锁正是解决这一问题的核心组件。本文将从原理出发,详细讲解基于ZooKeeper实现分布式锁的完整流程,提供Spring Boot接入的可运行代码,并深入对比其与Kafka实现分布式锁的异同点及优缺点,帮助开发…

Shell 三剑客之 awk 命令详解(理论+实战)

目录 一、前言 二、工作流程总览 三、最常用内置变量 四、命令格式 五、20 个高频实战案例 5.1 基础打印 awk {print "hello"} < /etc/passwd 所有行打印成hello awk {print} test6.txt 打印test6.txt文件 awk {print $1} test6.txt 默认以空格为分割&am…

一个真正跨平台可用的免费PDF解决方案

在整理资料时&#xff0c;常需将不同格式的文件统一转为PDF格式&#xff0c;确保排版不乱、便于长期保存和打印 它的功能全面&#xff0c;支持批量操作&#xff0c;使用非常方便&#xff1a;只需把PDF文件拖进界面&#xff0c;选择目标格式&#xff0c;无论PDF转换成Word、PDF…

强化微调:以Swift框架进行GRPO多模态模型强化微调为例

一、TL&#xff1b;DR 整体介绍&#xff1a;强化微调RFT的原因、步骤、作用以及常见的rft方式dmeo举例&#xff1a;以Swift给的Qwen2.5-Math-7B-Instruct为例介绍了整个RFT的流程和代码细节实际强化微调&#xff1a;以qwen/internVL为例完成一次指令微调并且使用强化学习进一步…

时序数据:使用关系数据库 vs 时序数据库存储的核心区别是什么?

一、时序数据使用关系数据库 vs 时序数据库存储的核心区别 时序数据&#xff08;Time Series Data&#xff09;是指随时间连续产生的数据&#xff08;如传感器读数、服务器指标、交易记录等&#xff09;&#xff0c;其核心特点是高频写入、时间有序、量大且查询模式集中于时间范…

ansible判断

ansible判断 一、判断运算符 “” “!” “>” “<” “>” “<” “and” “or” “not” is in 每次执行完一个任务&#xff0c;不管成功与失败&#xff0c;都会将执行的结果进行注册&#xff0c;可以使用这个注册的变量来判断 when&#…