摘要:由于智能手機的普及和社會信息化的不斷發(fā)展,人們希望能通過手機或者平板的APP對原有B/S架構的信息化系統(tǒng)進行操作,因此這些系統(tǒng)就需要為移動端的APP提供訪問系統(tǒng)內部業(yè)務邏輯的接口,而如何為APP快速高效地提供這些接口一直是個難題。如果服務器只向外界暴露一個接口,而外部應用只需通過調用該接口就可以完成服務器中所有的業(yè)務邏輯,則會大大降低接口的開發(fā)時間和成本。該類接口被稱為“動態(tài)接口”,設計并實現(xiàn)了基于Web Service的動態(tài)接口,以提高接口開發(fā)效率。
關鍵詞:APP;Web Service;動態(tài)接口
DOIDOI:10.11907/rjdk.161484
中圖分類號:TP319
文獻標識碼:A文章編號文
章編號:16727800(2016)009008203
基金項目基金項目:
作者簡介作者簡介:丁易難(1991-),男,安徽安慶人,西安工程大學計算機科學學院碩士研究生,研究方向為計算機應用開發(fā)。
0引言
目前,大部分企業(yè)都搭建有自己的信息化平臺,B/S架構的跨平臺性和易用性,使得B/S架構被廣泛應用。然而,隨著移動網(wǎng)絡技術及移動設備性能的快速發(fā)展,“移動辦公”越來越受到企業(yè)青睞。很多企業(yè)都紛紛希望能擁有一個手機APP版的企業(yè)信息化平臺,該平臺向外界提供一個訪問系統(tǒng)內部的BLL層(Business Logic Layer)的接口,以便其它形式的用戶終端調用。在.NET平臺下,一般都是采用微軟提供的Web Service技術,向外界暴露接口。一般情況下,系統(tǒng)開發(fā)者會在Web Service層里,將系統(tǒng)中BLL層的每個類中的每個方法寫一個同樣的Web Method為外界終端提供訪問內部BLL層的接口。但是,一個系統(tǒng)的業(yè)務邏輯眾多,會有大量的業(yè)務邏輯的對象和方法。使用上述方法,會導致開發(fā)人員的工作量巨大。如果能在Web Service里,只寫一個Web Method,即在本系統(tǒng)的Web Service層中只向外界提供一個接口,通過外部終端向服務器調用此接口,并傳遞相關參數(shù),進而“動態(tài)地”調用系統(tǒng)內部已實現(xiàn)的各種業(yè)務邏輯方法,就會節(jié)省開發(fā)人員為系統(tǒng)開發(fā)接口而耗費的大量的工作時間。鑒于此,本文主要闡述了如何在基于.NET平臺的Web Service技術下,完成上述“動態(tài)接口”設計與實現(xiàn)。
1相關技術
1.1Web Service
Web Service是一種跨編程語言和跨操作系統(tǒng)平臺的遠程調用技術[1]。Web Service技術能使得運行在不同機器上的不同應用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數(shù)據(jù)或集成。依據(jù)Web Service規(guī)范的實施應用, 無論它們所使用的語言、 平臺或內部協(xié)議是什么, 都可以相互交換數(shù)據(jù)[2]。Service是自描述、 自包含的可用網(wǎng)絡模塊, 可以執(zhí)行具體的業(yè)務功能。Web Service也很容易部署, 因為它們基于一些常規(guī)的產業(yè)標準以及已有的一些技術,諸如標準通用標記語言下的子集XML、HTTP。Web Service減少了應用接口的花費,為整個企業(yè)甚至多個組織之間業(yè)務流程的集成提供了一個通用機制。
1.2JSON
JSON是一個輕量級的數(shù)據(jù)交換負載格式[3]。它是基于JavaScript編程語言ECMA-262 3rd Edition-December 1999標準的一種輕量級數(shù)據(jù)交換格式,主要用于跟服務器進行數(shù)據(jù)交換。與XML相比,JSON更加簡單和靈活[4]。JSON還具有可讀性、可擴展性和編碼解碼難度低等特點。因此,本文設計的基于Web Service的動態(tài)接口所傳遞的參數(shù)中,或者返回的結果中若有系統(tǒng)的對象實體Model,則需要將其轉成JSON格式的字符串,以方便客戶端和服務端解析。
1.3.NET反射技術
反射是C#.Net中獲取運行時類型信息的方式[5],它也是.NET中的重要機制,提供了封裝程序集、模塊和類型的對象(Type類型)??梢允褂梅瓷鋭討B(tài)創(chuàng)建類型的實例,將類型綁定到現(xiàn)有對象,或從現(xiàn)有對象獲取類型并調用其方法或訪問其字段和屬性。
2基于Web Service的動態(tài)接口實現(xiàn)原理
如圖1所示,“動態(tài)接口”的基本實現(xiàn)原理是,客戶端在調用Web Service提供的接口時,客戶端的代理類會把調用的相關數(shù)據(jù)封裝成SOAP協(xié)議(簡單對象訪問協(xié)議)的XML格式,通過HTTP協(xié)議向服務器端傳遞相關參數(shù)(例如調用業(yè)務邏輯層的名稱、方法以及方法參數(shù)),服務器端接收到這些參數(shù)并解析后,通過使用反射技術,動態(tài)地創(chuàng)建要調用業(yè)務邏輯的方法所在類的實例,再通過該類的實例調用其方法,最后通過網(wǎng)絡將方法的執(zhí)行結果返回給調用方,從而實現(xiàn)后臺業(yè)務邏輯的“動態(tài)”調用。
3動態(tài)接口具體實現(xiàn)
(1)創(chuàng)建Web Service。首先在Visual Stdio中新建一個Web項目,然后新建一個Web Service類(后綴名為.asmx),取名為DyInterface.asmx。
(2)定義WebMethod。實現(xiàn)“動態(tài)接口”需要用到.NET的反射機制,而在使用反射技術時,程序需要知道反射調用的是哪個類的哪一個方法,并且調用的方法可能需要傳遞參數(shù),因此需要在Web Service類中定義這個動態(tài)接口的WebMethod時需要定義3個形參:bllName(業(yè)務邏輯的類名稱)、methodName(要動態(tài)調用的業(yè)務邏輯類中的方法名稱)、param(方法的參數(shù))。具體定義動態(tài)接口方法的C#代碼如下:
[WebMethod]
public string InVoke(string bllName,string methodName,string param)
{
//ToDo...
}
(3)創(chuàng)建外部客戶端需要調用的業(yè)務邏輯類的實例。要調用類中的方法,就要獲得這個類的實例。傳統(tǒng)實例的方法一般是通過關鍵字new來獲得,然而通過new獲得類的實例需在程序中事先寫好,但是動態(tài)接口并不會提前知道客戶端需要調用的是哪個業(yè)務邏輯類,所以通過傳統(tǒng)new的方式獲得類實例不能滿足本次接口設計需求。因此只有通過形參bllName的值才能知道需要調用是哪一個業(yè)務邏輯的類,再利用反射技術,載入業(yè)務邏輯層的程序集(BLL),再通過CreateInstance的方法,動態(tài)地生成該業(yè)務邏輯類的實例。代碼如下:
dynamic bll = Assembly.Load("BLL").CreateInstance("BLL" + bllName)
這里利用了C#的動態(tài)類型的關鍵字“dynamic”,來接受創(chuàng)建的業(yè)務層的實例。該動態(tài)類型是在程序運行期間,動態(tài)獲取示實例的具體類型,從而避免了類型強制轉換的步驟。
(4)解析所調用方法中的具體參數(shù)。由于是基于Web Service的動態(tài)接口設計,且面向的是不同平臺的客戶端,因此為了屏蔽不同平臺差異性,本次動態(tài)接口的param參數(shù)定義為string類型。由于本次設計的動態(tài)接口只提供了一個調用方法參數(shù)的形參(param),這樣,當調用業(yè)務邏輯層的方法時,需要傳遞的參數(shù)有多個,或者傳遞的是系統(tǒng)中的對象實體(Model)時,就需要預先約定好參數(shù)傳遞的格式,以便在Web Service中解析它們。因此,參數(shù)(param)格式可以這樣約定:如果要調用的業(yè)務邏輯方法有N個參數(shù),則依次按原方法參數(shù)的順序參數(shù)排放好,并以“*”隔開;如果有些參數(shù)是系統(tǒng)中的對象實體,則將其轉成JSON形式的字符串,并在JSON串前面加一個"@"符號,以區(qū)分普通參數(shù)與實體對象參數(shù)。若要調用的方法沒有參數(shù),則傳空值。依照上述約定,就可以解析這些參數(shù)了,具體代碼如下:
List
if (!string.IsNullOrEmpty(param)){//判斷參數(shù)是否為空
string[] pars = param.Split(*);//將參數(shù)分開
foreach (string s in pars){//遍歷參數(shù)
if (s.StartsWith("@")){查詢是否有Json格式的model字符串
switch (bllName){ //如果發(fā)現(xiàn)有json串,則把json串轉成相對應的mode case"業(yè)務邏輯類1":
//把處理好的參數(shù)加入到list集合中
list.Add(JSONHelper.GetModelFromJSON<業(yè)務邏輯類名1.Model>(s.Remove(0, 1)));
case"業(yè)務邏輯類2":
//把處理好的參數(shù)加入到list集合中
list.Add(JSONHelper.GetModelFromJSON<業(yè)務邏輯類名2.Model>(s.Remove(0, 1))); break;
//....Todo(根據(jù)系統(tǒng)中具體業(yè)務邏輯類的數(shù)量自行調整)
default:
list.Add(JSONHelper.GetModelFromJSON
break;
}
}
else{
list.Add(s);//把處理好的參數(shù)加入到list集合中,以便后面調用方法的時候用
}
}
}
這里需要說明的是,程序中在JSON轉成實體類中需要傳入實體類的泛型,由于泛型不確定,需要在程序中使用switch語句通過判斷參數(shù)BllName來確定泛型,根據(jù)系統(tǒng)業(yè)務的具體情況,可添加多個case關鍵字來判斷。上述代碼case后面的業(yè)務邏輯類和JSON轉Model的泛型可以根據(jù)不同的系統(tǒng)替換成不同業(yè)務邏輯層的名稱及其對應的實體類型的泛型。
(5)調用客戶端需要調用的業(yè)務邏輯方法。利用反射技術,將經(jīng)過處理后的參數(shù)集合list轉成Array型,再傳入業(yè)務邏輯對象實例(bll)中,進而通過methodName的值,動態(tài)地反射調用外部客戶端想要調用的業(yè)務邏輯方法,最后將執(zhí)行結果以json串的形式返回給系統(tǒng)外部客戶端。具體代碼如下:
Return JSONHelper.ReturnStringToJSON(bll.GetType().GetMethod(methodName).Invoke(bll, list.ToArray()).ToString(), true, 200)
將上述代碼放入第二步所定義的WebMethod的方法體中,最終將該Web Service發(fā)布到服務器上,供系統(tǒng)外部終端調用。由第一步命名可知,本次接口的地址為:http://(服務器地址)/DyInterface.asmx。由于各種移動平臺都實現(xiàn)了對Web Service進行訪問的功能,因而只要客戶端拿到該接口的地址,即可按照文中描述的規(guī)則對該動態(tài)接口進行遠程調用。
由以上實現(xiàn)過程可以看到,在本次創(chuàng)建的Web Service中只有一個WebMethod方法,而外部終端只需通過對該WebMethod進行遠程調用,然后傳遞不同的業(yè)務邏輯層的類名稱(bllName)和類中的方法名稱(methodName)以及約定好的格式參數(shù)(param),即可完成系統(tǒng)中各種不同的業(yè)務邏輯,從而完成本文預期的動態(tài)接口設計。
4結語
隨著智能手機與網(wǎng)絡通信技術的普及,以及社會信息化建設進程的加快,越來越多的已經(jīng)搭建完成的信息化系統(tǒng),需要從單一的Web端擴展到各式各樣的移動設備APP端,以便用戶方便快捷地使用信息化系統(tǒng)的功能。因此,服務器基于Web Service技術向移動設備APP端提供的信息化系統(tǒng)業(yè)務接口,這項需求將會越來越多。例如,在已投入使用的西安市畢業(yè)生就業(yè)服務綜合管理系統(tǒng)已經(jīng)利用此項技術,向正在研發(fā)該系統(tǒng)對應的學生模塊APP的研發(fā)方,提供了這種動態(tài)接口?;赪eb Service的動態(tài)接口設計,系統(tǒng)研發(fā)方不再需要對每個業(yè)務邏輯提供單獨的業(yè)務接口,節(jié)省了大量時間,極大提高了接口的開發(fā)效率。因此,本文設計的基于.NET Web Service技術的動態(tài)接口具有較高應用價值。
參考文獻:
[1]魏小林,張鐵軍,曹晶,等.利用Web Service技術構建醫(yī)院信息系統(tǒng)接口[J].中國數(shù)字醫(yī)學,2014,9(6):2729.
[2]王向方,武偉,唐偉媛.WebService技術在企業(yè)中的應用[J].電腦編程技巧與維護,2015(2):9194.
[3]屈展,李嬋.JSON在Ajax數(shù)據(jù)交換中的應用研究[J].西安石油大學學報:自然科學版,2011,26(1):9598.
[4]谷方舟,沈波.JSON數(shù)據(jù)交換格式在異構系統(tǒng)集成中的應用研究[J].鐵路計算機應用,2012,21(2):14.
[5]郭慶華,朱戰(zhàn)立.利用C#.Net反射技術實現(xiàn)軟件界面動態(tài)存儲[J].電腦知識與技術,2010(3):634635.
責任編輯(責任編輯:孫娟)
客服熱線:400-656-5456??客服專線:010-56265043??電子郵箱:longyuankf@126.com
電信與信息服務業(yè)務經(jīng)營許可證:京icp證060024號
Dragonsource.com Inc. All Rights Reserved