基于Moodle Web Service的应用开发研究
2019-09-13施永春
施永春
(福建艺术职业学院,福建 福州 350100)
一、Moodle简介
Moodle是Modular Object Oriented Dynamic Learning Environment(面向对象的模块化动态学习环境)的首字母缩写。Moodle系统由澳大利亚Martin.Dougiamas博士和他带领的志愿者团队开发的一款开源的教学平台软件,主要由网站管理系统、课程管理系统和学习管理系统组成[1]。
Moodle系统受到教育人士的广泛欢迎,借助Moodle系统学校可以开展以学生为主的翻转课堂教学改革,改变传统的教学模式,激发学生的学习积极性,适应信息科技时代的教学需求。虽然Moodle系统是采用PHP编写开发的,但Moodle系统对外提供Web 服务,这让用户能够在非PHP环境下更灵活的进行二次开发,更易于系统功能扩展,更易于与其它教学系统结合。
二、Web Service
Web Service是一类发布在网络服务器上的软件组件,通常不是一个完整的程序,而是一些功能性组件或解决方案,软件开发者可以通过网络跨语言跨平台调用Web Service,从而实现程序之间的访问。尽管对Web Service的定义没有统一的标准,但是它所采用的规范得到广泛认可,这种服务采用的技术主要有XML、UDDI、WSDL、SOAP等技术。
XML是一种可扩展的标记语言,具有数据的自我描述性、描述与数据分离以及平台无关性等特点[2]。UDDI提供Web服务注册表,就是收集全球发布的Web服务,记录他们的服务地址,服务的类别,服务的功能等信息,为需要使用Web服务功能进行二次开发的公司或个人提供查询服务。WSDL是一种Web服务描述语言,它是基于XML语言对Web服务进行描述标准化描述。SOAP是简单对象访问协议,是客户端应用程序与Web服务服务器端之间发送消息的标准格式,它比HTTP协议更节省带宽,且性能更优,也是基于XML语言。Web服务开发技术可以应用在信息服务,集中化服务、数据集成分析、应用程序扩展集成和对等模型系统等方面。它具有基于标准、非商业化、简便性、跨平台及语言、程序封装性等优点。
三、Web Service的体系结构
Web Service实现了SOA(面向服务的结构),因而它的体系结构与SOA相同。SOA体系结构有服务提供者、服务使用者和服务代理者三种角色。服务提供者负责开发和发布Web服务,可发布在开放服务器上,或企业内部服务器上。服务请求者通过服务代理发现Web服务,获取Web服务地址,请求使用Web服务。服务代理负责代理Web服务,提供Web服务查询、Web服务地址、Web服务接口描述等服务。它们的关系如图1所示。
图1 SOA体系结构
调用Web Service的过程一般分为四步,依次是搜索服务、发现服务、请求服务,使用服务,具体如下:
(1)搜索服务:客户端搜索Web Service,获得链接到发现文档的URL
(2)发现服务:客户端请求一个发现文档,其中包括获得链接到描述文档的URL
(3)请求服务:客户端请求该描述文档并创建一个Web服务代理
(4)使用服务:客户端通过Web服务代理和Web服务交互
如果是在企业网内部开发,则第一步搜索服务可以不需要,由服务的开发者直接提供Web服务的URL。
四、基于Moodle Web服务功能的应用开发
Moodle系统的很多功能以Web Service的形式开放,程序员可以在非PHP环境下,以Web Service的形式调用Moodle系统的相应功能进行应用开发首先应在Moodle网站的系统管理模块点击网站管理->高级特性->启用网络服务->点击保存修改,从而启用Moodle的Web Service功能。另外Moodle还为手机客户端开发也提供Web服务,在网站管理->插件->网路服务->手机下启用“为手机启动网络服务”。开发步骤具体如下。
(1)启用Web服务协议
Web服务协议见表1。目前有三种主流的方案可以实现Web服务,分别是REST、SOAP和XML-RPC,其中REST与另外两种相比更为简洁。这三种方法Moodle都支持,在Moodle网站的系统管理模块点击网站管理->插件->网路服务->管理协议,启用REST协议、SOAP协议、XML-RPC协议。
表1 Web服务协议
(2)启用Web服务文档功能
在应用外部程序访问Moodle进行二次开发时,还可以启用网络服务文档功能,该功能启用后用户可以在他的安全密钥页获得自己访问服务的介绍文档,从而获得Web服务的更多细节。
(3)创建使用Web服务功能的用户
在系统管理模块点击网站管理->用户->帐户->添加用户,在常规项页面输入用户名、密码、姓名、Email地址,点击命令按钮“创建用户”。
(4)创建使用Web服务功能角色
在系统管理模块点击网站管理->用户->权限->定义角色,点击“继续”按钮(不使用角色或原型),在新建一个角色的页面下,输入简称,输入角色全称Web Service Role,选择允许的权限,例如“加入用户”,再单击按钮“创建这个角色”。为了能够创建学生角色的用户,还应在定义角色下允许分配学生角色。
(5)绑定用户到相应角色
在系统管理模块点击网站管理->用户->权限->分配系统角色,点击角色Web Service Role,在下一个页面中,通过搜索找到需要添加的用户,点击“添加”即可完成为相应用户分配角色。
(6)添加服务
在系统管理模块点击网站管理->插件->网络服务->对外服务,点击“添加”,输入服务功能名字,添加授权用户,选择所需的服务功能,点击“添加服务”。Moodle Web服务见表2。
表2 Moodle Web服务
(7)添加函数
服务功能一开始是空的,需要在对应Web服务下添加函数才能具有真正的业务功能。在对外服务下点击相应服务名右边的超链接“函数”,在新打开页面下点击超链接“添加函数”,在搜索框中输入所需的函数名字可以进行函数搜索,选择所需的函数,点击按钮“添加函数”。常用函数见表3。
表3 常用函数
(8)创建授权令牌
授权令牌如图2所示。在系统管理模块点击网站管理->插件->网路服务->网络服务->管理令牌,点击“添加”,选择用户,选择服务,单击“保存修改”,效果如图所示。令牌是客户端调用Moodle服务器的Web服务功能的凭据,服务器端使用一个令牌来检验用户是否有调用特定功能的权限。
图2 授权令牌
(9)调用Web服务进行应用开发
正式开发前先在系统模块网站管理->开发->调试->调试信息页面启用“显示调试信息”。对于Moodle的初学者,启用调试功能可以从Moodle服务器获得更多额外的错误信息有助于解决开发中的错误。
快速测试Moodle Web服务是否可用,通过浏览器访问” https://服务器地址/mooodle/webservice/rest/server.php?wstoken=...&wsfunction=...&moodlewsr estformat=json"。
其中参数wstoken是授权令牌,wsfunction是函数功能,moodlewsrestformat是信息返回格式调用的函数有需要参数的话,通过¶meter_name=param追加参数,若参数是一数组,通过&array_name[index][parameter_name]=param追加参数。
例如调用本校Moodle服务器的"core_user_create_user"函数需要输入如下地址:"http://192.168.2.200/moodle/webservice/rest/server.php?wstoken=e8438c48ada759b0cac3798c703d7d17&wsf unction=Core_user_create_user&moodlewsrestformat=j son&users[0][username]=ShiYongchun&users[0]&[pass word]=Syc_63081328&[firstname]=Shi&users[0][lastna me]=Yongchun&users[0]&users[0][email]=63081328@qq.com"。
Moodle Web服务调用过程[3]如下:
(1)客户端将使用服务器分配给相应用户的授权令牌来调用Moodle服务器上面的一个相应的Web 服务的函数功能。
(2) Moodle服务器使用这个授权令牌来验证这个用户是否可以调用这个服务。
(3) Moodle服务器调用匹配的扩展功能,载入到相关模块里面的 externallib.php 文件。
(4)扩展功能调用在 lib.php 文件中匹配的Moodle 核心功能。
(5)核心功能模块将返回给扩展功能一个结果。
(6)扩展功能将这个结果返回给协议服务器。
(7)协议服务器将结果返回给客户端。
测试通过后就可以根据业务功能进行编码开发了,必须要实例化Moodle类,代码如下:
实例化好Moodle类,再根据业务功能需要调用Moodle类方法。
五、教务系统与Moodle 系统对接模块设计
学生要使用Moodle系统必须要有学生用户账号,学生账号由学生自己注册存在姓名不实名等问题,因此由教务人员统一创建。使用Moodle系统Web服务功能开发教务系统与Moodle系统对接模块,让教务人员在教务系统使用已经存在学生账号信息创建Moodle系统账号可以大大减轻教务人员熟悉新系统的工作量。对接模块业务流程设计如下:
(1)按班级名称查询班级学生
(2)遍历查询结果集,为班级每一位学生创建Moodle账号,以学号作为username,Aaa_123456作为password,以姓名作为Firstname,以班级名称作为Lastname,以学号+@qq.com作为email。
(3)调用core_user_create_user函数创建学生账号。
(4)调用Core_role_assign_role函数为学生分配角色。