趙超鴻
摘要:筆者通過對JSON數(shù)據(jù)格式的研究,結(jié)合實際需求,利用ASP實現(xiàn)對Web API的自定義構(gòu)建,提供給AppInventor調(diào)用,從而實現(xiàn)了Web API在基于Android系統(tǒng)的學(xué)生成績查詢的應(yīng)用。
關(guān)鍵詞:JSON、Web API;AppInventor;"名稱:值"對;鍵值對
中圖分類號:G481 文獻標(biāo)識碼:A 論文編號:1647-2117(2015)05-0074-04
Web2.0時代,隨著移動終端的普及,移動應(yīng)用滲透到每個人的日常生活中,人們隨時隨地通過網(wǎng)絡(luò)訪問各類網(wǎng)站,網(wǎng)站不僅要滿足人對機器的訪問模式,而且還需提供機器對機器的訪問模式,以便移動終端快速獲取信息。在機器對機器的訪問模式中,提供數(shù)據(jù)的一方被稱為網(wǎng)絡(luò)服務(wù)(Web Service),而客戶端應(yīng)用與網(wǎng)絡(luò)服務(wù)之間的通信協(xié)議則稱為網(wǎng)絡(luò)應(yīng)用程序接口,簡稱Web API。在網(wǎng)絡(luò)通訊過程中,服務(wù)器端的Web Service根據(jù)需求生成某種格式的數(shù)據(jù)供客戶端的Web API調(diào)用。比較知名的Web API有Amazon Web API、FaceBook Web API、Twitter Web API、Baidu Web API等,因此,利用這些公開的Web API可以更方便有效地獲取信息,加工整合,從而發(fā)現(xiàn)信息的內(nèi)在價值,實現(xiàn)創(chuàng)新。誠然,我們也可以根據(jù)規(guī)則自定義自己需要的Web API,供客戶端調(diào)用。
Web API地址的表示形式是http://URL:port?tag=value,其中URL表示W(wǎng)eb API服務(wù)器地址,port表示通訊端口,tag表示要傳遞參數(shù)值的引用,value表示傳遞的參數(shù)。用來表示W(wǎng)eb API的數(shù)據(jù)格式一般有JSON和XML兩種,這兩種格式的優(yōu)缺點為:①可讀性:JSON偏向于符號表示,XML偏向于單詞表示,兩者各具優(yōu)勢。②簡潔性:JSON優(yōu)于XML,JSON更接近類C語言的描述,而XML更接近文本描述。③友好性:JSON比XML更友好,JSON在客戶端可以使用eval( )解釋,在服務(wù)器端可以使用ASP、 C、 C#、ColdFusion、 Java、 JavaScript、 Perl、 PHP、Python、 Ruby等60多種語言生成,官方網(wǎng)站(http://www.json.org/json-zh.html)已經(jīng)提供支持各種語言的封裝函數(shù);而XML則相對復(fù)雜,不管在服務(wù)器端還是在客戶端都需要花費大量的代碼來解析維護。④安全性:由于JSON可以使用eval( )來解釋,安全性會稍微比XML差。
根據(jù)以上分析,對于安全性不是首要考慮要素的Android終端來說,筆者建議使用JSON來描述數(shù)據(jù)格式。
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,它基于JavaScript語言,遵守ECMA-262標(biāo)準(zhǔn)。JSON的構(gòu)建基于"名稱:值"對的集合和值的有序列表兩種,前者稱為對象(object),后者稱為數(shù)組(array),對象和數(shù)組之間可以互相嵌套,如{"021600201":[{"語文":"117.5","語文排名":"50"},{"數(shù)學(xué)":"112","數(shù)學(xué)排名":"125"}]}。JSON在“值”的表達上使用Unicode編碼生成諸如{"學(xué)生":{"021600201":"\u9648\u5B9D\u4EEA"}}這樣格式的數(shù)據(jù)。我們利用BEJSON網(wǎng)站(網(wǎng)址:http://www.bejson.com/)校驗以上兩個JSON格式數(shù)據(jù)的有效性,格式化后的JSON如下頁表1。
為使Android終端能獲取Web API傳遞過來的JSON格式數(shù)據(jù),筆者使用了AppInventor作為終端應(yīng)用程序開發(fā)工具。App Inventor是一款手機編程軟件,它采用Open Blocks Java Library來創(chuàng)建可視化的模塊編程語言,允許沒有編程知識的用戶以拖拽特定的應(yīng)用程序行為模塊來創(chuàng)建Android應(yīng)用。App Inventor整個項目建立在云服務(wù)器上,只要輸入具體的網(wǎng)址(官方網(wǎng)址:http://contest.appinventor.mit.edu/),通過Gmail郵箱登錄即可訪問,開發(fā)的源程序以AIA格式打包,實時保存在遠程服務(wù)器上,只要開發(fā)者能上網(wǎng),就能隨時隨地打開自己創(chuàng)建的項目。App Inventor還內(nèi)置了模擬器和AI伴侶,可以通過模擬器調(diào)試,或通過AI伴侶在手機中調(diào)試。利用App Inventor開發(fā)音樂制作、視頻互動、語音識別、GPS定位等移動設(shè)備上的高科技應(yīng)用,也可以設(shè)計如小調(diào)查、小測驗、互動學(xué)習(xí)反饋等移動設(shè)備上的教育應(yīng)用軟件。對于輕量級的手機終端應(yīng)用開發(fā),App Inventor無疑是最佳的選擇。
筆者所在單位因每學(xué)期學(xué)生放假旅游導(dǎo)致無法及時在PC終端查詢考試成績,面對大批量的出游學(xué)生,筆者擬利用JSON構(gòu)建Web API,并使用App Inventor來開發(fā)一個基于Android系統(tǒng)的成績查詢應(yīng)用。
● 成績查詢應(yīng)用設(shè)計
該應(yīng)用程序要求功能單一,界面簡潔,安全實用,少耗流量。據(jù)此,成績查詢應(yīng)用設(shè)計流程如下:利用App Inventor構(gòu)建的Android手機終端應(yīng)用在初始化的時候獲取Web API中當(dāng)前考試的主題,顯示在“考試主題”欄。學(xué)生輸入統(tǒng)考號和姓名,點擊“查詢”按鈕,應(yīng)用程序?qū)⒄埱蟀l(fā)送給服務(wù)器端ASP構(gòu)建的Web API,Web API通過分析數(shù)據(jù)的合法性,打包成SQL指令向網(wǎng)絡(luò)數(shù)據(jù)庫發(fā)起請求,網(wǎng)絡(luò)數(shù)據(jù)庫根據(jù)查詢結(jié)果返回數(shù)據(jù)集給Web API,Web API把數(shù)據(jù)集格式化為JSON數(shù)據(jù)格式,最終給應(yīng)用程序調(diào)用,顯示查詢結(jié)果。圖1描述了上述的整個過程。
通過對學(xué)生參加考試后查詢成績這個事件分析得知,學(xué)生實體與成績實體和排名實體發(fā)生聯(lián)系。對于學(xué)生來說,學(xué)生實體有統(tǒng)考號和姓名兩個屬性;對于學(xué)生的成績來說,成績實體和排名實體均有語文、數(shù)學(xué)、英語、物理、化學(xué)、政治、歷史、地理、生物、總分這些屬性,并且一個學(xué)生對應(yīng)著多個成績和多個排名,他們是一對多的關(guān)系。圖2描述了學(xué)生參加考試的實體聯(lián)系。
按照學(xué)生參加考試的實體聯(lián)系圖的描述,很容易設(shè)計出數(shù)據(jù)庫中表的結(jié)構(gòu)。為方便在實際使用中將Excel數(shù)據(jù)表直接導(dǎo)出為數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù)表,筆者將考試主題作為數(shù)據(jù)表表名,將“學(xué)生”、“成績”、“排名”實體的屬性作為字段,具體見表2數(shù)據(jù)表各字段設(shè)計。
● 成績查詢應(yīng)用開發(fā)
根據(jù)以上設(shè)計,筆者從服務(wù)器端構(gòu)建Web API和在Android終端構(gòu)建應(yīng)用程序兩方面說明成績查詢應(yīng)用的開發(fā)過程。
1.服務(wù)器端利用ASP構(gòu)建JSON格式的Web API
在JSON官網(wǎng)中下載JSON_2.0.4.asp作為JSON的類被調(diào)用,通過Set o = jsObject( )定義一個名稱為o的JSON類對象,旗下有四個子對象,名稱為“主題”、“學(xué)生”、“各科成績”、“各科排信名”,定義如下:Set o("主題") = jsObject( )、Set o("學(xué)生") = jsObject( )、Set o("各科成績") = jsObject( )、Set o("各科排名") = jsObject( )。獲取數(shù)據(jù)表的表名作為查詢成績的“主題”,通過request( )獲取Android終端傳遞過來的統(tǒng)考號,并將統(tǒng)考號關(guān)聯(lián)數(shù)據(jù)表中學(xué)生的信息,將“統(tǒng)考號”、“姓名”作為“學(xué)生”對象的"名稱:值"對,同理將關(guān)聯(lián)的學(xué)生各科科目和各科成績作為“各科成績”對象的"名稱:值",將關(guān)聯(lián)的學(xué)生各科科目和各科排名作為“各科排名”對象的"名稱:值"對,通過表3代碼生成完整的JSON對象供Android終端調(diào)用。至此,關(guān)聯(lián)服務(wù)器和終端的Web API構(gòu)建完成。
2.利用App Inventor構(gòu)建Android終端應(yīng)用程序
終端程序的界面設(shè)計如表4所示,設(shè)計界面用到了一個屏幕組件、八個標(biāo)簽組件、兩個文本輸入框組件、一個按鈕組件、兩個表格布局組件和兩個Web客戶端組件等,其中Web客戶端組件為非可視組件,它是使用異步通信協(xié)議來獲取Web API的JSON數(shù)據(jù)的。
終端程序的代碼設(shè)計分兩部分:程序的初始化和查詢按鈕事件。當(dāng)程序初始化的時候,通過Web組件的地址請求返回數(shù)據(jù)表的名稱作為本次查詢的考試主題,顯示在lbsubject標(biāo)簽里。當(dāng)用戶輸入統(tǒng)考號和姓名后,點擊“查詢”按鈕觸發(fā)按鈕事件,程序按照Web API的地址格式生成URL供Web組件調(diào)用,向Web API發(fā)出GET請求。當(dāng)Web組件獲得JSON格式的文本后,將文本按照J(rèn)SON格式解碼,生成類似于("主題":"2013年高考","學(xué)生":("021600201":"陳寶儀"),"各科成績":("021600201":("語文":"117.5","數(shù)學(xué)":"120")),"各科排名":("021600201":("語文排名":"34","數(shù)學(xué)排名":"50")))的鍵值對,檢查輸入的統(tǒng)考號和姓名合法后,進一步查找“各科成績”和“各科排名”的鍵值對,最后作輸出格式化處理,輸出到Android系統(tǒng)的終端。如果檢查到輸入的信息不合法,則輸出“輸入的信息不正確”的提示。關(guān)鍵源代碼如上頁圖3所示。
筆者利用上述技術(shù)開發(fā)的Web API部署在服務(wù)器端Windows 2003系統(tǒng)的IIS里,以MYSQL作為后臺數(shù)據(jù)庫,用App Inventor生成的apk文件運行在Android系統(tǒng)里。筆者在上述運行環(huán)境中多次測試成功并實際應(yīng)用到學(xué)生群體中。用到的源文件可從以下地址下載,鏈接:http://pan.baidu.com/share/link?shareid=3258655633&uk=707995714&third=15,密碼:4sq5。