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

Nginx未向Odoo的jsonrpc接口传递json MIME,远程RPC登录报400错

解决Odoo JSON-RPC远程登录400错误及Nginx MIME类型问题

咱们先从你提到的Nginx未传递JSON MIME类型问题入手,这大概率是远程调用失败的核心原因,再结合请求方式的优化,应该能搞定问题。

1. 修复Nginx的JSON MIME类型与反向代理配置

Nginx如果没正确识别或传递application/json类型的请求头,Odoo的JSON-RPC接口会直接无法解析请求体,返回400错误。你需要调整Nginx配置,确保以下几点:

  • 加载正确的MIME类型映射,或直接指定JSON类型
  • 在反向代理规则里明确传递Content-Type头

修改你的Nginx配置文件(通常是/etc/nginx/nginx.conf或/etc/nginx/sites-available/your_odoo_config):

http {
    # 先加载系统默认的MIME类型文件(一般包含application/json的映射)
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name your_odoo_domain.com;

        location /jsonrpc {
            # 指向Odoo本地服务的地址和端口
            proxy_pass http://127.0.0.1:8069;
            
            # 必须传递的代理头,确保Odoo能正确识别请求来源
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 关键:强制传递Content-Type为application/json
            proxy_set_header Content-Type application/json;
            
            # 允许请求体大小(登录请求很小,这个配置足够用)
            client_max_body_size 10m;
        }
    }
}

修改完成后,验证配置语法并重启Nginx:

nginx -t
systemctl reload nginx

2. 调整Python脚本的请求方式

虽然Odoo本地允许用GET请求调用JSON-RPC,但通过Nginx反向代理时,GET请求的请求体可能被中间件忽略,导致Odoo拿不到登录参数。建议改用JSON-RPC规范推荐的POST请求,兼容性更好:

修改你的Python代码:

import requests

# 替换成你的实际参数
conversation_id = 1
database = "your_database_name"
username = "your_username"
password = "your_password"
url = "http://your_remote_domain/jsonrpc"

login_parms = {
    "id": conversation_id,
    "jsonrpc": "2.0",
    "method": "call",
    "params": {
        "args": [database, username, password],
        "method": "login",
        "service": "common"
    }
}

# 改用POST请求,更符合规范且代理兼容性更好
response = requests.post(
    url,
    json=login_parms,
    headers={'Content-Type': 'application/json'}
)

# 打印结果方便排查问题
print(f"状态码: {response.status_code}")
print(f"响应内容: {response.json()}")

3. 进一步排查的小技巧

如果调整后还是出现400错误,可以通过以下方式定位问题:

  • 查看Odoo的日志文件(通常在/var/log/odoo/odoo.log),里面会有详细的错误信息,比如“Invalid JSON payload”或“Function not found”,能帮你精准定位问题
  • 用curl直接测试远程接口,排除Python脚本的问题:
curl -X POST -H "Content-Type: application/json" -d '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "call",
    "params": {
        "args": ["your_db", "your_user", "your_pass"],
        "method": "login",
        "service": "common"
    }
}' http://your_remote_domain/jsonrpc

内容的提问来源于stack exchange,提问作者Pengo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:55:57