体验构建学校开放API
2017-01-03金琦
金琦
引言
目前,众多教学管理系统的涌现,给学校教育带来便利的同时也带来了不少挑战。很多学校多个信息系统由于时间和开发公司的差异,造成各教育教学系统数据相互隔离,无法进行共享。未来,数据将是学校发展中最为重要的资源,目前这样的态势势必会让学校收集、分析、转移教学数据消耗大量的人力物力,还要面对其间产生的各种错误。因此,建设学校的新型架构数据中心,向学校所有应用提供基础数据,同时能接收学校所有应用所产生的数据,打通其中的数据通道,对数据进行有效整理和挖掘,是每所有现代教育情怀的学校的努力方向。建立自己的开放API就是一种有效的尝试,API是应用程序编程接口(Application Programming Interface)三个首字母的缩写,而开放API(Open API)是服务型网站常见的一种应用,网站的服务商将自己的网站服务封装成一系列API开放出去,供第三方开发者使用。Amazon和eBay等公司很早就有开放API,但是对应的数据往往集中在商品上,与人们的日常互联网应用有一定的距离。真正推动整个互联网开放的发端,应该算是Google在2005年开放Google Maps的API,目前谷歌公司提供的API相对完整,大部分谷歌服务都有相对应的API可以调用,下面我示范如何使用经典的Google Maps API将谷歌地图加入到网页中(如图1)。
考虑到PHP作为一种卓越的脚本语言,具有跨平台(可运行在UNIX、LINUX、Windows、Mac OS下)、低消耗(PHP消耗相当少的系统资源)、运行效率高等优点,本文中范例前后端网页也由PHP来说明:bj.php用来显示复选列表,用户只要选择目标位置,然后点击浏览地图,就会调用map.php,其中下页图2所示的bj.php第7~10行为PHP代码,定义了一个名为bj_address的数组来存放目标位置的地址信息,若景点个数多,此处也可以改用数据库存放相关数据。第13~19行为插入一个表单,里面包含有四个位置的复选列表和一个浏览地图按钮,各个项目的value属性被指定为各个位置的地址信息,当用户单击“浏览地图”按钮后,就会执行action属性指定的map.php表单处理页面。
我们再来观察下页图3所示的处理程序map.php,原本的地图功能,可能会让读者觉得程序代码很繁杂,其实不然!这主要是因为有了Google Maps API的帮助,其中第4行就是载入一个Google Maps API;第7~14行定义一个initialize函数,负责地图的初始化工作,建立属于google.maps的相关类,并调用第15~28行codeAddress()函数。第32行的value就是用户在bj.php页面中选中的目标位置的地址,使得第16行就是利用这个元素获取要在地图上做标记的地址。
在我们对开放API有了初步体验后,下面就构造了这样一个情境模式:为适应移动办公需要,对学校原有的Web邮件系统建立一个开放API,以方便移动应用开发公司调用作为范例来大致描述通过PHP连接原有数据库、生成JSON格式的开放API、调用开放API这一过程。
过程示范
1.连接原有数据库
创建一个连接学校现有MS SQL SERVER的func.php,图4所示的关键代码表明其是连接到数据库服务器(10.8.32.89)上的SCHOOL_ERP的数据库。在该数据库中只需配给“apiuser”用户读取权限即可(注:PHP在高版本上需要使用sqlsrv扩展对Sql Server进行连接,安装过程略)。
2.构建JSON格式的开放API
用readmail.php来构建,下页图5截取了关键之处并做出解释,第3~4行为应用上一级目录下的func.php,设置输出到浏览器的类型和编码,第5行表示以GET方式获取提供的教师姓名传递给name变量,转换name的编码为gbk,由于学校原始数据库是微软SQL Server,当前编码为gbk编码,第10行是一句符合我们预期API调用的一条SQL查询语句,第11~13行是为了防止SQL注入,创建一个预处理语句,将$name的值绑定到上面$sql变量里的“?”部分,第14行定义了一个数组,用于保存后面输出的数据。第15~18行用while遍历数据,其中sqlsrv_fetch_array函数获取了执行后的结果,赋值到$result变量中,对数据中的send_dt数据进行处理,把处理好的数据保存到$arr数组里。第19~20行将获得的数据编码转换为utf8(防止输出时数据乱码),使用json_encode函数,封装获得的结果,并且输出。
这时就生成了一位教师的最近5封邮件信息的API接口“http://wx.ourschool.cn/cjcxcs/api/getemail.php”,在此我们可以尝试直接将某位教师的姓名作为name变量传递参数代入,向开放API发出GET请求。获得JSON格式的文本后,将文本按照JSON格式解码,如图6所示。
开放API的数据格式一般有JSON(JavaScript Object Notation)和XML(EXtensible Markup Language)两种,考虑到简洁性和轻量性,我们通常会使用JSON,它方便人们进行阅读和编写,同时也方便了机器进行解析和生成。读者可以到http://json.cn网站了解和在线解析JSON结构(如图7)。
3.通过AJAX构建终端显示
通过使用AJAX(异步JavaScript和XML)异步获取的方式调用上述的API,进而解析接口返回的JSON,就可以在相关Web App里显示用户页面(如下页图8)。
以上是根据学校现有的动态网站进行了接口开发,以方便后继应用进行开发,但还有一些情况是依靠学校现有条件无法进行后继开发的,最为典型的就是短信应用,如我校微信报修平台需要将维修信息发给修理师傅,除了微信通知外,为了能更及时传送,又加上一条运营商维修短信通知,功能如下页图9所示。
这时我们可到国内在线某API数据供应商处进行体验申请短信API。申请后,会在后台看到该API的配置服务信息,需要指出的是,商业化的API请求通常为HTTP GET方式,返回数据为JSON格式,为了防止API被滥用或恶意使用,要求每个API使用者都要申请一个API Key,每个API Key对应唯一的一个API使用者,下页图10中的AppKey即为我校的一个API Key。
接下去可以创建一个短信模板,如“【报修平台】收到的新的来自#name#的报修信息,分类为:#app#”,#号中间的变量由开发者自行定义(如图11)。
然后根据图12的主要代码段创建一个短信通知页面,这样接到报修后可短信快速通知维修人员维修。第3行表示筛选出接收短信权限的对象,用户报修后,数据库会执行一条插入语句,进而触发到第10行的短信供应商API接口处传递数据,第13~16行为具体的传递数据(API KEY、发送号码、自定义的模板号和模板中显示的变量数据)。
上例在演示学校构建自身基础API的同时,还借用了成熟商业平台的开放API,我想这种模式可能也正是开放API的意义所在。如果教育工作者能意识到这种开发模式是一种挑战,一种创新,更是一种机会,有意识地让学校开发的教育教学资源系统更符合这个时代需要的标准和规范,直接将标准化后的数据提供给开发者,将极大地提高开发者的工作效率,也将提高学校的信息化效率。如果还能在上级教育主管机构统筹规划下,形成区域和校际间的一个完整、统一的教育教学数据开放API,则能让区域乃至全国教育教学数据趋向完整、开放,进而真正做到直接交换和共享信息,势必会开启一个教育类创新的新时代。