You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:45:05