趙超鴻





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