Odoo | Webserivce | 5分钟学会【JSONRPC】接口开发

Odoo - JsonRPC

1. Odoo内方法结构(接收端)

# -*- coding: utf-8 -*-
import odoo
import logging
import traceback


from odoo import api, fields, models, tools, SUPERUSER_ID, _
from odoo.exceptions import MissingError, UserError, ValidationError, AccessError


class YourModelName(models.Model):
    _name = 'your.model.name'

    @api.model
    def test_jsonrpc(self, args):
        try:
            # TODO SOMETHINGS
            return_json = {
                'code': "SUCCESS",
                'state': 'success',
                'error_msg': '',
                'datas': [
                    {
                        "code": "A01",
                        "name": "名称01",
                        # ...
                    },
                    {
                        "code": "A02",
                        "name": "名称02",
                        # ...
                    }
                    # ...
                ]
            }
        except Exception as e:
            return_json = {
                'code': "ERROR_001",
                'state': 'error',
                'error_msg': 'Error: %s.' % str(traceback.format_exc()),
                'datas': []
            }
        return return_json

2. POST接口请求结构(发送端)

# -*- coding:utf-8 -*-
import json
import uuid
import pprint
import urllib.request

HOST = "xxx.xxx.xxx.xxx"
PORT = 8069
URL = "http://%s:%s/jsonrpc" % (HOST, PORT)
DB_NAME = "odoo12"
USERID = 2
USERNAME = "admin"
PASSWORD = "admin"
ModelName = "your.model.name"
FunctionName = "test_jsonrpc"

UUID = str(uuid.uuid4())
data = {
    "id": UUID,       # 随机码
    "jsonrpc": "2.0",       # 固定值
    "method": "call",       # 固定值
    "params": {
        "service": "object",# 固定值
        "method": "execute",# 固定值
        "args": [
            DB_NAME,        # 数据库名称
            USERID,         # 接口用户ID
            PASSWORD,       # 接口用户密码
            ModelName,      # 模型
            FunctionName,   # 方法
            []              # 参数结构体
        ]
    }
}
req = urllib.request.Request(url=URL, data=json.dumps(data).encode(), headers={"Content-type": "application/json"})
reply = json.loads(urllib.request.urlopen(req).read().decode('UTF-8'))
pprint.pprint(reply)


########################返回结果结构#######################
------------------------成功结果---------------------------
{
    'id': 'ef0d3de6-30b4-4104-9272-47d51d358b70',
    'jsonrpc': '2.0',
    'result': {
        'code': 'SUCCESS',
        'state': 'success',
        'error_msg': 'success',
        'datas': [
            {
                'code': '10001',
                'name': '名称01',
                'lines': [
					{
						'a':1,
						'b':2
					},
					{
						'a':3,
						'b':4
					}
					# ...
				]
            },
            {
                'code': '10002',
                'name': '名称02',
                'lines': []
            }
            # ...
        ],
    }
}
---------------------------------------------------------

------------------------失败结果---------------------------
{
    'id': '055f70e0-1d2a-4cf5-983a-68db9e40ee80',
    'jsonrpc': '2.0',
    'result': {
        'state': 'error',
        'code': 'ERROR_0001',
        'error_msg': '错误: 详细错误信息.',
        'datas': []
    }
}
---------------------------------------------------------
#########################################################

3. 实例测试

  1. Odoo内维护一个jsonrpc的方法:test_jsonrpc
    # -*- coding: utf-8 -*-
    import odoo
    import logging
    import traceback
    
    
    from odoo import api, fields, models, tools, SUPERUSER_ID, _
    from odoo.exceptions import MissingError, UserError, ValidationError, AccessError
    
    
    class IrActions(models.Model):
        _name = 'ir.actions.actions'
        _description = 'Actions'
        _table = 'ir_actions'
        _order = 'name'
    
        @api.model
        def test_jsonrpc(self, args):
            try:
                # TODO SOMETHINGS
                return_json = {
                    'code': "SUCCESS",
                    'state': 'success',
                    'error_msg': '',
                    'datas': [
                        {
                            "code": "A01",
                            "name": "名称01",
                            # ...
                        },
                        {
                            "code": "A02",
                            "name": "名称02",
                            # ...
                        }
                        # ...
                    ]
                }
            except Exception as e:
                return_json = {
                    'code': "ERROR",
                    'state': 'error',
                    'error_msg': 'Error: %s.' % str(traceback.format_exc()),
                    'datas': []
                }
            return return_json
    

  1. 在其他系统中进行调用测试
    # -*- coding:utf-8 -*-
    import json
    import uuid
    import pprint
    import urllib.request
    
    HOST = "localhost"
    PORT = 8069
    URL = "http://%s:%s/jsonrpc" % (HOST, PORT)
    DB_NAME = "odoo12_db"
    USERID = 2
    USERNAME = "admin"
    PASSWORD = "admin"
    ModelName = "ir.actions.actions"
    FunctionName = "test_jsonrpc"
    UUID = str(uuid.uuid4())
    data = {
        "id": UUID,       # 随机码
        "jsonrpc": "2.0",       # 固定值
        "method": "call",       # 固定值
        "params": {
            "service": "object",# 固定值
            "method": "execute",# 固定值
            "args": [
                DB_NAME,        # 数据库名称
                USERID,         # 接口用户ID
                PASSWORD,       # 接口用户密码
                ModelName,      # 模型
                FunctionName,   # 方法
                []              # 参数结构体
            ]
        }
    }
    
    req = urllib.request.Request(url=URL, data=json.dumps(data).encode(), headers={"Content-type": "application/json"})
    reply = json.loads(urllib.request.urlopen(req).read().decode('UTF-8'))
    pprint.pprint(reply)
    
    

  1. 结果示例
    3.1 若程序正常执行无错误,则返回信息结构如下:
    在这里插入图片描述


    3.2 如果try语句中执行异常,返回错误信息结构如下:在这里插入图片描述


    3.3 如果身份验证或者请求参数有误,返回错误信息结构如下:
    在这里插入图片描述


    3.4 注意如果host和port不对的话,抛出的是Request的请求异常:
    在这里插入图片描述

遗留问题

  1. USERNAME + PASSWORD 换取 USERID
    一般接口都是通过USERNAME和PASSWORD或者Token之类来进行认证的.
    Odoo的JSONRPC接口却需要给定USERID参数,那么这个是否可以通过USERNAME和PASSWORD来主动换取USERID?不可以 可以 去了解

4. Demo

从这里可以获取一个Odoo的Jsonrpc的Demo


🎉如果对你有所帮助,可以点赞、关注、收藏起来,不然下次就找不到了🎉


【点赞】⭐️⭐️⭐️⭐️⭐️
【关注】⭐️⭐️⭐️⭐️⭐️
【收藏】⭐️⭐️⭐️⭐️⭐️

Thanks for watching.
Kenny

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特本特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值