Odoo REST 和 XML-RPC API 集成教程:连接任何系统
Odoo 通过外部 API 公开其整个数据模型,从而可以与几乎任何系统集成——电子商务平台、CRM 工具、商业智能软件、移动应用程序和自定义应用程序。本教程涵盖所有三种 API 协议(XML-RPC、JSON-RPC 和 REST)、身份验证方法、CRUD 操作以及实际集成模式以及代码示例和最佳实践。
要点
- Odoo 提供三种 API 协议:XML-RPC(最成熟)、JSON-RPC(浏览器友好)和 REST(Odoo 19,兼容 OpenAPI)
- 所有 API 都需要使用数据库名称、用户名和密码或 API 密钥进行身份验证
- CRUD 操作在所有协议中遵循一致的模式:搜索、读取、创建、写入、取消链接
- 域过滤器使用波兰表示法语法进行复杂查询
- 分页、字段选择和批量操作优化大型数据集的性能
API协议比较
| 特色 | XML-RPC | JSON-RPC | 休息(Odoo 19) |
|---|---|---|---|
| 成熟度 | 自 Odoo 8 起稳定 | 自 Odoo 10 起稳定 | Odoo 19 中的新功能 |
| 认证 | 用户名/密码 | 基于会话的 | API 密钥或 OAuth 2.0 |
| 文档 | 手册 | 手册 | 自动生成的 OpenAPI |
| 回复格式 | XML | JSON | JSON |
| 批量操作 | 是的 | 是的 | 是的 |
| 网络钩子 | 否(需要自定义模块) | 没有 | 是(可配置) |
| 语言支持 | 任何(XML-RPC 是通用的) | JavaScript 友好 | 任何(HTTP 标准) |
身份验证
XML-RPC 身份验证
XML-RPC 身份验证使用两步过程:进行身份验证以获取用户 ID (uid),然后使用该 uid 进行后续调用。
身份验证调用使用 authenticate 方法命中 /xmlrpc/2/common 端点,传递数据库名称、用户名、密码和一个空对象。响应是数字用户 ID。所有后续数据调用都使用 /xmlrpc/2/object 和 execute_kw 方法,传递数据库、uid、密码、模型名称、方法名称和参数。
JSON-RPC 身份验证
JSON-RPC 通过 /web/session/authenticate 端点使用基于会话的身份验证。请求正文是一个 JSON 对象,其中包含 jsonrpc: "2.0"、call 的方法以及包含 db、login 和 password 的参数。响应在 cookie 中包含一个会话 ID,用于验证后续请求。
REST API 身份验证 (Odoo 19)
REST API 支持 Odoo 后端生成的 API 密钥:
- 导航至 设置 > 用户 > API 密钥
- 生成指定权限的新密钥
- 将密钥包含在
Authorization: Bearer标头中
REST 端点对于集合遵循 /api/{model} 模式,对于单个记录遵循 /api/{model}/{id} 模式。
CRUD 操作
搜索并阅读
最常见的操作是搜索具有特定条件的记录并读取其字段值。
域过滤器 使用带有运算符的波兰表示法(前缀表示法):
| 操作员 | 描述 | 示例 |
|---|---|---|
| 代码0 | 等于 | 代码1 |
| 代码0 | 不等于 | 代码1 |
| 代码0 | 大于 | 代码1 |
| 代码0 | 小于 | 代码1 |
| 代码0 | 大于或等于 | 代码1 |
| 代码0 | 在列表中 | 代码1 |
| 代码0 | 模式匹配 | 代码1 |
| 代码0 | 不区分大小写的模式 | 代码1 |
组合条件:使用 & (AND)、| (OR) 和 ! (NOT) 作为前缀运算符:
- AND:
['&', ['state', '=', 'sale'], ['amount_total', '>', 1000]]匹配超过 1000 个销售订单 - OR:
['|', ['state', '=', 'sale'], ['state', '=', 'done']]匹配任一状态 - 复杂:
['&', ['state', '=', 'sale'], '|', ['partner_id', '=', 5], ['partner_id', '=', 10]]
字段选择:仅请求您需要的字段,以减少有效负载大小并提高性能。传递带有字段名称列表的 fields 参数。如果省略,则返回所有字段。
分页:使用 offset 和 limit 参数对结果进行分页。示例:offset: 20, limit: 20 返回记录 21-40。
创建记录
通过使用字段值字典调用 create 方法来创建记录。必须包含必填字段。响应返回新创建的记录的 ID(或用于批量创建的 ID 数组)。
示例:创建联系人至少需要 name 字段。可选字段包括 email、phone、company_id、street、city、state_id、country_id 和自定义字段。
对于相关记录(one2many 或 Many2many),请使用特殊命令元组:
| 命令 | 语法 | 描述 |
|---|---|---|
| 创建 | 代码0 | 创建新的相关记录 |
| 更新 | 代码0 | 更新现有相关记录 |
| 删除 | 代码0 | 删除相关记录 |
| 取消链接 | 代码0 | 删除链接(不要删除) |
| 链接 | 代码0 | 添加现有记录的链接 |
| 更换 | 代码0 | 用提供的 ID 替换所有链接 |
更新记录
通过使用记录 ID 和已更改字段的字典调用 write 方法来更新记录。仅包含需要更改的字段——省略的字段保留其当前值。
支持批量更新:传递 ID 列表,以便在一次调用中更新具有相同值的多条记录。
删除记录
通过使用记录 ID 调用 unlink 方法来删除记录。成功时该方法返回 True。
删除时要小心——许多 Odoo 记录都受到业务规则的保护。例如,尝试删除已过帐的发票将引发错误。请改用适当的业务方法(例如,删除前的 button_cancel)。
现实世界的集成模式
电子商务订单同步
将订单从外部电子商务平台同步到 Odoo:
- 轮询新订单:查询自上次同步时间戳以来的订单的电子商务 API
- 匹配客户:通过电子邮件搜索Odoo联系人;如果没有找到则创建
- 创建销售订单:使用客户、线路、运输和付款信息构建订单
- 确认订单:调用
action_confirm通过工作流程处理订单 - 更新电子商务:将 Odoo 订单参考发送回电子商务平台
库存同步
保持 Odoo 和外部渠道之间的库存水平同步:
- 读取库存水平:使用位置过滤器在
stock.quant上调用search_read - 推送更新:将数量变化发送到外部渠道
- 处理预订:保留库存的账户(致力于挂单)
- 计划同步:每 15-30 分钟运行一次以保持准确性
CRM 潜在客户导入
将销售线索从营销平台导入 Odoo CRM:
- 获取线索:从营销平台API中拉取新线索
- Deduplicate: Search Odoo for existing contacts by email or phone
- 创建潜在客户:在
crm.lead中创建记录并进行源跟踪 - 分配:使用Odoo的线索分配规则或根据自定义逻辑进行分配
财务数据导出
将财务数据导出到商业智能平台:
- 导出科目表:读取
account.account了解科目结构 - 导出日记帐分录:使用日期过滤器读取
account.move.line - 导出余额:使用
read_group按账户和期间汇总余额 - 时间表:每天在会计关闭窗口后运行
错误处理
常见 API 错误
| 错误 | 原因 | 分辨率 |
|---|---|---|
| 访问被拒绝 | 无效的凭据或权限 | 验证用户名、密码和访问权限 |
| 未找到记录 | 读/写/取消链接中的 ID 无效 | 首先通过搜索验证记录是否存在 |
| 验证错误 | 缺少必填字段或值无效 | 包含具有有效数据的所有必填字段 |
| 用户错误 | 违反商业规则 | 查看具体规则的错误信息 |
| 并发异常 | 记录已被其他用户修改 | 重新读取记录并重试 |
速率限制
默认情况下,Odoo 不强制实施 API 速率限制,但生产部署应在反向代理级别实施速率限制。对于 Odoo.sh,应用默认限制以防止滥用。设计具有合理轮询间隔和批量操作的集成。
重试策略
对瞬态错误实施指数退避:
- 1秒后第一次重试
- Second retry after 4 seconds
- 16秒后第三次重试
- 最大重试次数后记录并发出警报
性能优化
批量操作
优先选择批量操作而不是单个记录处理:
create接受用于批量创建的值字典列表write接受批量更新的 ID 列表- 带有分页的
search_read比单独的read调用更有效
字段选择
始终指定 fields 参数以避免加载不必要的数据。在具有 50 多个列的模型上加载所有字段会产生巨大的开销,特别是对于 sale.order 或 account.move.line 这样的模型。
缓存
在本地缓存缓慢变化的数据:
- 产品目录(每小时刷新)
- 客户列表(更改通知时刷新)
- 税率和财政状况(每日刷新)
ECOSIRE 集成服务
构建可靠的集成需要了解外部系统和 Odoo 的数据模型。 ECOSIRE 的 Odoo 集成服务 涵盖 API 设计、连接器开发、数据映射和持续监控。对于连接电子商务平台的组织,我们专门的 Shopify-Odoo 集成 和 市场连接器 可以处理最常见的场景。
相关阅读
我应该为新集成选择哪种 API 协议?
对于 Odoo 19 上的新项目,请使用 REST API。它遵循 HTTP 标准,具有自动生成的文档,并支持用于身份验证的 API 密钥。对于 Odoo 17 或 18,XML-RPC 是最可靠且文档齐全的选项。 JSON-RPC 最适合基于浏览器的集成或 JavaScript 应用程序。
Odoo 的外部 API 有速率限制吗?
Odoo 本身不强制执行速率限制。但是,Odoo.sh 部署具有基础设施级别的限制,自托管部署应在反向代理 (Nginx) 级别实施速率限制。设计集成以使用批处理操作和合理的轮询间隔,而不受限制。
我可以通过 API 触发工作流程(确认订单、发布发票)吗?
是的。将 execute_kw 方法与工作流方法名称结合使用。例如,在 sales.order 上调用 action_confirm 进行确认,或在 account.move 上调用 action_post 来过帐日记账分录。工作流方法强制执行与 UI 相同的业务规则。
作者
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
相关文章
AI 支持的客户细分:从 RFM 到预测聚类
了解 AI 如何将客户细分从静态 RFM 分析转变为动态预测聚类。使用 Python、Odoo 和真实 ROI 数据的实施指南。
用于供应链优化的人工智能:可见性、预测和自动化
利用人工智能改变供应链运营:需求感知、供应商风险评分、路线优化、仓库自动化和中断预测。 2026年指南。
API 集成模式:企业架构最佳实践
掌握企业系统的 API 集成模式。 REST、GraphQL、gRPC、事件驱动架构、saga 模式、API 网关和版本控制指南。