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

news2024/11/18 3:27:41

文章目录

  • Odoo - JsonRPC
    • 1. Odoo内方法结构(接收端)
    • 2. POST接口请求结构(发送端)
    • 3. 实例测试

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的请求异常:
    在这里插入图片描述



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


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

Thanks for watching.
Kenny

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手带你做一套毕业设计-征程开启

本文是《手把手带你做一套毕业设计》专栏的开篇,文本将会包含我们创作这个专栏的初衷,专栏的主体内容,以及我们专栏的后续规划。关于这套毕业设计的作者呢前端部分由狗哥负责,服务端部分则由天哥操刀。我们力求毕业生或者新手通过…

Anaconda3 +pycharm详细安装教程(2023年)

前言最近配置了一台新电脑,准备安装Anaconda,原来是直接安装的python安装包以及pycharm,需要使用什么包就安装什么包,由于网络原因,经常安装失败,所以选择包含众多科学数据包的Anaconda。说到这里&#xff…

@font-face用法超详细讲解

文章目录font-face是什么font-face基本语法urlTTFOTFEOTWOFFSVGformatfont-face用法示例font字体下载ttf-to-eot 字体转换器https://blog.csdn.net/qq_37417446/article/details/106728725 https://developer.mozilla.org/zh-CN/docs/Web/CSS/font-face font-face是什么 font-…

网络性能总不好?专家帮你来“看看”— CANN 6.0 黑科技 | 网络调优专家AOE,性能效率双提升

随着深度学习模型复杂度和数据集规模的增大,计算效率的提升成为不可忽视的问题。然而,算法网络的多样性、输入数据的不确定性以及硬件之间的差异性,使得网络调优耗费巨大成本,即使是经验丰富的专家,也需要耗费数天的时…

C#窗口介绍

窗口就是打开程序我们所面对的一个面板,里面可以添加各种控件,如下图所示,我们可以在属性栏设置其标题名称、图标、大小等。图1 窗口图 图2 设置面板 图3 设置双击标题框,会生成Load函数,也可以到事件里面去找Load函数…

Linux(Centos)安装RabbitMQ+延时插件+开机自启动

安装目录1:前言1.1 系统环境1.2:安装版本1.3 简介2:安装2.1:安装前准备:2.2:安装Erlang2.3:安装RabbitMQ2.3:延迟依赖插件安装1:前言 1.1 系统环境 操作系统版本&#…

python-批量下载某短视频平台音视频标题、评论、点赞数

python-批量下载某短视频平台音视频标题、评论数、点赞数前言一、获取单个视频信息1、获取视频 url2、发送请求3、数据解析二、批量获取数据1、批量导入地址2、批量导出excel文件3、批量存入mysql数据库三、完整代码前言 1、Cookie中文名称为小型文本文件,指某些网…

【linux】软硬链接

在linux中在磁盘中定位文件并不是根据文件名而是根据文件的inode,一个文件对应一个inode但是一个inode可以对应多个文件。硬链接硬链接是通过索引节点进行的链接。在Linux中,多个文件指向同一个索引节点是允许的,像这样的链接就是硬链接。硬链…

【论文速递】EMNLP 2020 - 将事件抽取作为机器阅读理解任务

【论文速递】EMNLP 2020 - 将事件抽取作为机器阅读理解任务 【论文原文】:Event Extraction as Machine Reading Comprehension 【作者信息】:Jian Liu and Yubo Chen and Kang Liu and Wei Bi and Xiaojiang Liu 论文:https://aclantholo…

计算机视觉知识体系

文章目录一、计算机视觉1.1 系统工程方案层1.2 领域任务模块层1.3 基础算法层1.4 深入领域体会一、计算机视觉 三个层次:系统工程方案层、领域任务模块层、基础算法层。 三方面知识点:图像处理、机器学习、基础数学与模型。 视频的三个场景&#xff1…

k8s node之间是如何通信的?

承接上文同一个node中pod之间如何通信?单一Pod上的容器是怎么共享网络命名空间的?每个node上的pod ip和cni0网桥ip和flannel ip都是在同一个网段10.1.71.x上。cni0网桥会把报文发送flannel这个网络设备上,flannel其实是node上的一个后台进程&…

【设计模式】2.抽象工厂模式

抽象工厂模式 前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、传智播客只培养计算机软件专业的学生等。 这些工厂只生产同种类产品,同种类产品称为同等级产品,也就是说:工厂方法模式…

【python】条件语句,简单理解

嗨害大家好鸭!我是小熊猫~ Python 条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: 更多python资料获取:点击此处跳转文末名片获取 Python程序语言…

【笔记】两台1200PLC进行S7 通信(1)

使用两台1200系列PLC进行S7通信(入门) 文章目录 目录 文章目录 前言 一、通信 1.概念 2.PLC通信 1.串口 2.网口 …

2023年5月软考软件设计师备考经验

一、考试目标: 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求,按照系统总体设计规格说明书进行软件设计,编写程序设计规格说明书等相应的文档,组织和指导程序员编写、调试程序,并对软件进行优化和集成…

cityengine自定义纹理库资源

背景 cityengine虽然可以将shp生成带纹理的三维模型,但是纹理不一定满足我们的要求,这时候我们就想用我们自己制作的纹理 粗略了解规则文件 了解Building_From_Footprint.cga这个规则文件,具体文件位置默认在 “C:\Users[电脑用户名:如Administrator]\Documents\CityEng…

小米无线AR眼镜探索版细节汇总

在MWC 2023期间,小米正式发布了一款无线AR眼镜,虽然还没看过实机,但XDA提前上手体验,我们从中进行总结。首先我要说的是,小米这款眼镜和高通无线AR眼镜参考设计高度重叠,产品卖点几乎一致,只是增…

OSWatcher.sh脚本说明

OSWatcher.sh脚本位于oswbb目录下(Oracle 19c数据库中脚本的路径是: /u01/app/oracle/product/19.0.0/dbhome_1/suptools/tfa/release/tfa_home/ext/oswbb/),由脚本startOSWbb.sh和stopOSWbb.sh来调用启动和停止它。 1. startOSW…

[Android Studio] Android Studio生成数字证书,为应用签名

🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目…

python+ADCIRC潮汐、风驱动循环、风暴潮等海洋水动力模拟

目录 专题一 ADCIRC背景与原理 专题二 ADCIRC的编译安装 专题三 ADCIRC模式前处理 专题四 ADCIRC案例分析 专题五 Python基础与科学计算 专题六 ADCIRC模式后处理 学习包含ADCIRC模式的基础到高阶的内容,针对风暴潮的模拟和预报,既有基础理论讲解&…