在架设完毕odoo 11的网站之后,第一次面临手机app该如何访问后台网站的问题,是不是模式类似asp.net mvc 那样的模式,或者还存在其他的访问方法,带着这个疑问与困惑,开始的我的研究学习之路。通过研究,初步得出一个结论,那就是实用odoo11作为后台的数据提供者,和以前的具体操作方式多一种不同的方式。

1.第一种方式,是需要在后台写controller的模式,这样自己配制路由,再去访问model类提供的方法,这种方式还没有去试验测试。

2.第二种方法,不需要自己再去写controller类,而是利用odoo框架自带的机制,前端需要做的是提供model类名method方法,以及相关参数,这种接口的方式最大化的利用了框架自身的机制,有点量身定做的感觉,同时还可以做到对外部访问者一定的保密。

下面开始具体的OdooJsonRpc类的整理。

定义类的基本成员,这个大部分参数是根据框架的情况设定的

    private jsonRpcID: number = ;
private headers: Headers;
private odoo_server: string;
private http_auth: string;
private list = "/web/database/list";
private get_list = "/web/database/get_list";
private jsonrpc = "/jsonrpc"; constructor(private http: Http, private utils: Utils) {
this.http = http;
}

设置相关成员参数的方法,比如网站地址,授权信息等

    public init(configs: any) {
this.odoo_server = configs.odoo_server;
this.http_auth = configs.http_auth || null;
} public setOdooServer(odoo_server: string) {
this.odoo_server = odoo_server;
} public setHttpAuth(http_auth: string) {
this.http_auth = http_auth;
}

接下来是设置请求后台参数时的格式,这里最大的好处是结合框架,动态的传递需要的参数,这里是整理成json的格式

   /**
* Builds a request for odoo server
* @param url Odoo Server URL
* @param params Object
*/
private buildRequest(url: String, params: any) {
this.jsonRpcID += ;
return JSON.stringify({
jsonrpc: "2.0",
method: "call",
id: this.jsonRpcID,
params: params,
});
}

接下来是相对高一级别的请求方法,这里整合url地址和参数为json样式,所有访问后台的方法都要调用这个方法,很关键的一个基本方法。

    /**
* Sends a JSON request to the odoo server
* @param url Url of odoo
* @param params Object
*/
public sendRequest(url: string, params: Object): Promise<any> {
let options = this.buildRequest(url, params);
this.headers = new Headers({
'Content-Type': 'application/json; charset=utf-8',
}); let result = this.http.post(this.odoo_server + url, options, { headers: this.headers })
.toPromise()
return result;
}

下面的一些方法是对上面请求的一个具体的应用,同时也是app在登录后台中必须的一些系统方法。

    /**
* Gets the server info
*/
public getServerInfo() {
return this.sendRequest("/web/webclient/version_info", {});
} /**
* Gets the session info
*/
public getSessionInfo() {
return this.sendRequest("/web/session/get_session_info", {});
} /**
* Gets the Odoo Server Version Number
*/
public getServerVersionNumber(): Promise<number> {
return this.getServerInfo().then((res: any): Promise<number> => {
return new Promise<number>((resolve) => {
resolve(JSON.parse(res._body)["result"]["server_version_info"][]);
});
});
} /**
* Get the database list
*/
public getDbList(): Promise<string> {
let dbParams = {
context: {}
}
return this.getServerVersionNumber().then((data: number) => {
if (data <= ) {
return this.sendRequest(this.get_list, dbParams);
} else if (data == ) {
return this.sendRequest(this.jsonrpc, dbParams);
} else {
return this.sendRequest(this.list, dbParams);
}
})
} /**
* Returns all modules that are installed in your database
*/
public modules(): Promise<string> {
let params = {
context: {}
}
return this.sendRequest("/web/session/modules", params)
} /**
* Login to the database
* @param db Database name of odoo
* @param login Username
* @param password password
*/
public login(db: string, login: string, password: string) {
let params = {
db: db,
login: login,
password: password,
base_location: this.odoo_server,
context: {}
};
return this.sendRequest("/web/session/authenticate", params)
} /**
* Check whether the session is live or not
*/
public check(): Promise<string> {
let params = {
context: this.getContext()
}
return this.sendRequest("/web/session/check", params)
} /**
* Destroy the session
*/
public destroy() {
let params = {
context: {}
}
return this.sendRequest("/web/session/destroy", params)
}

