如何在Odoo中处理任意传入的application/json类型HTTP请求
Odoo接收非JSON-RPC标准第三方JSON请求的实现方案
实现逻辑
Odoo默认会在请求分发阶段对Content-Type: application/json的请求自动尝试解析请求体,空请求体的GET请求会直接抛出异常拦截,且只有非application/json类型的http路由允许返回自定义JSON格式。我们可以通过重写ir.http的分发逻辑,仅对指定路由放行校验,无需全局修改核心代码。
具体实现步骤
1. 继承ir.http重写分发逻辑
from odoo import models from odoo.http import request class IrHttp(models.AbstractModel): _inherit = 'ir.http' @classmethod def _dispatch(cls): req = request.httprequest # 匹配你需要放行的路由,可根据需求修改为前缀匹配或者路径列表匹配 if req.path == '/api/external/callback': # 处理无请求体的application/json类型GET请求 if req.method == 'GET' and req.mimetype == 'application/json' and not req.data: # 手动赋值空参数,跳过Odoo的自动解析校验 request.params = {} return super()._dispatch()
2. 编写自定义路由控制器
from odoo import http from odoo.http import Response import json class ExternalCallbackController(http.Controller): @http.route( '/api/external/callback', type='http', auth='none', methods=['GET'], csrf=False ) def handle_external_callback(self, **kwargs): # 此处可添加自定义业务逻辑、签名校验等 # 直接返回自定义JSON响应,不受请求mimetype限制 return Response( json.dumps({"code": 200, "status": "success", "data": {}}), content_type='application/json', status=200 )
方案优势
- 无需对
JsonRequest类做全局猴子补丁,不会影响Odoo原生JSON-RPC接口的正常运行 - 仅对指定的第三方对接路由生效,侵入性极低,Odoo版本升级时兼容性好
- 可灵活扩展匹配规则,支持多路由、路由前缀批量放行
注意:如果接口需要鉴权,请在控制器方法中自行添加签名校验、IP白名单校验等逻辑,避免未授权访问风险。
内容的提问来源于stack exchange,提问作者Aaron Beaudoin
相关产品推荐
相关产品推荐

