本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及生成REST(RepresentationalStateTransfer,表述性狀態(tài)遷移)服務(wù)和REST實(shí)現(xiàn)的方法及對(duì)應(yīng)的設(shè)備。
背景技術(shù):在Web應(yīng)用軟件開發(fā)領(lǐng)域中,正在經(jīng)歷著從傳統(tǒng)部署方式向云服務(wù)化部署和集成的變革。在這樣的潮流下,越來越多的Web應(yīng)用采用了Web服務(wù)方式對(duì)外提供開放的Web應(yīng)用程序編程接口(WebApplicationProgrammingInterface,WebAPI),為第三方應(yīng)用提供數(shù)據(jù)集成和擴(kuò)展等支持。REST是一種將Web服務(wù)抽象為統(tǒng)一資源定位符(UniformResourceLocator,URL)指向的資源,并采用超文本傳輸協(xié)議(HyperTextTransferProtocol,HTTP)協(xié)議訪問的開發(fā)方式。因其簡(jiǎn)單、易用、平臺(tái)兼容性好等特點(diǎn),被越來越多的廠商所采用。在Java開發(fā)領(lǐng)域中,以REST開發(fā)方式開發(fā)的Web服務(wù),雖然可以使用若干中間件,但仍然存在著開發(fā)量大、效率低和授權(quán)機(jī)制不清晰的問題。如圖1所示,服務(wù)器端的JavaAPI的本地實(shí)現(xiàn)(即圖1中的模塊A),只能進(jìn)行本地調(diào)用,如果要將其轉(zhuǎn)化成能被跨網(wǎng)絡(luò)調(diào)用的REST服務(wù),則必須開發(fā)服務(wù)器端的REST服務(wù)(即圖1中的模塊B)。其中,服務(wù)器端的REST服務(wù)用于基于服務(wù)器端的JavaAPI提供REST服務(wù),完成客戶端發(fā)來的REST服務(wù)請(qǐng)求向本地JavaAPI調(diào)用的調(diào)度和適配,獲取REST服務(wù)請(qǐng)求需要調(diào)用的本地JavaAPI的方法,將REST服務(wù)請(qǐng)求的參數(shù)轉(zhuǎn)換成該方法可調(diào)用的格式。本地JavaAPI被調(diào)用后,服務(wù)器端的REST服務(wù)將被調(diào)用的JavaAPI方法返回值按照REST服務(wù)所要求的格式轉(zhuǎn)換為REST服務(wù)響應(yīng)發(fā)給客戶端。客戶端的JavaAPI的REST實(shí)現(xiàn)(即圖1中的模塊C),用于將客戶端應(yīng)用(即圖1中的模塊D)的JavaAPI調(diào)用轉(zhuǎn)換為REST服務(wù)請(qǐng)求,以及將服務(wù)器端發(fā)來的REST服務(wù)響應(yīng)轉(zhuǎn)換為被調(diào)用的JavaAPI的方法返回值發(fā)給客戶端應(yīng)用??蛻舳巳粢缇W(wǎng)絡(luò)訪問圖1中的服務(wù)器端的REST服務(wù),則需要基于與服務(wù)器端相同的JavaAPI生成客戶端的JavaAPI的REST實(shí)現(xiàn),客戶端使用該JavaAPI的REST實(shí)現(xiàn)提供的API完成對(duì)服務(wù)器端JavaAPI的間接調(diào)用。由于JavaAPI的結(jié)構(gòu)復(fù)雜,包括多個(gè)服務(wù)接口,每個(gè)服務(wù)接口的定義不同(比如:方法返回值、方法參數(shù)等的定義),難以找到一種統(tǒng)一的基于各個(gè)不同的服務(wù)接口自動(dòng)生成REST服務(wù)代碼的方法。因此現(xiàn)有方案中,均采用人工的方式編寫服務(wù)器端的REST服務(wù)的代碼,如果需要在客戶端使用相同的JavaAPI進(jìn)行訪問,則基于與服務(wù)器端相同的JavaAPI人工開發(fā)客戶端的JavaAPIREST實(shí)現(xiàn)的代碼。而人工方式代碼,存在效率低,且代碼質(zhì)量難以保證的問題。綜上,目前還沒有一種能夠高效地生成REST服務(wù)和REST實(shí)現(xiàn)的方法。
技術(shù)實(shí)現(xiàn)要素:本發(fā)明實(shí)施例提供一種生成REST服務(wù)的方法、一種生成客戶端JavaAPI的REST實(shí)現(xiàn)的方法、一種服務(wù)器以及一種客戶端,用以解決現(xiàn)有方式中采用人工編碼的方式生成REST服務(wù)和REST實(shí)現(xiàn),效率低且代碼質(zhì)量難以保證的問題。本發(fā)明實(shí)施例提供一種生成REST服務(wù)的方法,包括:服務(wù)器掃描Java應(yīng)用程序編程接口API的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息;針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件;針對(duì)每一個(gè)REST服務(wù)類,服務(wù)器根據(jù)該REST服務(wù)類的類文件和該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)。利用本發(fā)明實(shí)施例提供的方法,服務(wù)器掃描JavaAPI,生成REST服務(wù)類的類文件,最終生成REST服務(wù),具有效率高、生成代碼準(zhǔn)確的優(yōu)點(diǎn)。較佳地,所述JavaAPI的一個(gè)或多個(gè)服務(wù)接口為已設(shè)權(quán)限的服務(wù)接口;所述針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件還包括:針對(duì)每一個(gè)已設(shè)權(quán)限的服務(wù)接口,服務(wù)器將該已設(shè)權(quán)限服務(wù)接口的用于權(quán)限控制的代碼置于該已設(shè)權(quán)限服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件中;其中,該已設(shè)權(quán)限服務(wù)接口的用于權(quán)限控制的代碼是通過該已設(shè)權(quán)限的服務(wù)接口對(duì)應(yīng)的接口信息中的用于權(quán)限控制的注解轉(zhuǎn)換得到的。通過在JavaAPI服務(wù)接口定義上或方法定義上添加注解,可以靈活地控制REST服務(wù)訪問的權(quán)限控制策略。在服務(wù)接口定義上的注解可以被該服務(wù)接口的多個(gè)方法所共用,這使得代碼結(jié)構(gòu)更清晰簡(jiǎn)潔,也提高了代碼邏輯的可重用程度。較佳地,所述服務(wù)器掃描JavaAPI的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息,包括:服務(wù)器確定所述JavaAPI的根節(jié)點(diǎn)服務(wù)接口為要掃描的服務(wù)接口;服務(wù)器對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息;若獲取的服務(wù)接口對(duì)應(yīng)的接口信息中包括返回值類型為接口的方法,則服務(wù)器根據(jù)該方法的返回值確定接下來要掃描的服務(wù)接口,并返回對(duì)要掃描的服務(wù)接口進(jìn)行掃描的步驟;否則結(jié)束掃描過程。這種方案相對(duì)與現(xiàn)有技術(shù)而言,對(duì)JavaAPI的結(jié)構(gòu)進(jìn)行了簡(jiǎn)化處理,利用JavaAPI各服務(wù)接口之間的關(guān)聯(lián)關(guān)系來實(shí)現(xiàn)所有服務(wù)接口的掃描,克服了現(xiàn)有的人工生成REST服務(wù)的方法中,由于JavaAPI的結(jié)構(gòu)復(fù)雜和無法找到統(tǒng)一的獲取各個(gè)服務(wù)接口對(duì)應(yīng)的接口信息方法的問題。較佳地,所述服務(wù)器對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息包括:服務(wù)器從Java類加載器中加載Java反射類的對(duì)象,使用Java反射類對(duì)象的方法獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。利用Java反射類對(duì)象的方法,可以更簡(jiǎn)單、方便地獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。較佳地,所述針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件,包括:針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)獲取的該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼;服務(wù)器根據(jù)所述該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼,生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件。與現(xiàn)有的人工方式編寫代碼相比,本方案中服務(wù)器根據(jù)服務(wù)接口對(duì)應(yīng)的接口信息自動(dòng)生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件,效率更高,生成的代碼更準(zhǔn)確。較佳地,所述針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件,包括:針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息,利用Java字節(jié)碼操作技術(shù),生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件。本方案中,采用Java字節(jié)碼操作技術(shù),無需編寫源代碼,節(jié)省了代碼轉(zhuǎn)化的時(shí)間,提高了效率。較佳地,所述針對(duì)一個(gè)REST服務(wù)類,服務(wù)器根據(jù)該REST服務(wù)類的類文件和該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù),包括:服務(wù)器向Java虛擬機(jī)加載生成的各REST服務(wù)類的類文件為對(duì)應(yīng)的REST服務(wù)類,將加載得到的各REST服務(wù)類封裝進(jìn)WinkApplication對(duì)象中;針對(duì)每一個(gè)REST服務(wù)類,服務(wù)器通過Wink中間件,利用該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口中用于定義REST服務(wù)特征的注解信息,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)。在本方案中,通過Wink中間件自動(dòng)生成REST服務(wù),比現(xiàn)有的人工方法更準(zhǔn)確,效率更高。本發(fā)明實(shí)施例提供一種生成客戶端JavaAPI的REST實(shí)現(xiàn)的方法,包括:客戶端掃描Java應(yīng)用程序編程接口API的各服務(wù)接口,獲取每一個(gè)服務(wù)接口的接口信息,其中所述JavaAPI與該客戶端要調(diào)用的REST服務(wù)所在服務(wù)器上的JavaAPI相同;針對(duì)每一個(gè)所述服務(wù)接口,客戶端根據(jù)該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件,類文件中包括根據(jù)該服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解確定的客戶端請(qǐng)求REST服務(wù)相關(guān)參數(shù)的代碼;客戶端加載生成的各REST實(shí)現(xiàn)類的類文件,生成客戶端JavaAPI的REST實(shí)現(xiàn)。利用本發(fā)明實(shí)施例提供的方法,客戶端掃描JavaAPI,生成REST實(shí)現(xiàn)類的類文件,最終客戶端JavaAPI的REST實(shí)現(xiàn),具有效率高、生成代碼準(zhǔn)確的優(yōu)點(diǎn)。較佳地,所述客戶端掃描JavaAPI的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息包括:客戶端確定所述JavaAPI的根節(jié)點(diǎn)服務(wù)接口為要掃描的服務(wù)接口;客戶端對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息;若獲取的服務(wù)接口對(duì)應(yīng)的接口信息中包括返回值類型為接口的方法,則客戶端根據(jù)該方法的返回值確定接下來要掃描的服務(wù)接口,并返回對(duì)要掃描的服務(wù)接口進(jìn)行掃描的步驟;否則結(jié)束掃描過程。該方案相對(duì)與現(xiàn)有技術(shù)而言,對(duì)JavaAPI的結(jié)構(gòu)進(jìn)行了簡(jiǎn)化處理,利用JavaAPI各服務(wù)接口之間的關(guān)聯(lián)關(guān)系來實(shí)現(xiàn)所有服務(wù)接口的掃描,克服了現(xiàn)有的人工生成REST實(shí)現(xiàn)的方法中,由于JavaAPI的結(jié)構(gòu)復(fù)雜和無法找到統(tǒng)一的獲取各個(gè)服務(wù)接口對(duì)應(yīng)的接口信息方法的問題。較佳地,所述客戶端對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息包括;客戶端從Java類加載器中加載Java反射類的對(duì)象,使用Java反射類對(duì)象的方法獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。本方案利用Java反射類對(duì)象的方法,可以更簡(jiǎn)單、方便地獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。較佳地,所述針對(duì)每一個(gè)所述服務(wù)接口,客戶端根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件包括:針對(duì)每一個(gè)所述服務(wù)接口,客戶端根據(jù)獲取的該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼;根據(jù)所述該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼,客戶端生成與該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件。與現(xiàn)有的人工方式編寫代碼相比,本方案中客戶端根據(jù)服務(wù)接口對(duì)應(yīng)的接口信息自動(dòng)生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件,效率更高,生成的代碼更準(zhǔn)確。所述針對(duì)每一個(gè)所述服務(wù)接口,客戶端根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件包括:針對(duì)每一個(gè)所述服務(wù)接口,客戶端根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息,利用Java字節(jié)碼操作技術(shù),生成與該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件。本方案中,采用Java字節(jié)碼操作技術(shù),無需編寫源代碼,節(jié)省了代碼轉(zhuǎn)化的時(shí)間,提高了效率。本發(fā)明實(shí)施例提供一種服務(wù)器,該服務(wù)器包括:掃描模塊,用于掃描Java應(yīng)用程序編程接口API的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息;類文件生成模塊,用于針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件;REST服務(wù)生成模塊,用于針對(duì)每一個(gè)REST服務(wù)類,根據(jù)該REST服務(wù)類的類文件和該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)。本方案中,服務(wù)器掃描JavaAPI,生成REST服務(wù)類的類文件,最終生成REST服務(wù),具有效率高、生成代碼準(zhǔn)確的優(yōu)點(diǎn)。較佳地,所述JavaAPI的一個(gè)或多個(gè)服務(wù)接口為已設(shè)權(quán)限的服務(wù)接口;所述類文件生成模塊還用于:針對(duì)每一個(gè)已設(shè)權(quán)限的服務(wù)接口,將該已設(shè)權(quán)限服務(wù)接口的用于權(quán)限控制的代碼置于該已設(shè)權(quán)限服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件中;其中,該已設(shè)權(quán)限服務(wù)接口的用于權(quán)限控制的代碼是通過所述掃描模塊獲取的該已設(shè)權(quán)限的服務(wù)接口對(duì)應(yīng)的接口信息中的用于權(quán)限控制的注解轉(zhuǎn)換得到的。通過在JavaAPI服務(wù)接口定義上或方法定義上添加注解,可以靈活地控制REST服務(wù)訪問的權(quán)限控制策略。在服務(wù)接口定義上的注解可以被該服務(wù)接口的多個(gè)方法所共用,這使得代碼結(jié)構(gòu)更清晰簡(jiǎn)潔,也提高了代碼邏輯的可重用程度。較佳地,所述掃描模塊具體用于:確定所述JavaAPI的根節(jié)點(diǎn)服務(wù)接口為要掃描的服務(wù)接口;對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息;若獲取的服務(wù)接口對(duì)應(yīng)的接口信息中包括返回值類型為接口的方法,則根據(jù)該方法的返回值確定接下來要掃描的服務(wù)接口,并返回對(duì)要掃描的服務(wù)接口進(jìn)行掃描的步驟;否則結(jié)束掃描過程。這種方案相對(duì)與現(xiàn)有技術(shù)而言,對(duì)JavaAPI的結(jié)構(gòu)進(jìn)行了簡(jiǎn)化處理,利用JavaAPI各服務(wù)接口之間的關(guān)聯(lián)關(guān)系來實(shí)現(xiàn)所有服務(wù)接口的掃描,克服了現(xiàn)有的人工生成REST服務(wù)和REST實(shí)現(xiàn)的方法中,由于JavaAPI的結(jié)構(gòu)復(fù)雜和無法找到統(tǒng)一的獲取各個(gè)服務(wù)接口對(duì)應(yīng)的接口信息方法的問題。較佳地,所述對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息包括:從Java類加載器中加載Java反射類的對(duì)象,使用Java反射類對(duì)象的方法獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。利用Java反射類對(duì)象的方法,可以更簡(jiǎn)單、方便地獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。較佳地,所述類文件生成模塊具體用于:針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)獲取的該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼;根據(jù)所述該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼,生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件。與現(xiàn)有的人工方式編寫代碼相比,本方案中服務(wù)器根據(jù)服務(wù)接口對(duì)應(yīng)的接口信息自動(dòng)生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件,效率更高,生成的代碼更準(zhǔn)確。較佳地,所述類文件生成模塊具體用于:針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息,利用Java字節(jié)碼操作技術(shù),生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件。本方案中,采用Java字節(jié)碼操作技術(shù),無需編寫源代碼,節(jié)省了代碼轉(zhuǎn)化的時(shí)間,提高了效率。較佳地,所述REST服務(wù)生成模塊具體用于:向Java虛擬機(jī)加載生成的各REST服務(wù)類的類文件為對(duì)應(yīng)的REST服務(wù)類,將加載得到的各REST服務(wù)類封裝進(jìn)WinkApplication對(duì)象中;針對(duì)每一個(gè)REST服務(wù)類,通過Wink中間件,利用該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口中用于定義REST服務(wù)特征的注解信息,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)。在本方案中,通過Wink中間件自動(dòng)生成REST服務(wù),比現(xiàn)有的人工方法更準(zhǔn)確,效率更高。本發(fā)明實(shí)施例提供一種客戶端,該客戶端包括:掃描模塊,用于掃描Java應(yīng)用程序編程接口API的各服務(wù)接口,獲取每一個(gè)服務(wù)接口的接口信息,其中所述JavaAPI與該客戶端要調(diào)用的REST服務(wù)所在服務(wù)器上的JavaAPI相同;類文件生成模塊,用于針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件,類文件中包括根據(jù)該服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解確定的客戶端請(qǐng)求REST服務(wù)相關(guān)參數(shù)的代碼;REST實(shí)現(xiàn)生成模塊,用于加載生成的各REST實(shí)現(xiàn)類的類文件,生成客戶端JavaAPI的REST實(shí)現(xiàn)。在本方案中,客戶端掃描JavaAPI,生成REST實(shí)現(xiàn)類的類文件,最終客戶端JavaAPI的REST實(shí)現(xiàn),與現(xiàn)有技術(shù)相比,具有效率高、生成代碼準(zhǔn)確的優(yōu)點(diǎn)。較佳地,所述掃描模塊具體用于:確定所述JavaAPI的根節(jié)點(diǎn)服務(wù)接口為要掃描的服務(wù)接口;對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息;若獲取的服務(wù)接口對(duì)應(yīng)的接口信息中包括返回值類型為接口的方法,則根據(jù)該方法的返回值確定接下來要掃描的服務(wù)接口,并返回對(duì)要掃描的服務(wù)接口進(jìn)行掃描的步驟;否則結(jié)束掃描過程。該方案相對(duì)與現(xiàn)有技術(shù)而言,對(duì)JavaAPI的結(jié)構(gòu)進(jìn)行了簡(jiǎn)化處理,利用JavaAPI各服務(wù)接口之間的關(guān)聯(lián)關(guān)系來實(shí)現(xiàn)所有服務(wù)接口的掃描,克服了現(xiàn)有的人工生成REST實(shí)現(xiàn)的方法中,由于JavaAPI的結(jié)構(gòu)復(fù)雜和無法找到統(tǒng)一的獲取各個(gè)服務(wù)接口對(duì)應(yīng)的接口信息方法的問題。較佳地,所述對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息包括;從Java類加載器中加載Java反射類的對(duì)象,使用Java反射類對(duì)象的方法獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。本方案利用Java反射類對(duì)象的方法,可以更簡(jiǎn)單、方便地獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。較佳地,所述類文件生成模塊具體用于:針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)獲取的該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼;根據(jù)所述該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼,生成與該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件。與現(xiàn)有的人工方式編寫代碼相比,本方案中客戶端根據(jù)服務(wù)接口對(duì)應(yīng)的接口信息自動(dòng)生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件,效率更高,生成的代碼更準(zhǔn)確。較佳地,所述類文件生成模塊具體用于:針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息,利用Java字節(jié)碼操作技術(shù),生成與該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件。本方案中,采用Java字節(jié)碼操作技術(shù),無需編寫源代碼,節(jié)省了代碼轉(zhuǎn)化的時(shí)間,提高了效率。附圖說明圖1為采用REST開發(fā)方式的服務(wù)器和客戶端的軟件結(jié)構(gòu)以及JavaAPI調(diào)用過程的示意圖;圖2為本發(fā)明實(shí)施例提供的一種生成REST服務(wù)的方法過程示意圖;圖3為本發(fā)明實(shí)施例提供的生成客戶端JavaAPI的REST實(shí)現(xiàn)的方法過程示意圖;圖4為示例一中被掃描服務(wù)接口的JavaAPI的結(jié)構(gòu)示意圖;圖5為示例一的掃描JavaAPI各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息的方法過程示意圖;圖6為示例二的服務(wù)器生成REST服務(wù)類的類文件的方法過程示意圖;圖7為示例三的客戶端生成REST實(shí)現(xiàn)類的類文件的方法過程示意圖;圖8為本發(fā)明實(shí)施例的服務(wù)器的結(jié)構(gòu)示意圖;圖9為本發(fā)明實(shí)施例的客戶端的結(jié)構(gòu)示意圖。具體實(shí)施方式本發(fā)明實(shí)施例提供一種生成REST服務(wù)的方法、一種生成客戶端JavaAPI的REST實(shí)現(xiàn)的方法、一種服務(wù)器以及一種客戶端,在本發(fā)明實(shí)施例提供的方法中,服務(wù)器掃描JavaAPI,生成REST服務(wù)類的類文件,最終生成REST服務(wù),具有效率高、生成代碼準(zhǔn)確的優(yōu)點(diǎn)。下面,對(duì)本發(fā)明實(shí)施例中涉及的幾個(gè)概念簡(jiǎn)要說明如下:服務(wù):在計(jì)算機(jī)網(wǎng)絡(luò)中,由服務(wù)器提供給客戶端的用于數(shù)據(jù)交互的接口。REST服務(wù):以REST開發(fā)方式提供的服務(wù),其將服務(wù)器的服務(wù)抽象成資源,使用URL進(jìn)行標(biāo)識(shí)和查找,并通過HTTP協(xié)議進(jìn)行訪問。實(shí)現(xiàn):Java程序中,接口定義了類和方法的行為,但沒有定義方法的具體代碼,實(shí)現(xiàn)為接口中的方法提供具體的代碼,將接口實(shí)現(xiàn)為類。本發(fā)明實(shí)施例中JavaAPI的本地實(shí)現(xiàn)和客戶端的JavaAPI的實(shí)現(xiàn)是同一個(gè)JavaAPI的不同實(shí)現(xiàn)。REST實(shí)現(xiàn):用于向服務(wù)器發(fā)起REST服務(wù)請(qǐng)求,接收服務(wù)器的REST響應(yīng),并將該響應(yīng)轉(zhuǎn)化為JavaAPI對(duì)應(yīng)的方法返回值類型,返回給客戶端應(yīng)用??蚣埽罕景l(fā)明實(shí)施例提供的方法在服務(wù)器或客戶端啟動(dòng)時(shí)自動(dòng)執(zhí)行,對(duì)于服務(wù)器,用于生成REST服務(wù);對(duì)于客戶端,用于生成客戶端JavaAPI的REST實(shí)現(xiàn)。服務(wù)器或客戶端運(yùn)行時(shí)不必再重新生成REST服務(wù)或REST實(shí)現(xiàn)。在本發(fā)明實(shí)施例中,框架為在服務(wù)器或客戶端上運(yùn)行的,基于JavaAPI,通過實(shí)施本發(fā)明實(shí)施例的各步驟,生成服務(wù)器的REST服務(wù)或客戶端的REST實(shí)現(xiàn)的程序。對(duì)于服務(wù)器,服務(wù)器啟動(dòng)時(shí),框架自動(dòng)啟動(dòng)ApacheWink中間件(以下簡(jiǎn)稱“Wink中間件”),調(diào)用Wink中間件的RestServlet類的getApplication方法,獲得擴(kuò)展后的ApplicationEx類,創(chuàng)建ApplicationEx類的對(duì)象,觸發(fā)執(zhí)行掃描JavaAPI的各服務(wù)接口、根據(jù)服務(wù)接口的接口信息生成類文件、生成REST服務(wù)的過程。其中,通過調(diào)用該創(chuàng)建ApplicationEx類的對(duì)象的getClasses的方法,在getClasses方法中調(diào)用框架提供的Generator類,生成Generator類的對(duì)象,從配置文件中讀取JavaAPI的根節(jié)點(diǎn)服務(wù)接口(或者調(diào)用Generator類對(duì)象的用于設(shè)置根節(jié)點(diǎn)服務(wù)接口的方法來設(shè)置根節(jié)點(diǎn)服務(wù)接口)。調(diào)用Generator類對(duì)象的scan方法和generate方法來分別進(jìn)行掃描JavaAPI的各服務(wù)接口和生成REST服務(wù)類的類文件的操作,從JavaAPI根節(jié)點(diǎn)服務(wù)接口開始掃描整個(gè)JavaAPI的各服務(wù)接口,根據(jù)獲取服務(wù)接口的接口信息生成REST服務(wù)類的類文件。之后在getClasses方法中,向Java虛擬機(jī)加載生成的各REST服務(wù)類的類文件為對(duì)應(yīng)的REST服務(wù)類并返回給Wink中間件。針對(duì)每一個(gè)REST服務(wù)類,Wink中間件利用該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口中用于定義REST服務(wù)特征的注解信息,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)。對(duì)于服務(wù)器,框架擴(kuò)展了Wink中間件的Application類,重寫了Application類的getClasses方法,得到了擴(kuò)展后的ApplicationEX類;擴(kuò)展了Wink中間件的RestServlet類,重寫了其getApplication方法,得到了擴(kuò)展后的ApplicationEX類。ApplicationEx類的代碼示例如下,在該代碼中重寫了Application類的getClasses方法,用于加載生成的類文件;使用Java類加載器,將每一個(gè)REST服務(wù)類加載為Class對(duì)象。代碼片段1、ApplicationEx類對(duì)于客戶端,客戶端啟動(dòng)時(shí),調(diào)用框架提供的Generator類,生成Generator類的對(duì)象,從配置文件中讀取JavaAPI根節(jié)點(diǎn)服務(wù)接口(或者調(diào)用Generator類對(duì)象的用于設(shè)置根節(jié)點(diǎn)服務(wù)接口的方法來設(shè)置根節(jié)點(diǎn)服務(wù)接口);調(diào)用generator類對(duì)象的start方法執(zhí)行本發(fā)明實(shí)施例提供的生成客戶端JavaAPIREST實(shí)現(xiàn)的方法,從JavaAPI根節(jié)點(diǎn)服務(wù)接口開始掃描JavaAPI的各服務(wù)接口,根據(jù)獲取服務(wù)接口的接口信息生成REST實(shí)現(xiàn)類的類文件,加載生成的各REST實(shí)現(xiàn)類的類文件生成客戶端JavaAPI的REST實(shí)現(xiàn)。如圖1所示,客戶端訪問JavaAPI的過程:當(dāng)客戶端應(yīng)用D模塊需要訪問JavaAPI時(shí),創(chuàng)建一個(gè)JavaAPI根節(jié)點(diǎn)服務(wù)接口的對(duì)象,調(diào)用根節(jié)點(diǎn)接口的方法(比如:getservice1)來獲得子節(jié)點(diǎn)服務(wù)接口service1,再調(diào)用子節(jié)點(diǎn)服務(wù)接口service1的方法(比如:getusername,用來獲取用戶名)。C模塊將模塊D的訪問JavaAPI的請(qǐng)求轉(zhuǎn)化為REST服務(wù)請(qǐng)求發(fā)給服務(wù)器,服務(wù)器返回REST響應(yīng),C模塊再將REST響應(yīng)轉(zhuǎn)化為getusername的方法返回值返回給客戶端應(yīng)用D模塊。圖2為本發(fā)明實(shí)施例提供的生成REST服務(wù)的方法過程示意圖,如圖2所示,該方法包括以下步驟:S201:服務(wù)器掃描Java應(yīng)用程序編程接口API的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息;S202:針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件;S203:針對(duì)每一個(gè)REST服務(wù)類,服務(wù)器根據(jù)該REST服務(wù)類的類文件和該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)。在步驟S201中,獲取的服務(wù)接口對(duì)應(yīng)的接口信息包括但不限于:服務(wù)接口的接口名稱、服務(wù)接口定義上的注解和服務(wù)接口的所有方法,以及服務(wù)接口的各方法的參數(shù)、服務(wù)接口各方法的返回值類型和服務(wù)接口各方法上的注解。其中,注解包括用于定義REST服務(wù)特征的注解,比如,標(biāo)準(zhǔn)的JAX-RS(JavaAPIforRESTfulWebServices,采用REST開發(fā)方式開發(fā)的web服務(wù)的JavaAPI)注解,其可用于定義REST服務(wù)特征。JAX-RS注解,是符合REST服務(wù)注解標(biāo)準(zhǔn)的注解,標(biāo)準(zhǔn)的JAX-RS注解包括:1)用于設(shè)置HTTP訪問方法的注解;2)用于設(shè)置REST服務(wù)請(qǐng)求參數(shù)的注解;3)用于設(shè)置REST服務(wù)的URL路徑的注解等。常用的JAX-RS注解及其用途如表1所示。表1可選地,JavaAPI的一個(gè)或多個(gè)服務(wù)接口為已設(shè)權(quán)限的服務(wù)接口;步驟S202,針對(duì)每一個(gè)服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件還包括:針對(duì)每一個(gè)已設(shè)權(quán)限的服務(wù)接口,服務(wù)器將該已設(shè)權(quán)限服務(wù)接口的用于權(quán)限控制的代碼置于該已設(shè)權(quán)限服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件中;其中,該已設(shè)權(quán)限服務(wù)接口的用于權(quán)限控制的代碼是通過該已設(shè)權(quán)限的服務(wù)接口對(duì)應(yīng)的接口信息中的用于權(quán)限控制的注解轉(zhuǎn)換得到的。下面對(duì)用于權(quán)限控制的注解進(jìn)行說明。通過在JavaAPI服務(wù)接口定義上或方法定義上添加注解,可以靈活地控制REST服務(wù)訪問的權(quán)限控制策略。比如使用注解類@RESTAccessControl(”hasRole(admin)”),就可以通過參數(shù)配置允許admin用戶擁有訪問REST服務(wù)的權(quán)限。在服務(wù)接口定義上的注解可以被該服務(wù)接口的多個(gè)方法所共用,這使得代碼結(jié)構(gòu)更清晰簡(jiǎn)潔,也提高了代碼邏輯的可重用程度。將已設(shè)權(quán)限服務(wù)接口中的用于權(quán)限控制的注解轉(zhuǎn)化為該已設(shè)權(quán)限服務(wù)接口對(duì)應(yīng)的服務(wù)類中的用于權(quán)限控制的代碼的示例可參見示例四。本發(fā)明實(shí)施例中,用于權(quán)限控制的注解可加在服務(wù)接口定義上,也可加在服務(wù)接口的方法定義上。加在服務(wù)接口定義上的用于權(quán)限控制的注解適用于該服務(wù)接口的所有方法,加在服務(wù)接口的方法定義上的注解僅適用于對(duì)應(yīng)的方法。若在服務(wù)接口定義上和該服務(wù)接口的某方法定義上同時(shí)存在用于權(quán)限控制的注解,則根據(jù)位于對(duì)應(yīng)的方法定義上的用于權(quán)限控制的注解生成對(duì)應(yīng)方法的權(quán)限控制的代碼,并置于該方法的方法體中。本發(fā)明實(shí)施例,用于權(quán)限控制的注解是以“@AccessControl”標(biāo)識(shí)的,當(dāng)執(zhí)行步驟S202生成用于權(quán)限控制的代碼時(shí),當(dāng)識(shí)別出“@AccessControl”,即將其后緊跟著的括號(hào)內(nèi)的注解轉(zhuǎn)換成用于權(quán)限控制的代碼。在現(xiàn)有的人工生成REST服務(wù)的方法中,若要對(duì)服務(wù)器的REST服務(wù)進(jìn)行權(quán)限控制,需要在REST服務(wù)對(duì)應(yīng)的代碼中,分散地加入大量用于權(quán)限控制的代碼。采用本發(fā)明實(shí)施例提供的方法,能夠自動(dòng)生成用于權(quán)限控制的代碼,實(shí)現(xiàn)起來效率更高,且不易出錯(cuò)。而且最終的用于權(quán)限控制的代碼是加在各方法的方法體中的,與其他方法體的代碼混雜在一起,如果現(xiàn)有的采用人工方式生成,不容易識(shí)別和維護(hù),而采用本發(fā)明實(shí)施例的自動(dòng)生成用于權(quán)限控制的代碼,則無需考慮人工生成代碼的上述代碼結(jié)構(gòu)不清晰的問題。當(dāng)一個(gè)服務(wù)接口的多個(gè)方法具有相同的權(quán)限控制策略時(shí),采用本發(fā)明實(shí)施例的方法,可以通過在服務(wù)接口上添加注解的方式(即注解是加在服務(wù)接口定義上,在服務(wù)接口的方法體之外),即可為該服務(wù)接口的多個(gè)方法設(shè)置相同的權(quán)限控制策略。然后通過S202步驟,統(tǒng)一地在該服務(wù)接口對(duì)應(yīng)的類文件的各方法體中自動(dòng)生成相同的用于權(quán)限控制的代碼,避免了通過人工方式在各個(gè)方法體中重復(fù)地寫入相同代碼,提高了效率,且不容易出錯(cuò)。這樣就實(shí)現(xiàn)了同一個(gè)權(quán)限控制策略,被多個(gè)方法重用??蛇x地,步驟S203中包括如下兩個(gè)步驟:服務(wù)器向Java虛擬機(jī)加載生成的各REST服務(wù)類的類文件為對(duì)應(yīng)的REST服務(wù)類,將加載得到的各REST服務(wù)類封裝進(jìn)WinkApplication對(duì)象中;針對(duì)每一個(gè)REST服務(wù)類,服務(wù)器通過Wink中間件,利用該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口中用于定義REST服務(wù)特征的注解信息,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)。ApacheWink(以下簡(jiǎn)稱為“Wink中間件”)為開源的用于生成REST服務(wù)的中間件。在步驟S202中,已經(jīng)生成了與服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件,服務(wù)器將生成的各REST服務(wù)類的類文件加載到Java虛擬機(jī)中,生成對(duì)應(yīng)的REST服務(wù)類,并將加載得到的各REST服務(wù)類封裝進(jìn)WinkApplication對(duì)象中。在生成的REST服務(wù)類的類文件中包括用于定義REST服務(wù)特征的注解,這樣Wink中間件就可以利用這些定注解生成REST服務(wù)。實(shí)現(xiàn)上述步驟的代碼如代碼片段1中所述,這里不再贅述。圖3為本發(fā)明實(shí)施例提供的生成客戶端JavaAPI的REST實(shí)現(xiàn)的方法過程示意圖,如圖3所示,該方法包括如下步驟:S301:客戶端掃描Java應(yīng)用程序編程接口API的各服務(wù)接口,獲取每一個(gè)服務(wù)接口的接口信息,其中該JavaAPI與該客戶端要調(diào)用的REST服務(wù)所在服務(wù)器上的JavaAPI相同;S302:針對(duì)每一個(gè)所述服務(wù)接口,客戶端根據(jù)該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件,類文件中包括根據(jù)該服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解確定的客戶端請(qǐng)求REST服務(wù)相關(guān)參數(shù)的代碼;S303:客戶端加載生成的各REST實(shí)現(xiàn)類的類文件,生成客戶端JavaAPI的REST實(shí)現(xiàn)。步驟S301中,之所以限定JavaAPI與該客戶端要調(diào)用的REST服務(wù)所在服務(wù)器上的JavaAPI相同,是因?yàn)橹挥锌蛻舳撕头?wù)器端都基于相同的JavaAPI分別生成客戶端的JavaAPIREST實(shí)現(xiàn)和REST服務(wù),客戶端才能訪問該服務(wù)器的REST服務(wù)。步驟S302用于定義REST服務(wù)特征的注解可參見表1,根據(jù)服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解確定的客戶端請(qǐng)求REST服務(wù)相關(guān)參數(shù)的代碼的方法參見示例五。下面,通過示例一來說明掃描JavaAPI的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息的方法。示例一掃描JavaAPI的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息示例一的方法同時(shí)適用于客戶端和服務(wù)器。對(duì)于客戶端,該方法的執(zhí)行主體是客戶端;對(duì)于服務(wù)器,該方法的執(zhí)行主體為服務(wù)器。圖4為示例一中被掃描服務(wù)接口的JavaAPI的結(jié)構(gòu)示意圖。為了能夠簡(jiǎn)單清楚地說明掃描JavaAPI各服務(wù)接口的過程,圖4所示的JavaAPI結(jié)構(gòu)為簡(jiǎn)化的結(jié)構(gòu),實(shí)際的JavaAPI中往往包括幾十個(gè)服務(wù)接口。圖4所示的JavaAPI的結(jié)構(gòu)為樹形結(jié)構(gòu),其根節(jié)點(diǎn)服務(wù)接口為ServiceFacede接口,其下聚合了兩個(gè)服務(wù)接口,分別為Service1接口和Service2接口,每個(gè)服務(wù)接口中有各自的方法。實(shí)際的JavaAPI的結(jié)構(gòu)不限于樹形結(jié)構(gòu),比如環(huán)形結(jié)構(gòu)等,只要JavaAPI的各服務(wù)接口之間存在關(guān)聯(lián)關(guān)系,即可通過掃描JavaAPI的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息。示例一中,從JavaAPI的根節(jié)點(diǎn)服務(wù)接口ServiceFacede接口處開始,掃描JavaAPI的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息。確定JavaAPI根節(jié)點(diǎn)服務(wù)接口的方法有很多,比如,服務(wù)器或客戶端啟動(dòng)時(shí),通過讀取配置文件來確定JavaAPI根節(jié)點(diǎn)服務(wù)接口。下面,以圖4所示的JavaAPI為例,具體說明獲取JavaAPI每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息的方法,如圖5所示,該方法包括如下步驟:S501、確定所述JavaAPI的根節(jié)點(diǎn)服務(wù)接口為要掃描的服務(wù)接口;S502、對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息;S503、若獲取的服務(wù)接口對(duì)應(yīng)的接口信息中包括返回值類型為接口的方法,則服務(wù)器根據(jù)該方法的返回值確定下一個(gè)要掃描的服務(wù)接口,并返回對(duì)要掃描的服務(wù)接口進(jìn)行掃描的步驟;否則結(jié)束掃描過程??蛇x地,步驟S502可利用Java反射機(jī)制來實(shí)現(xiàn)。利用Java反射機(jī)制,使用Java開發(fā)工具包(JavaDevelopmentKit,JDK)提供的java.lang.reflect包中的Class類來獲取服務(wù)接口的接口名稱、服務(wù)接口定義上的注解和服務(wù)接口的所有方法;使用Method類來獲取服務(wù)接口的方法名稱、方法返回值類型、方法上的注解、方法參數(shù)類型等。具體做法是,從Java類加載器中加載得到j(luò)ava.lang.reflect.Class對(duì)象,調(diào)用該對(duì)象方法(如表2java.lang.reflect.Class的方法),得到服務(wù)接口的接口名稱、服務(wù)接口定義上的注解和服務(wù)接口的所有方法。表2遍歷服務(wù)接口的所有方法,通過調(diào)用java.lang.reflect.Method對(duì)象的方法(如表3java.lang.reflect.Method的方法),得到該服務(wù)接口的各方法的參數(shù)各方法的返回值類型,各方法上的注解。表3通過步驟S502得到了服務(wù)接口的各方法。以圖4中的JavaAPI的根節(jié)點(diǎn)服務(wù)接口ServiceFacede接口為例,通過步驟S502確定其方法getService1的返回值類型為接口Service1;方法getService2的返回值類型為Service2,這樣就確定了接下來要掃描的JavaAPI的服務(wù)接口為Service1接口和Service2接口。只要服務(wù)接口中的某方法的返回值類型為接口,則可根據(jù)該返回值類型確定下一個(gè)要掃描的服務(wù)接口。對(duì)于兩個(gè)Service1接口和Serivce2接口,再分別通過表2中java.lang.reflect.Class對(duì)象的各方法得到服務(wù)接口名稱、服務(wù)接口定義上的注解、服務(wù)接口所有方法;通過表3中java.lang.reflect.Method對(duì)象的各方法得到服務(wù)接口的各方法的方法名稱、方法返回值類型、方法上的注解、參數(shù)類型。如此循環(huán)下去,直至獲取的服務(wù)接口對(duì)應(yīng)的接口信息中不再包括返回值類型為接口的方法(即已經(jīng)獲取了JavaAPI的所有服務(wù)接口對(duì)應(yīng)的接口信息)。需要說明的是,圖4中的JavaAPI的結(jié)構(gòu)為簡(jiǎn)化的結(jié)構(gòu),實(shí)際的JavaAPI中可能包括幾十個(gè)服務(wù)接口,只要各服務(wù)接口之間存在關(guān)聯(lián),那么對(duì)這些服務(wù)接口進(jìn)行與上面步驟相同的迭代操作,直到遍歷完所有的JavaAPI的服務(wù)接口,即可得到該JavaAPI的所有服務(wù)接口對(duì)應(yīng)的接口信息。由于本發(fā)明實(shí)施例中,對(duì)JavaAPI的結(jié)構(gòu)進(jìn)行了簡(jiǎn)化處理,利用JavaAPI各服務(wù)接口之間的關(guān)聯(lián)關(guān)系來實(shí)現(xiàn)所有服務(wù)接口的掃描(比如,示例二中,通過服務(wù)接口的方法返回值來確定接下來要掃描的服務(wù)接口),克服了現(xiàn)有的人工生成REST服務(wù)和REST實(shí)現(xiàn)的方法中,由于JavaAPI的結(jié)構(gòu)復(fù)雜和無法找到統(tǒng)一的獲取各個(gè)服務(wù)接口對(duì)應(yīng)的接口信息方法的問題。下面,通過示例二對(duì)本發(fā)明實(shí)施例提供的針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件的一般性方法進(jìn)行描述;通過示例三對(duì)本發(fā)明實(shí)施例提供的針對(duì)每一個(gè)所述服務(wù)接口,客戶端根據(jù)該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件的一般性方法進(jìn)行描述;通過示例四對(duì)本發(fā)明實(shí)施例提供的針對(duì)一個(gè)特定的JavaAPI服務(wù)接口,服務(wù)器生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件的方法;通過示例五對(duì)本發(fā)明實(shí)施例提供的針對(duì)一個(gè)特定的JavaAPI服務(wù)接口,客戶端生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件的方法。示例二針對(duì)每一個(gè)所述服務(wù)接口,服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件圖6為示例二的方法過程示意圖。如圖6所示,該方法包括如下步驟:S601、針對(duì)每一個(gè)服務(wù)接口,服務(wù)器根據(jù)獲取的該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼;S602、服務(wù)器根據(jù)該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼,生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件。可選地,在步驟S602中,可將服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼進(jìn)行編譯,來生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件。圖7為示例三的方法過程示意圖。如圖7所示,該方法包括如下步驟:S701、針對(duì)每一個(gè)服務(wù)接口,客戶端根據(jù)獲取的該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼;S702、根據(jù)該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼,客戶端生成與該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件??蛇x地,在步驟S702中,可將服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼進(jìn)行編譯,來生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件。下面,通過示例四和示例五分別說明服務(wù)器和客戶端生成類文件的方法示例四、服務(wù)器端生成類文件為說明簡(jiǎn)單起見,將JavaAPI中某服務(wù)接口做如下簡(jiǎn)化。接口名為Service1,且該服務(wù)接口只有一個(gè)方法;@Path,@Get,@PathParam三個(gè)注解為JAX-RS注解,@AccessControl為用于權(quán)限控制的注解。Service1接口的定義如下:代碼片段2.簡(jiǎn)化的Service1接口代碼基于對(duì)Service1接口掃描的獲取的接口信息,服務(wù)器生成與Service1接口對(duì)應(yīng)的REST服務(wù)類的源代碼,其中Service1Resource類即為與Service1接口對(duì)應(yīng)的REST服務(wù)類;@Path、@GET、@PathParam三個(gè)JAX-RS注解,被復(fù)制到了生成的源代碼上;用于權(quán)限控制的注解@AccessControl,被轉(zhuǎn)換成方法體(getUserAge)前部的用于權(quán)限控制的代碼。生成的與Serivce1接口對(duì)應(yīng)的REST服務(wù)類的源代碼中包括:1)用于將getUserAge方法參數(shù)的類型轉(zhuǎn)換為本地JavaAPI對(duì)應(yīng)的方法參數(shù)類型的代碼;2)用于基于之前掃描得到的Service1接口對(duì)應(yīng)的接口信息生成調(diào)用本地JavaAPI的代碼;3)用于將本地JavaAPI方法的執(zhí)行結(jié)果的類型轉(zhuǎn)換為REST服務(wù)要求的數(shù)據(jù)類型的代碼;4)用于返回REST服務(wù)響應(yīng)結(jié)果的代碼;5)用于權(quán)限控制的代碼。服務(wù)器生成的與Serivce1接口對(duì)應(yīng)的REST服務(wù)類的源代碼示例如下,其中接口名稱后面拼接resource得到類名稱,實(shí)際的命名方式不限于此,只要對(duì)于不同的接口對(duì)應(yīng)的類名不同即可。所有的類均為public類型;用于定義REST服務(wù)特征的注解(比如JAX-RS注解)是直接拷貝的,Response.*是指方法的返回值,所有方法的返回值均以“Response.”開頭,方法名和Service1接口中的方法名相同,參數(shù)相同。代碼片段3.Service1接口對(duì)應(yīng)REST服務(wù)類的源代碼然后,將上述生成的REST服務(wù)類的源代碼編譯成類文件。在服務(wù)器端生成REST服務(wù)類的代碼時(shí),直接復(fù)制用于生成REST服務(wù)的注解,不做其他處理。待步驟S203中,再利用這些注解定義生成的REST服務(wù)的特征。當(dāng)用于生成REST服務(wù)的注解為JAX-RS注解時(shí),可用@PATH注解定義資源的訪問的HTTP路徑,可用@PathParam,@QueryParam注解定義REST服務(wù)請(qǐng)求的參數(shù)等,具體用法可參考表1。需要說明的是,在本示例中,代碼中出現(xiàn)了@PathParam("userId"),是用@PathParam注解定義了URL的一部分,是方法的參數(shù)值,并非生成REST服務(wù)類的源代碼所必需的。示例五、客戶端生成類文件仍以示例四中的Service1服務(wù)接口為例,生成Service1接口對(duì)應(yīng)的REST實(shí)現(xiàn)類,REST實(shí)現(xiàn)類的源代碼中,Service1ClientImpl類實(shí)現(xiàn)了Service1接口;Service1ClientImpl.getUserAge方法,將JavaAPI的調(diào)用轉(zhuǎn)換成向服務(wù)器發(fā)出的REST服務(wù)請(qǐng)求,并將來自服務(wù)器的REST服務(wù)響應(yīng)轉(zhuǎn)化為Service1ClientImpl.getUserAge方法的返回值,這樣使得客戶端能夠調(diào)用getUserAge方法,而不用關(guān)心其是否調(diào)用了服務(wù)器的REST服務(wù)。生成的與Service1服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼中包括:1)用于獲取服務(wù)器地址的代碼,其中服務(wù)器地址可從客戶端配置文件中讀?。?)用于生成服務(wù)器的REST服務(wù)的URL地址,并利用生成的URL地址訪問服務(wù)器端服務(wù)的代碼(根據(jù)之前掃描到的getUserAge方法上用于定義REST服務(wù)特征的注解(比如:JAX-RS注解)生成的),其中,將客戶端的用戶標(biāo)識(shí)userId放入了URL中;3)用于將方法getUserAge的參數(shù)類型轉(zhuǎn)換為REST服務(wù)請(qǐng)求要求類型的代碼;4)用于向服務(wù)器發(fā)起REST服務(wù)請(qǐng)求,獲取REST服務(wù)響應(yīng)的代碼;5)用于將REST服務(wù)響應(yīng)參數(shù)類型轉(zhuǎn)換為方法getUserAge返回值類型的代碼;6)用于將類型轉(zhuǎn)換后的結(jié)果作為方法getUserAge返回值返回的代碼。生成的與Service1服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的代碼示例如下:代碼片段4.Service1接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的代碼在生成客戶端REST實(shí)現(xiàn)類代碼的過程中,對(duì)掃描得到的接口信息中用于定義REST服務(wù)特征的注解進(jìn)行了處理。以示例五為例,當(dāng)用于生成REST服務(wù)的注解是JAX-RS注解時(shí),利用@PATH注解@Path("/users")生成服務(wù)器的REST服務(wù)的ULR地址StringrestServiceURL=serverHost+"/users"+userId+"/age";使用@PathParam注解指明了URL值的某一部分是參數(shù)的值,把參數(shù)值放入了URL中;使用@GET注解確定生成REST請(qǐng)求的方式(GET\POST\PUT\DELETE),當(dāng)客戶端調(diào)用REST服務(wù)時(shí),如果發(fā)現(xiàn)對(duì)應(yīng)方法上有@GET注解,生成代碼中就使用HTTPGET請(qǐng)求,代碼中就使用get方法。同理如果是@POST注解,就使用post方法,以此類推。其他對(duì)注解的處理方法原理類似,這里不再一一贅述。示例二、示例三、示例四和示例五中生成類文件的方法是通過先采用字符串拼接的方式生成源代碼,再根據(jù)源代碼生成對(duì)應(yīng)的類文件。其中,對(duì)“字符串拼接”的含義解釋如下:字符串拼接,即為將多個(gè)字符串連接成一個(gè)字符串。在Java程序設(shè)計(jì)黃總,通過創(chuàng)建字符串緩存區(qū)(StringBuffer)對(duì)象code,然后使用諸如下列代碼:code.append(“public”)code.append(“class”)code.append(“Service1ClientImpl{”)以示例四為例,將示例四的代碼片段3中的Service1接口代碼的所有字符串順序地拼接到字符串緩存對(duì)象code中,最終得到示例四中的代碼片段3。在Java語言程序開發(fā)中,.java文件是開發(fā)時(shí)的文本內(nèi)容(即Java源代碼),其經(jīng)過編譯器編譯后,生成二進(jìn)制的類文件(即.class文件)。類文件與其對(duì)應(yīng)的*.java文件是等效的,不同的是類文件中將.java文件中的代碼進(jìn)行了二進(jìn)制的編譯。同時(shí),類文件可以直接被Java虛擬機(jī)所執(zhí)行,所有的.java源代碼,都需要被編譯成類文件才能被執(zhí)行。采用Java字節(jié)碼操作技術(shù),無需編寫源代碼,將示例四和示例五中的生成源代碼和編譯的步驟合二為一,其采用java虛擬機(jī)的指令和規(guī)則,通過二進(jìn)制數(shù)據(jù)的方式來生成與示例四(服務(wù)器)和示例五(客戶端)相同的代碼(這里“相同”的含義是指:示例四或示例五中生成的源代碼經(jīng)過編譯后即為通過Java字節(jié)碼操作技術(shù)生成的二進(jìn)制的類文件),直接生成類文件。由于將生成源代碼和編譯的步驟一步完成,節(jié)省了代碼轉(zhuǎn)化的時(shí)間,提高了效率。在本發(fā)明實(shí)施例中,通過字符串拼接或Java字節(jié)碼操作技術(shù),來生成REST服務(wù)類的類文件,解決了采用人工方式編寫代碼復(fù)雜、效率低的問題,且生成的代碼準(zhǔn)確?;谕话l(fā)明構(gòu)思,本發(fā)明實(shí)施例中還提供了一種服務(wù)器,由于該服務(wù)器解決問題的原理與本發(fā)明實(shí)施例提供的生成REST服務(wù)的方法相似,因此該服務(wù)器的實(shí)施可以參見生成REST服務(wù)的方法的實(shí)施,重復(fù)之處不再贅述。圖8為本發(fā)明實(shí)施例提供的服務(wù)器的結(jié)構(gòu)示意圖。如圖8所示,該服務(wù)器具體包括:掃描模塊801,用于掃描Java應(yīng)用程序編程接口API的各服務(wù)接口,獲取每一個(gè)服務(wù)接口對(duì)應(yīng)的接口信息;類文件生成模塊802,用于針對(duì)每一個(gè)服務(wù)接口,根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件;REST服務(wù)生成模塊803,用于針對(duì)每一個(gè)REST服務(wù)類,根據(jù)該REST服務(wù)類的類文件和該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)。可選地,JavaAPI的一個(gè)或多個(gè)服務(wù)接口為已設(shè)權(quán)限的服務(wù)接口;類文件生成模塊802還用于:針對(duì)每一個(gè)已設(shè)權(quán)限的服務(wù)接口,將該已設(shè)權(quán)限服務(wù)接口的用于權(quán)限控制的代碼置于該已設(shè)權(quán)限服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件中;其中,該已設(shè)權(quán)限服務(wù)接口的用于權(quán)限控制的代碼是通過所述掃描模塊獲取的該已設(shè)權(quán)限的服務(wù)接口對(duì)應(yīng)的接口信息中的用于權(quán)限控制的注解轉(zhuǎn)換得到的??蛇x地,掃描模塊801具體用于:確定JavaAPI的根節(jié)點(diǎn)服務(wù)接口為要掃描的服務(wù)接口;對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息;若獲取的服務(wù)接口對(duì)應(yīng)的接口信息中包括返回值類型為接口的方法,則根據(jù)該方法的返回值確定接下來要掃描的服務(wù)接口,并返回對(duì)要掃描的服務(wù)接口進(jìn)行掃描的步驟;否則結(jié)束掃描過程。可選地,對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息包括:從Java類加載器中加載Java反射類的對(duì)象,使用Java反射類對(duì)象的方法獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息。可選地,類文件生成模塊802具體用于:針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)獲取的該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼;根據(jù)該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的源代碼,生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件。可選地,類文件生成模塊802具體用于:針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息,利用Java字節(jié)碼操作技術(shù),生成該服務(wù)接口對(duì)應(yīng)的REST服務(wù)類的類文件。REST服務(wù)生成模塊803具體用于:向Java虛擬機(jī)加載生成的各REST服務(wù)類的類文件為對(duì)應(yīng)的REST服務(wù)類,將加載得到的各REST服務(wù)類封裝進(jìn)WinkApplication對(duì)象中;針對(duì)每一個(gè)REST服務(wù)類,通過Wink中間件,利用該REST服務(wù)類對(duì)應(yīng)的服務(wù)接口中用于定義REST服務(wù)特征的注解信息,生成該REST服務(wù)類對(duì)應(yīng)的REST服務(wù)?;谕话l(fā)明構(gòu)思,本發(fā)明實(shí)施例中還提供了一種客戶端,由于該客戶端解決問題的原理與本發(fā)明實(shí)施例提供的生成REST實(shí)現(xiàn)的方法相似,因此該客戶端的實(shí)施可以參見生成REST實(shí)現(xiàn)的方法的實(shí)施,重復(fù)之處不再贅述。圖9為本發(fā)明實(shí)施例的客戶端的結(jié)構(gòu)示意圖。如圖9所示,該客戶端具體包括:掃描模塊901,用于掃描Java應(yīng)用程序編程接口API的各服務(wù)接口,獲取每一個(gè)服務(wù)接口的接口信息,其中JavaAPI與該客戶端要調(diào)用的REST服務(wù)所在服務(wù)器上的JavaAPI相同;類文件生成模塊902,用于針對(duì)每一個(gè)服務(wù)接口,根據(jù)該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件,類文件中包括根據(jù)該服務(wù)接口的接口信息中用于定義REST服務(wù)特征的注解確定的客戶端請(qǐng)求REST服務(wù)相關(guān)參數(shù)的代碼;REST實(shí)現(xiàn)生成模塊903,用于加載生成的各REST實(shí)現(xiàn)類的類文件,生成客戶端JavaAPI的REST實(shí)現(xiàn)??蛇x地,掃描模塊901具體用于:確定JavaAPI的根節(jié)點(diǎn)服務(wù)接口為要掃描的服務(wù)接口;對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息;若獲取的服務(wù)接口對(duì)應(yīng)的接口信息中包括返回值類型為接口的方法,則根據(jù)該方法的返回值確定接下來要掃描的服務(wù)接口,并返回對(duì)要掃描的服務(wù)接口進(jìn)行掃描的步驟;否則結(jié)束掃描過程??蛇x地,對(duì)要掃描的服務(wù)接口進(jìn)行掃描,獲取服務(wù)接口對(duì)應(yīng)的接口信息包括;從Java類加載器中加載Java反射類的對(duì)象,使用Java反射類對(duì)象的方法獲取要掃描的服務(wù)接口對(duì)應(yīng)的接口信息??蛇x地,類文件生成模塊902具體用于:針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)獲取的該服務(wù)接口的接口信息生成該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼;根據(jù)所述該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的源代碼,生成與該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件??蛇x地,類文件生成模塊具體902用于:針對(duì)每一個(gè)所述服務(wù)接口,根據(jù)該服務(wù)接口對(duì)應(yīng)的接口信息,利用Java字節(jié)碼操作技術(shù),生成與該服務(wù)接口對(duì)應(yīng)的REST實(shí)現(xiàn)類的類文件。本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。