以上是手机app访问后台网站,登录过程的体现,按这些基本上是可以测试app能否调用后台odoo的接口了。

这一步我们需要写一个Page类,测试登录的过程。首先是定义一些参数,比如http,https协议的选择,还有我们前面OdooJsonRpc类的依赖注入

  private listForProtocol: Array<{ protocol: string}> = []
public perfectUrl: boolean = false
public odooUrl
public selectedProtocol
private dbList: Array<{ dbName: string }> = []
private selectedDatabase
private email
private password constructor(public navCtrl: NavController,
private alert: AlertController, public navParams: NavParams,
private odooRpc: OdooJsonRpc, private loadingCtrl: LoadingController,
private utils: Utils) { this.listForProtocol.push({ protocol: "http"})
this.listForProtocol.push({ protocol: "https"})
}

第二步,手机端检查url网站的正确性并从后台获取数据库的列表信息,这里开始正式进入于后台的交互 ,此步骤成功基本上意味着接口接近成功。注意我注释掉了红色的部分。如果访问成果,设置了参数perfectUrl为真,也即登录相关界面可以显示出来。

  public checkUrl() {
this.utils.presentLoading("Please Wait")
this.odooRpc.init({
odoo_server: this.selectedProtocol + "://" + this.odooUrl
//http_auth: 'username:password' // optional
}) this.odooRpc.getDbList().then((dbList: any) => {
this.perfectUrl = true
this.utils.dismissLoading()
this.fillData(dbList)
}).catch((err: any) => {
this.utils.presentAlert("Error", "You Entered a wrong Odoo URL", [{
text: "Ok"
}])
this.utils.dismissLoading()
});
} public fillData(res: any) {
let body = JSON.parse(res._body)
let json = body['result'];
this.dbList.length = ;
for (var key in json) {
this.dbList.push({ dbName: json[key] });
}
}

执行之前的界面如下

输入网站地址之后,正确执行后的界面,显示出了输入账号和密码数据库的选择

经过打包成apk的格式,在手机上测试成功通过,也就意味着ionic访问 odoo11网站接口初步成功。下一步就是研究如何访问网站具体业务的接口问题。在结束之前,放张ionic在浏览器测试不成功的截图,记得一定要打包再测试。

参考项目:https://github.com/mtfaroks/Odoo-JsonRpc-with-ionic3.x

