ODOO平台还提供了外部API,这些外部API即可以被页面调用,也可以被其他应用程序调用。在本章中,我们将会学会如何用Python使用这些外部API。要访问ODOO的API,可以使用两种协议,XML-RPC或JSON-RPC。只要遵守两个协议中任意一种客户端程序,都可以与ODOO服务器进行交互。ODOO官方文档有WebServices一章写如何调用的例子。(一)Python以XML-RPC方式和ODOO通讯
为了方便项目打包,我们在peijia目录新建test目录,然后新建xml_rpc_test.py文件。我们查找官方代码,修改为查找教师休假信息,代码如下:import functoolsimport xmlrpc.clientHOST = 'localhost'PORT = 8069DB = 'peijia'USER = 'pjdemo@163.com'PASS = '123456'ROOT = 'http://%s:%d/xmlrpc/' % (HOST, PORT)# 1. Loginuid = xmlrpc.client.ServerProxy(ROOT + 'common').login(DB, USER, PASS)print("Logged in as %s (uid:%d)" % (USER, uid))call = functools.partial( xmlrpc.client.ServerProxy(ROOT + 'object').execute, DB, uid, PASS)# 2. Read the sessionsdomain = [('active', '=', True,)]field_names = ['name', 'teacher_name', 'teacher_full_name', 'Holiday_begin_date', 'Holiday_end_date', 'note']holidays = call('nebula.teacher.holiday', 'search_read', domain, field_names)for holiday in holidays: print('教师假期:', holiday)
然后我们在左上菜单中Run中点击Run ‘json_rpc_test’,后可以在Run标签页看到输出结果。这里holidays的取值用的是偏函数方法,我们展开如下,这样看起来很清晰,但是比较繁琐。holidays = xmlrpc.client.ServerProxy( ROOT + 'object').execute(DB, uid, PASS, 'nebula.teacher.holiday', 'search_read', domain, field_names)
(二)Python以JSON-RPC方式和ODOO通讯
我们在test目录下新建json_rpc_test.py文件。我们查找官方代码,修改为查找教师休假信息,代码如下:import jsonimport randomimport urllib.requestHOST = 'localhost'PORT = 8069DB = 'peijia'USER = 'pjdemo@163.com'PASS = '123456'def json_rpc(url, method, params): data = { "jsonrpc": "2.0", "method": method, "params": params, "id": random.randint(0, 1000000000), } 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')) if reply.get("error"): raise Exception(reply["error"]) return reply["result"]def call(url, service, method, *args): return json_rpc(url, "call", {"service": service, "method": method, "args": args})# log in the given databaseurl = "http://%s:%s/jsonrpc" % (HOST, PORT)uid = call(url, "common", "login", DB, USER, PASS)# 查找教师休假信息domain = [('active', '=', True,)]field_names = ['name', 'teacher_name', 'teacher_full_name', 'Holiday_begin_date', 'Holiday_end_date', 'note']holidays = call(url, "object", "execute", DB, uid, PASS, 'nebula.teacher.holiday', 'search_read', domain, field_names)for holiday in holidays: print('教师假期:', holiday)
然后我们在左上菜单中Run中点击Run ‘json_rpc_test’。在右下角点击Run,切换到Run标签页,可以看到返回了符合条件的JSON记录。(三)Dart以XML-RPC方式和ODOO通讯
在下篇内容里,我们将用Flutter来和ODOO通讯,实现ODOO的移动化。本节内容,读者可以在安装和设置完Flutter后再回头观看本节内容。我们在新建一个Flutter项目,并运行成功后,按以下步骤来测试Dart连结ODOO。1、在pubspec.yaml文件中,添加xml_rpc库,添加完毕后,点击Packages get获取相关库到本地,代码如下。dependencies: flutter: sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 xml_rpc: ^0.2.4
import 'package:xml_rpc/client.dart' as xml_rpc;import 'dart:convert';//const HOST = '127.0.0.1';const HOST = '192.168.21.109';const PORT = 8069;const DB = 'peijia';const USER = 'pjdemo@163.com';const PASS = '123456';const root = 'http://$HOST:$PORT';const XML_ROOT_COMMON = 'http://$HOST:$PORT/xmlrpc/2/common/';const XML_ROOT_OBJECT = 'http://$HOST:$PORT/xmlrpc/2/object/';void main() async { var teacherName = ''; var uID = 0; //1.登录 try { var result = await xml_rpc.call( XML_ROOT_COMMON, 'login', [ DB, USER, PASS, ], ); uID = result; } catch (e) { print(e); } //2.通过手机号查找教练ID var domain = [ ['active', '=', 'True'], ['mobile', '=', '186186186'] ]; //通过手机号找到教练编号,再加查询条件 var fieldNames = [ 'name', 'full_name', ]; try { var result = await xml_rpc.call( XML_ROOT_OBJECT, 'execute', [ DB, uID, PASS, 'nebula.teacher', 'search_read', domain, fieldNames, ], ); List list = json.decode(json.encode(result)); teacherName = list[0]['name']; } catch (e) { print(e); } //3.查询假期情况 domain = [ ['active', '=', 'True'], ['teacher_name', '=', teacherName] ]; //通过手机号找到教练编号,再加查询条件 fieldNames = [ 'name', 'teacher_name', 'teacher_full_name', 'Holiday_begin_date', 'Holiday_end_date', 'note' ]; try { var result = await xml_rpc.call( XML_ROOT_OBJECT, 'execute', [ DB, uID, PASS, 'nebula.teacher.holiday', 'search_read', domain, fieldNames, ], ); print(result); } catch (e) { print(e); }}
注意HOST必须是ODOO服务器的真实IP地址,而不是127.0.0.1或者localhost之类的地址。整个流程:登录->通过手机号获取教练编号->通过教练编号获取教练假期信息,我们也可以采用这种方式获取学员编号和相关信息。
在实际应用中,我们可以通过极光手机验证等方式先验证手机号是不是合法的,这样就可以知道真正的手机号码了,也有很多短信验证平台供使用,他们都有相关接入例子供参考。
先启动虚拟机,启动成功后,再鼠标右键run‘main.dart’,即可在左下角Run标签显示查询结果。