Ionic v4 Angular对接Odoo v10报请求类型不匹配错误求助
解决Odoo v10与Ionic v4 Advanced HTTP插件交互的请求类型错误问题
我来帮你分析这个错误并给出可行的解决方案。你遇到的Function declared as capable of handling request of type 'json' but called with a request of type 'http'错误,本质是Odoo的JSON-RPC接口没有识别到你发送的是符合规范的JSON请求,问题主要集中在CSRF token的处理和请求格式配置上。
错误原因拆解
Odoo的/web/database/list是标准的JSON-RPC接口,它对请求的格式和验证有严格要求:
- 你硬编码的
CSRF_TOKEN完全无效——Odoo的CSRF token是动态生成的,必须从当前会话中获取; - 请求体中多余的
csrf_token字段可能干扰Odoo对请求类型的识别; - 可能存在请求体未被正确序列化为JSON格式的情况。
分步解决方案
1. 先动态获取有效的CSRF Token
Odoo的CSRF Token可以通过请求/web/session/get_session_info接口获取,这是发起任何POST请求前的必要步骤:
// 获取会话信息与有效CSRF Token this.http.get('http://10.42.0.63:8877/web/session/get_session_info', {}, {}) .then(sessionRes => { const validCsrfToken = sessionRes.data.csrf_token; // 拿到有效Token后发起数据库列表请求 this.fetchDatabaseList(validCsrfToken); }) .catch(err => console.error("获取会话信息失败:", err));
2. 修正数据库列表请求的格式
调整请求体和请求头,移除多余字段,严格遵循JSON-RPC 2.0规范:
fetchDatabaseList(csrfToken: string) { // 符合JSON-RPC规范的请求体(无多余字段) const rpcPayload = { jsonrpc: "2.0", method: "call", id: 1, params: {} // /web/database/list不需要额外参数 }; // 发起POST请求 this.http.post( "http://10.42.0.63:8877/web/database/list", // 若Advanced HTTP插件未自动序列化,手动转为JSON字符串 JSON.stringify(rpcPayload), { "Content-Type": "application/json; charset=utf-8", "x-csrf-token": csrfToken // 将有效Token放在请求头中 } ) .then((res: any) => { console.log("数据库列表响应:", res.data); }) .catch((err: any) => { console.error("请求错误详情:", err); }); }
关键注意事项
- 绝对不能硬编码CSRF Token:Odoo每次会话都会生成新的Token,硬编码会直接导致验证失败,进而触发请求类型识别错误;
- 精简请求体:
/web/database/list不需要在请求体中传递csrf_token,仅需在请求头中设置x-csrf-token即可; - 确保请求体是JSON字符串:如果你的Advanced HTTP插件默认将请求体转为
form-data格式,一定要手动用JSON.stringify()处理Payload,并明确设置Content-Type为application/json。
内容的提问来源于stack exchange,提问作者Mustafa Lokhandwala
相关产品推荐
相关产品推荐

