金琦
引言
目前,眾多教學管理系統(tǒng)的涌現(xiàn),給學校教育帶來便利的同時也帶來了不少挑戰(zhàn)。很多學校多個信息系統(tǒng)由于時間和開發(fā)公司的差異,造成各教育教學系統(tǒng)數(shù)據(jù)相互隔離,無法進行共享。未來,數(shù)據(jù)將是學校發(fā)展中最為重要的資源,目前這樣的態(tài)勢勢必會讓學校收集、分析、轉(zhuǎn)移教學數(shù)據(jù)消耗大量的人力物力,還要面對其間產(chǎn)生的各種錯誤。因此,建設學校的新型架構數(shù)據(jù)中心,向?qū)W校所有應用提供基礎數(shù)據(jù),同時能接收學校所有應用所產(chǎn)生的數(shù)據(jù),打通其中的數(shù)據(jù)通道,對數(shù)據(jù)進行有效整理和挖掘,是每所有現(xiàn)代教育情懷的學校的努力方向。建立自己的開放API就是一種有效的嘗試,API是應用程序編程接口(Application Programming Interface)三個首字母的縮寫,而開放API(Open API)是服務型網(wǎng)站常見的一種應用,網(wǎng)站的服務商將自己的網(wǎng)站服務封裝成一系列API開放出去,供第三方開發(fā)者使用。Amazon和eBay等公司很早就有開放API,但是對應的數(shù)據(jù)往往集中在商品上,與人們的日常互聯(lián)網(wǎng)應用有一定的距離。真正推動整個互聯(lián)網(wǎng)開放的發(fā)端,應該算是Google在2005年開放Google Maps的API,目前谷歌公司提供的API相對完整,大部分谷歌服務都有相對應的API可以調(diào)用,下面我示范如何使用經(jīng)典的Google Maps API將谷歌地圖加入到網(wǎng)頁中(如圖1)。
考慮到PHP作為一種卓越的腳本語言,具有跨平臺(可運行在UNIX、LINUX、Windows、Mac OS下)、低消耗(PHP消耗相當少的系統(tǒng)資源)、運行效率高等優(yōu)點,本文中范例前后端網(wǎng)頁也由PHP來說明:bj.php用來顯示復選列表,用戶只要選擇目標位置,然后點擊瀏覽地圖,就會調(diào)用map.php,其中下頁圖2所示的bj.php第7~10行為PHP代碼,定義了一個名為bj_address的數(shù)組來存放目標位置的地址信息,若景點個數(shù)多,此處也可以改用數(shù)據(jù)庫存放相關數(shù)據(jù)。第13~19行為插入一個表單,里面包含有四個位置的復選列表和一個瀏覽地圖按鈕,各個項目的value屬性被指定為各個位置的地址信息,當用戶單擊“瀏覽地圖”按鈕后,就會執(zhí)行action屬性指定的map.php表單處理頁面。
我們再來觀察下頁圖3所示的處理程序map.php,原本的地圖功能,可能會讓讀者覺得程序代碼很繁雜,其實不然!這主要是因為有了Google Maps API的幫助,其中第4行就是載入一個Google Maps API;第7~14行定義一個initialize函數(shù),負責地圖的初始化工作,建立屬于google.maps的相關類,并調(diào)用第15~28行codeAddress()函數(shù)。第32行的value就是用戶在bj.php頁面中選中的目標位置的地址,使得第16行就是利用這個元素獲取要在地圖上做標記的地址。
在我們對開放API有了初步體驗后,下面就構造了這樣一個情境模式:為適應移動辦公需要,對學校原有的Web郵件系統(tǒng)建立一個開放API,以方便移動應用開發(fā)公司調(diào)用作為范例來大致描述通過PHP連接原有數(shù)據(jù)庫、生成JSON格式的開放API、調(diào)用開放API這一過程。
過程示范
1.連接原有數(shù)據(jù)庫
創(chuàng)建一個連接學?,F(xiàn)有MS SQL SERVER的func.php,圖4所示的關鍵代碼表明其是連接到數(shù)據(jù)庫服務器(10.8.32.89)上的SCHOOL_ERP的數(shù)據(jù)庫。在該數(shù)據(jù)庫中只需配給“apiuser”用戶讀取權限即可(注:PHP在高版本上需要使用sqlsrv擴展對Sql Server進行連接,安裝過程略)。
2.構建JSON格式的開放API
用readmail.php來構建,下頁圖5截取了關鍵之處并做出解釋,第3~4行為應用上一級目錄下的func.php,設置輸出到瀏覽器的類型和編碼,第5行表示以GET方式獲取提供的教師姓名傳遞給name變量,轉(zhuǎn)換name的編碼為gbk,由于學校原始數(shù)據(jù)庫是微軟SQL Server,當前編碼為gbk編碼,第10行是一句符合我們預期API調(diào)用的一條SQL查詢語句,第11~13行是為了防止SQL注入,創(chuàng)建一個預處理語句,將$name的值綁定到上面$sql變量里的“?”部分,第14行定義了一個數(shù)組,用于保存后面輸出的數(shù)據(jù)。第15~18行用while遍歷數(shù)據(jù),其中sqlsrv_fetch_array函數(shù)獲取了執(zhí)行后的結(jié)果,賦值到$result變量中,對數(shù)據(jù)中的send_dt數(shù)據(jù)進行處理,把處理好的數(shù)據(jù)保存到$arr數(shù)組里。第19~20行將獲得的數(shù)據(jù)編碼轉(zhuǎn)換為utf8(防止輸出時數(shù)據(jù)亂碼),使用json_encode函數(shù),封裝獲得的結(jié)果,并且輸出。
這時就生成了一位教師的最近5封郵件信息的API接口“http://wx.ourschool.cn/cjcxcs/api/getemail.php”,在此我們可以嘗試直接將某位教師的姓名作為name變量傳遞參數(shù)代入,向開放API發(fā)出GET請求。獲得JSON格式的文本后,將文本按照JSON格式解碼,如圖6所示。
開放API的數(shù)據(jù)格式一般有JSON(JavaScript Object Notation)和XML(EXtensible Markup Language)兩種,考慮到簡潔性和輕量性,我們通常會使用JSON,它方便人們進行閱讀和編寫,同時也方便了機器進行解析和生成。讀者可以到http://json.cn網(wǎng)站了解和在線解析JSON結(jié)構(如圖7)。
3.通過AJAX構建終端顯示
通過使用AJAX(異步JavaScript和XML)異步獲取的方式調(diào)用上述的API,進而解析接口返回的JSON,就可以在相關Web App里顯示用戶頁面(如下頁圖8)。
以上是根據(jù)學校現(xiàn)有的動態(tài)網(wǎng)站進行了接口開發(fā),以方便后繼應用進行開發(fā),但還有一些情況是依靠學?,F(xiàn)有條件無法進行后繼開發(fā)的,最為典型的就是短信應用,如我校微信報修平臺需要將維修信息發(fā)給修理師傅,除了微信通知外,為了能更及時傳送,又加上一條運營商維修短信通知,功能如下頁圖9所示。
這時我們可到國內(nèi)在線某API數(shù)據(jù)供應商處進行體驗申請短信API。申請后,會在后臺看到該API的配置服務信息,需要指出的是,商業(yè)化的API請求通常為HTTP GET方式,返回數(shù)據(jù)為JSON格式,為了防止API被濫用或惡意使用,要求每個API使用者都要申請一個API Key,每個API Key對應唯一的一個API使用者,下頁圖10中的AppKey即為我校的一個API Key。
接下去可以創(chuàng)建一個短信模板,如“【報修平臺】收到的新的來自#name#的報修信息,分類為:#app#”,#號中間的變量由開發(fā)者自行定義(如圖11)。
然后根據(jù)圖12的主要代碼段創(chuàng)建一個短信通知頁面,這樣接到報修后可短信快速通知維修人員維修。第3行表示篩選出接收短信權限的對象,用戶報修后,數(shù)據(jù)庫會執(zhí)行一條插入語句,進而觸發(fā)到第10行的短信供應商API接口處傳遞數(shù)據(jù),第13~16行為具體的傳遞數(shù)據(jù)(API KEY、發(fā)送號碼、自定義的模板號和模板中顯示的變量數(shù)據(jù))。
上例在演示學校構建自身基礎API的同時,還借用了成熟商業(yè)平臺的開放API,我想這種模式可能也正是開放API的意義所在。如果教育工作者能意識到這種開發(fā)模式是一種挑戰(zhàn),一種創(chuàng)新,更是一種機會,有意識地讓學校開發(fā)的教育教學資源系統(tǒng)更符合這個時代需要的標準和規(guī)范,直接將標準化后的數(shù)據(jù)提供給開發(fā)者,將極大地提高開發(fā)者的工作效率,也將提高學校的信息化效率。如果還能在上級教育主管機構統(tǒng)籌規(guī)劃下,形成區(qū)域和校際間的一個完整、統(tǒng)一的教育教學數(shù)據(jù)開放API,則能讓區(qū)域乃至全國教育教學數(shù)據(jù)趨向完整、開放,進而真正做到直接交換和共享信息,勢必會開啟一個教育類創(chuàng)新的新時代。