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
相关产品推荐
相关产品推荐

