概要
在Odoo中,JSON-RPC(JSON Remote Procedure Call)是一种基于JSON格式的远程过程调用协议,用于客户端和服务器之间的通信。此文章将介绍 JSON-RPC中无会话(session_id)控制的api,也是外部api密钥的另一种表现方式。功能跟XML-RPC有异曲同工之妙,主要针对模型方法的外部调用(登录、增、删、改、查、自定义方法)。
主要使用场景
- 轻量级应用:适用于轻量级应用和脚本,不需要复杂的会话管理。
- 快速开发和测试:适用于开发和测试阶段,可以快速进行身份验证和方法调用。
- 简单集成:适用于需要简单快速集成 Odoo 功能的场景,不需要维护复杂的会话状态。
调用方式
tip:密钥生成可以查看文章odoo外部API解读,实现跨系统间的通讯!
登录
curl --request POST \--url http://127.0.0.1:8069/jsonrpc \--header 'content-type: application/json' \--data '{"jsonrpc": "2.0","method": "call","params": {"service": "common","method": "login","args": ["csdn_module_1",//数据库"admin",//账号"b9063d9993bbcc5cbddbb808dd4afb7044e74cd1"//密码/密钥]}
}
//注:登录后会返回uid,此uid在后续api中将替代账号使用,所以妥善保存。(此对接方式可以不用在conf文件指定数据库,因为此方式所有api都需带上基础登录参数)'
增
curl --request POST \--url http://127.0.0.1:8069/jsonrpc \--header 'content-type: application/json' \--data '{"jsonrpc": "2.0","method": "call","params": {"service": "object","method": "execute_kw","args": ["csdn_module_1",//数据库"2",//登录返回的uid"b9063d9993bbcc5cbddbb808dd4afb7044e74cd1",//密码或者密钥"res.partner",//模型名"create",//方法[[{ //对象里面就是创建数据的字段内容(这是第一条)"name": "李太华3","user_id": 2, //多对一字段"child_ids": [ //一对多字段[0,0,{"name": "李飞11"}],[0,0,{"name": "李飞22"}],[0,0,{"name": "李飞33"}]]},{ //这是第二条"name": "李太华4","user_id": 2,"child_ids": [[0,0,{"name": "李飞44"}],[0,0,{"name": "李飞55"}],[0,0,{"name": "李飞66"}]]}]],{"context": {"lang": "zh_CN" //建议传中文代码(不传则有时候会默认选择英文记录集)}}]},"id": 123456
}
//注:[0, 0, {"name": "李飞44"}]中参数含义
//[
// [0, 0, {'\''product_id'\'': 1, '\''quantity'\'': 10}], # 创建新记录
// [1, 42, {'\''quantity'\'': 20}], # 更新 ID 为 42 的记录
// [2, 43, False], # 删除 ID 为 43 的记录
// [3, 44, False], # 解除与 ID 为 44 的记录的关联
// [4, 45, False], # 将 ID 为 45 的记录添加到关联中
// [5, 0, 0], # 清空所有关联记录
// [6, 0, [46, 47]] # 用 ID 为 46 和 47 的记录替换所有现有记录
//]'
删
curl --request POST \--url http://127.0.0.1:8069/jsonrpc \--header 'content-type: application/json' \--data '{"jsonrpc": "2.0","method": "call","params": {"service": "object","method": "execute_kw","args": ["csdn_module_1", //数据库"2", //登录返回的uid"b9063d9993bbcc5cbddbb808dd4afb7044e74cd1", //密码或者密钥"res.partner", //模型名"unlink", //方法[[ //数组删除多条72,47 //需要删除的记录id(多个则逗号隔开)]],{"context": {"lang": "zh_CN" //建议传中文代码(不传则有时候会默认选择英文记录集)}}]},"id": 123456
}'
改
curl --request POST \--url http://127.0.0.1:8069/jsonrpc \--header 'content-type: application/json' \--data '{"jsonrpc": "2.0","method": "call","params": {"service": "object","method": "execute_kw","args": ["csdn_module_1", //数据库"2", //登录返回的uid"b9063d9993bbcc5cbddbb808dd4afb7044e74cd1", //密码或者密钥"res.partner", //模型名"write", //方法[[58], //需要修改的记录主键id{ //需要修改的字段值(也可参考创建逻辑)"name": "李太华two","user_id": 2,"child_ids": [[0,0,{"name": "李飞77"}] //可修改可创建,子数据创建也属于主表修改逻辑。(具体请看以下注意规则)]}],{"context": {"lang": "zh_CN" //建议传中文代码(不传则有时候会默认选择英文记录集)}}]},"id": 123456
}
//注:[0, 0, {"name": "李飞77"}]中参数含义
//[
// [0, 0, {'\''product_id'\'': 1, '\''quantity'\'': 10}], # 创建新记录
// [1, 42, {'\''quantity'\'': 20}], # 更新 ID 为 42 的记录
// [2, 43, False], # 删除 ID 为 43 的记录
// [3, 44, False], # 解除与 ID 为 44 的记录的关联
// [4, 45, False], # 将 ID 为 45 的记录添加到关联中
// [5, 0, 0], # 清空所有关联记录
// [6, 0, [46, 47]] # 用 ID 为 46 和 47 的记录替换所有现有记录
//]'
查
curl --request POST \--url http://127.0.0.1:8069/jsonrpc \--header 'content-type: application/json' \--data '{"jsonrpc": "2.0","method": "call","params": {"service": "object","method": "execute_kw","args": ["csdn_module_1", //数据库"2", //登录返回的uid"b9063d9993bbcc5cbddbb808dd4afb7044e74cd1", //密码或者密钥"res.partner", //模型名"search_read", //方法[[ //过滤条件(跟后端domain一样写法,只是一个元组一个数组的区别)["id",">",0],["phone","!=",false]]],{"offset": 0, //开始索引值"limit": 5, //查询条数"order": "phone ASC", //排序(ESC/DESC)"fields": ["id","name","phone"], //需要返回的字段,留空或不传则返回全部字段"context": {"lang": "zh_CN" //建议传中文代码(不传则有时候会默认选择英文记录集)}}]},"id": 123456
}'
自定义方法
curl --request POST \--url http://127.0.0.1:8069/jsonrpc \--header 'content-type: application/json' \--data '{"jsonrpc": "2.0","method": "call","params": {"service": "object","method": "execute_kw","args": ["csdn_module_1", //数据库"2", //登录返回的uid"b9063d9993bbcc5cbddbb808dd4afb7044e74cd1", //密码或者密钥"all.field.about", //模型名"get_demo_data", //方法[[]],{"context": {"lang": "zh_CN" //建议传中文代码(不传则有时候会默认选择英文记录集)}}]},"id": 123456
}
// 此方法在odoo中是这样的:
// def get_demo_data(self):
// return {
// '\''char_field'\'': '\''char_field'\'',
// '\''text_field'\'': '\''text_field'\'',
// '\''integer_field'\'': 1,
// }'
小结
多写多敲多思考,毕竟,知己知彼才能看懂源码。
Tip:本人才学尚浅,如有纰漏,还请不吝赐教!