概要
在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:本人才学尚浅,如有纰漏,还请不吝赐教!