ionic访问odoo 11接口的更多相关文章

  1. ionic 访问odoo11之具体业务类api接口

    在前面测试通过odoo登录的功能,这次的问题重点是如何访问后台具体的业务类的接口呢?这次就以我们在odoo中安装的lunch模块为例,目标是获取lunch.alert的数据,如下图 具体过程接上次文章 ...

  2. Odoo(OpenERP)开发实践:通过XML-RPC接口访问Odoo数据库

    Odoo(OpenERP)服务器支持通过XML-RPC接口访问.操作数据库,基于此可实现与其他系统的交互与集成. 本文是使用Java通过XMLRPC接口操作Odoo数据库的简单示例.本例引用的jar包 ...

  3. 使用.Net访问Office编程接口(PIA和IA的区别)

    在这篇文章里面,我将向大家介绍如何在.Net中访问Office所公开的编程接口.其实,不管是使用哪种具体的技术来针对Office进行开发(比如VSTO,或者用C#编写一个Office Add-in,或 ...

  4. express搭建后端请求路由,前端进行访问对应的接口 后端解决跨域

    代码在 ==>E:\nodes实战\myserve\testserve 1 express搭建后端请求路由,前端进行访问对应的接口 1) 创建项目目录 express 项目名 -e 然后按照提示 ...

  5. Winform混合式开发框架访问Web API接口的处理

    在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序.Web网站.移动端APP等多种接入方式,Web API的 ...

  6. Windows Server 2012 R2下通过80端口访问Odoo ERP

    背景 Odoo 9.0系统,安装于Windows Server 2012R2,同时与IIS并存.Odoo自带web服务器,使用端口8069.因客户需要用80端口访问,因此需要进一步设置,且8069端口 ...

  7. 基于Oracle OCI的数据访问C语言接口ORADBI .

    基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008   ORADBI是我在Oracle OCI(Oracle 调用接口)基础 ...

  8. (办公)访问其他系统接口httpClient,异步访问

    访问其他系统接口httpClient,但是都是同步的,同步意味当前线程是阻塞的,只有本次请求完成后才能进行下一次请求;异步意味着所有的请求可以同时塞入缓冲区,不阻塞当前的线程; httpClient请 ...

  9. 数据访问层的接口IBaseDAL

    using System; using System.Collections; using System.Data; using System.Data.Common; using System.Co ...

随机推荐

  1. Python自动化开发之python的常用模块

    python常用模块 模块的种类:模块分为三种,分别是自定义模块:内置标准模块(即标准库):开源模块(第三方). 以下主要研究标准模块即标准库:标准库直接导入即可,不需要安装. 时间模块:time , ...

  2. python自动化开发-6-面向对象编程

    面向对象编程 面向对象的特性 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.  继承:面向对象编程 (OOP) 语言的一个主要功能就是“ ...

  3. Android--字符串和Drawable之间互相转化

    //将字符串转化成Drawable public synchronized static Drawable StringToDrawable(String icon) { if (icon == nu ...

  4. (网页)Http状态码大全(200、404、500等)(转CSDN)

    当我们从客户端向服务器发送请求时 服务器向我们返回状态码 状态码就是告诉我们服务器响应的状态 通过它,我们就可以知道当前请求是成功了还是出现了什么问题 状态码是由3位数字和原因短语组成的(比如最常见的 ...

  5. JAVA学习笔记:注释、变量的声明和定义、

    本文内容: 注释 变量的声明和定义 成员变量和局部变量 首发时间:2018-03-16 15:59 注释: 单行注释:// 多行注释:/* - */ 变量: 变量是内存中的一个存储区域,变量的定义就是 ...

  6. flask day01

    目标:搭建好一个flask架构,并且可以运行起来,能够访问 ## 一丶配置环境 比较简单,只需要配一个flask pip3 install flask #也可以使用pip install flask ...

  7. python包中__init__.py的作用

    1.__init__.py定义包的属性和方法 一般为空文件,但是必须存在,没有__init__.py表明他所在的目录只是目录不是包 2.导入包的时候使用 例如有一个test目录,test下有xx1.p ...

  8. 【PAT】A1001A+B Format

    最新想法: 最多是七位数,而且只有一组输入,完全不用考虑算法复杂度. 直接判断是否为负,并输出符号 巧妙的地方:while循环的下一次再添加逗号.(防止出现,999,991的情况) 婼姐的方法真的很巧 ...

  9. MySQL表名区分大小写设置

    关闭MySQL服务 在服务运行目录找到my.ini或者my.cnf文件 打开文件,找到[mysqld]在下面增加一行 lower_case_table_names=0 (0:大小写敏感;1:大小写不敏 ...

  10. iframe无刷新跨域上传文件并获得返回值

    原文:http://geeksun.iteye.com/blog/1070607 需求:从S平台上传文件到R平台,上传成功后R平台返回给S平台一个值,S平台是在一个页面弹出的浮窗里上传文件,所以不能用 ...