Web钩子¶
警告
强烈建议 在决定使用 Webhook 并在整个实施过程中咨询开发人员、解决方案架构师或其他技术角色。如果配置不当,Webhook 可能会破坏 Odoo 数据库,并且恢复可能需要时间。
可以在 Odoo Studio 中创建的 Webhook 允许您在另一个外部系统中发生特定事件时,在 Odoo 数据库中自动化执行操作。
实际上,其工作方式如下:当外部系统中发生事件时,数据文件(”payload”)通过 POST API 请求发送到 Odoo webhook 的 URL,并在您的 Odoo 数据库中执行预定义的操作。
与按预定义间隔运行的计划操作或需要显式调用的手动 API 请求不同,webhook 支持实时、事件驱动的通信和自动化。例如,您可以设置一个 webhook,以便在外部销售点系统中确认销售订单时自动更新 Odoo 库存数据。
在 Odoo 中设置 webhook 在连接两个 Odoo 数据库时无需编码,但 测试 webhook 需要外部工具。 自定义目标记录或操作 可能需要编程技能。
注解
本文介绍创建从外部源 接收 数据的 webhook。但是,也可以创建一个自动化操作,在您的 Odoo 数据库发生更改时 将数据发送到外部 webhook 。
在 Odoo 中创建 webhook¶
重要
在实时数据库中实施 webhook 之前,使用 复制数据库 配置和测试它,以确保 webhook 按预期执行。
小技巧
在创建 webhook 之前 激活开发者模式 可以在选择自动化规则目标的 模型 时提供更大的灵活性。它还允许您查找模型和字段的技术名称,这些名称可能是配置 payload 所必需的。
要查找模型的技术名称,在激活开发者模式后,将鼠标悬停在模型名称上,然后单击 (内部链接) 。技术名称可以在 模型 字段中找到。例如,销售订单 webhook 使用 销售订单 模型,但 payload 中使用的是技术名称 sale.order 。
要在 Studio 中创建 webhook,请按以下步骤操作:
打开 Studio 并单击 Webhooks ,然后 新建 。
为 webhook 指定一个清晰、有意义的名称,以标识其用途。
如果需要,并且在激活开发者模式的情况下,从下拉菜单中选择适当的 模型 。如果未激活开发者模式,自动化规则默认以当前模型为目标。
webhook 的 URL 是自动生成的,但可以通过单击 轮换密钥 来更改(如果需要)。这是在将 webhook 实施到将向数据库发送更新的外部系统时应使用的 URL。
警告
URL 是 机密 的,应谨慎处理。在线共享或不加注意地共享可能会提供对 Odoo 数据库的意外访问。如果在初始实施后更新了 URL,请确保在外部系统中更新它。
如果需要,启用 记录调用 以跟踪对 webhook URL 发出的 API 请求的历史记录,例如用于故障排除目的。
如果发送 webhook 的系统不是 Odoo,请调整 目标记录 代码以查找向 webhook URL 发出 API 请求时 payload 中包含的 JSON 记录。如果发送 webhook 的系统是 Odoo 数据库,请确保
id和model出现在 payload 中。如果 webhook 用于在 Odoo 数据库中创建记录,请使用
model.browse(i)或model.search(i)而不是默认的 目标记录 格式。单击 待执行操作 标签页中的 添加操作 以定义要执行的 操作 。
在外部系统中实施 webhook 之前,请 测试 它以确保其按预期工作。
小技巧
也可以通过 Studio 中的 自动化 菜单选择触发器 On webhook 来创建 webhook。
要访问 API 请求的历史记录(如果已启用 记录调用 ),请单击 自动化规则 表单顶部的 日志 智能按钮。
如果 webhook 的目的不是更新现有记录,例如创建新记录,则必须选择 执行代码 操作。
测试 webhook¶
测试 webhook 需要测试 payload 和外部工具或系统(如 Postman )来通过 POST API 请求发送 payload。本节介绍在 Postman 中测试 webhook 的步骤。
小技巧
请参阅 webhook 用例部分 以获取使用测试 payload 测试 webhook 的分步说明。
要获取有关使用 Postman 测试 webhook 的具体帮助,请联系他们的支持团队。
在 Postman 中,创建一个新的 HTTP 请求并将其方法设置为 POST 。
使用 (链接) 图标从您的 Odoo 数据库复制 webhook 的 URL,并将其粘贴到 Postman 的 URL 字段中。
单击 Body 选项卡并选择 raw 。
将文件类型设置为 JSON ,然后从测试有效负载复制代码并将其粘贴到代码编辑器中。
单击 Send 。
在 Postman 屏幕底部的 Response 查看器中,包括 HTTP 响应代码在内的详细信息指示 webhook 是否正常运行。
200 OK或status: ok消息表明 webhook 在 Odoo 端正常运行。从这里开始,可以在另一个系统中实施,以自动将 API 请求发送到 Odoo webhook 的 URL。如果返回任何其他响应,与之关联的编号有助于识别问题。例如,
500 Internal Server Error消息意味着 Odoo 无法正确解释调用。在这种情况下,请确保在 webhook 的配置和发送测试调用的系统中正确映射了 JSON 文件中的字段。
小技巧
在 Odoo 的 webhook 配置中打开调用日志记录可以在 webhook 未按预期运行时提供错误日志。
在外部系统中实施 webhook¶
当在 Odoo 中成功创建并测试了 webhook 后,在向 Odoo 数据库发送数据的系统中实施它,确保将 POST API 请求发送到 webhook 的 URL。
Webhook 使用案例¶
以下是两个关于如何在 Odoo 中使用 webhook 的示例。每个示例都提供了一个测试有效负载,可以在测试 webhook 的部分找到。使用 Postman 发送测试有效负载。
更新销售订单的货币¶
当外部系统向 webhook 的 URL 发送包含该销售订单编号(由有效负载的 id 记录标识)的 POST API 请求时,此 webhook 会将 销售 应用中的销售订单更新为 USD 。
这对于在美国境外设有母公司的子公司或在合并期间将数据整合到一个 Odoo 数据库时可能很有用。
创建 webhook¶
要创建此 webhook,请按以下步骤操作:
打开 销售 应用,然后 打开 Studio 并单击 Webhooks 。默认情况下选择 销售订单 模型。
单击 New 。默认情况下, Trigger 设置为 On webhook 。
将 Target Record 设置为
model.env[payload.get('_model')].browse(int(payload.get('_id'))),其中:payload.get('_model')检索有效负载中与model键关联的值,即sale.order,这是 销售订单 模型的技术名称。payload.get('_id')检索有效负载中与id键关联的值,即您 Odoo 数据库中目标销售订单的编号,其中S和前导零已被移除。int将检索到的 id 转换为整数(即整数),因为browse()方法只能与整数一起使用。
单击 Add an action 。
在 Type 部分中,单击 Update Record 。
在 Action details 部分中,选择 Update ,选择字段 Currency ,然后选择 USD 。
单击 Save & Close 。
测试 Webhook¶
要测试此 webhook,请按以下步骤操作:
打开 Postman ,创建一个新的 HTTP 请求并将其方法设置为 POST 。
使用 (link) 图标复制 Odoo webhook 的 URL,并将其粘贴到 Postman 的 URL 字段中。
单击 Body 选项卡并选择 raw 。
将文件类型设置为 JSON ,然后复制此代码(即有效负载)并将其粘贴到代码编辑器中:
{ "_model": "sale.order", "_id": "SALES ORDER NUMBER" }
在您的 Odoo 数据库中,选择一个销售订单来测试 webhook。在粘贴的代码中,将
SALES ORDER NUMBER替换为销售订单的编号,不带S或数字前的任何零。例如,编号为S00007的销售订单在 Postman 中应输入为7。单击 Send 。
参考 Postman 中的 Response viewer 以确定 webhook 是否正常运行。如果返回了
200 OK或status: ok以外的消息,与该消息关联的编号有助于识别问题。
创建新联系人¶
当外部系统向 webhook 的 URL 发送包含联系人信息的 POST API 请求时,此 webhook 使用自定义代码在 Odoo 数据库中创建新联系人。这对于自动创建新供应商或客户可能很有帮助。
创建 webhook¶
要创建此 webhook,请按以下步骤操作:
打开 联系人 应用,然后 打开 Studio 并单击 Webhooks 。默认情况下选择 联系人 模型。
单击 New 。默认情况下, Trigger 设置为 On webhook 。
将 Target Record 设置为
model.browse([2])。这基本上是一个占位符,因为自动化操作中的代码会告诉 webhook 需要从有效负载中检索什么以及在哪个模型中创建记录。单击 Add an action 。
在 Type 部分中,单击 Execute Code 。
复制此代码并将其粘贴到 Action details 部分的 Code 选项卡中的代码编辑器中:
# variables to retrieve and hold data from the payload contact_name = payload.get('name') contact_email = payload.get('email') contact_phone = payload.get('phone') # a Python function to turn the variables into a contact in Odoo if contact_name and contact_email: new_partner = env['res.partner'].create({ 'name': contact_name, 'email': contact_email, 'phone': contact_phone, 'company_type':'person', 'customer_rank': 1, }) # an error message for missing required data in the payload else: raise ValueError("Missing required fields: 'name' and 'email'")
单击 Save & Close 。
测试 Webhook¶
要测试此 webhook,请按以下步骤操作:
在 Postman 中,创建一个新的 HTTP 请求并将其方法设置为 POST 。
使用 (link) 图标复制 Odoo webhook 的 URL,并将其粘贴到 Postman 的 URL 字段中。
单击 Body 选项卡并选择 raw 。
将文件类型设置为 JSON ,然后复制此代码(即有效负载)并将其粘贴到代码编辑器中:
{ "name": "CONTACT NAME", "email": "CONTACTEMAIL@EMAIL.COM", "phone": "CONTACT PHONE NUMBER" }
在粘贴的代码中,将
CONTACT NAME、CONTACTEMAIL@EMAIL.COM和CONTACT PHONE NUMBER替换为新联系人的信息。单击 Send 。
参考 Postman 中的 Response viewer 以确定 webhook 是否正常运行。如果返回了
200 OK或status: ok以外的消息,与该消息关联的编号有助于识别问题。