Java Web系統(tǒng)常用的第三方接口
編寫人:阿蜜果
日期:2010-12-21
版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處:http://www.aygfsteel.com/amigoxie/archive/2010/12/21/341257.html
1. Web Service接口
1.1 接口方式說明和優(yōu)點(diǎn)
在筆者的開發(fā)生涯中,當(dāng)作為接口提供商給第三方提供接口時(shí),以及作為客戶端去調(diào)用第三方提供的接口時(shí),大部分時(shí)候都是使用Web Service接口,Web Service作為接口使用廣泛的原因,與它的特點(diǎn)息息相關(guān)。
Web Service的主要目標(biāo)是跨平臺(tái)的可互操作性,為了實(shí)現(xiàn)這一目標(biāo),Web Service 完全基于XML(可擴(kuò)展標(biāo)記語言)、XSD(XML Schema)等獨(dú)立于平臺(tái)、獨(dú)立于軟件供應(yīng)商的標(biāo)準(zhǔn),是創(chuàng)建可互操作的、分布式應(yīng)用程序的新平臺(tái)。因此使用Web Service有許多優(yōu)點(diǎn):
1.1.1 跨防火墻的通信
如果應(yīng)用程序有成千上萬的用戶,而且分布在世界各地,那么客戶端和服務(wù)器之間的通信將是一個(gè)棘手的問題。因?yàn)榭蛻舳撕头?wù)器之間通常會(huì)有防火墻或者代理服務(wù)器。要調(diào)用Web Service,可以直接使用SOAP客戶端,然后把它和應(yīng)用程序連接起來。不僅縮短了開發(fā)周期,還減少了代碼復(fù)雜度,并能夠增強(qiáng)應(yīng)用程序的可維護(hù)性。
1.1.2 跨程序語言的應(yīng)用程序集成
在企業(yè)的各種應(yīng)用系統(tǒng)中,很多系統(tǒng)不是使用相同的語言編寫的,例如有的使用Java,有的使用php、C#、asp。當(dāng)各種系統(tǒng)之間需要交互時(shí),可使用各種語言都通用的WSDL定義接口,對(duì)外將需要的接口暴露給指定的客戶。
XML Web services 提供了在松耦合環(huán)境中使用標(biāo)準(zhǔn)協(xié)議(HTTP、XML、SOAP 和 WSDL)交換消息的能力。消息可以是結(jié)構(gòu)化的、帶類型的,也可以是松散定義的。
1.1.3 軟件和數(shù)據(jù)重用
Web Service在允許重用代碼的同時(shí),可以重用代碼背后的數(shù)據(jù)。使用Web Service,再也不必像以前那樣,要先從第三方購(gòu)買、安裝軟件組件,再?gòu)膽?yīng)用程序中調(diào)用這些組件;只需要直接調(diào)用遠(yuǎn)端的Web Service就可以了。
另一種軟件重用的情況是,把好幾個(gè)應(yīng)用程序的功能集成起來,通過Web Service “暴露”出來,就可以非常容易地把所有這些功能都集成到你的門戶站點(diǎn)中,為用戶提供一個(gè)統(tǒng)一的、友好的界面。
可以在應(yīng)用程序中使用第三方的Web Service 提供的功能,也可以把自己的應(yīng)用程序功能通過Web Service 提供給別人。兩種情況下,都可以重用代碼和代碼背后的數(shù)據(jù)。
1.2 重要概念
1.2.1 何為Web Service?
Web Service是構(gòu)建互聯(lián)網(wǎng)分布式系統(tǒng)的基本部件,它是一個(gè)應(yīng)用程序,它向外界暴露出一個(gè)能夠通過Web進(jìn)行調(diào)用的API。這就是說,別人能夠用編程的方法通過Web來調(diào)用這個(gè)應(yīng)用程序。
它通過標(biāo)準(zhǔn)通信協(xié)議,在互聯(lián)網(wǎng)上以服務(wù)的方式發(fā)布有用的程序模塊,目前大部分是用SOAP作為通信協(xié)議。
它提供一份詳細(xì)的接口說明書,來幫助用戶構(gòu)建應(yīng)用程序,這個(gè)接口說明書叫WSDL(Web服務(wù)描述語言,Web Service Description Language)。
通常已發(fā)布的Web Service要注冊(cè)到管理服務(wù)器,便于使用者查詢和使用。這個(gè)是通過UDDI(統(tǒng)一描述、發(fā)現(xiàn)和集成,Universal Discovery Description and Integration)來完成的。
1.2.2 何為SOAP協(xié)議?
SOAP定義SOAP消息的XML格式(XML格式),如果你用一對(duì)SOAP標(biāo)記(SOAP Elements)把XML文檔括起來,那么這個(gè)就是一個(gè)SOAP消息。
SOAP規(guī)范還定義了怎樣用XML來描述程序數(shù)據(jù),怎樣執(zhí)行RPC(遠(yuǎn)程過程調(diào)用,Remote Procedure Call)。大多數(shù)SOAP解決方案都支持RPC-style應(yīng)用程序,因?yàn)楹芏喑绦騿T已對(duì)DCOM或CORBA熟悉。它還支持Document-style應(yīng)用程序(SOAP消息只包含XML文本信息)。Document-style應(yīng)用程序有很好的靈活性,所以很多用RPC很難構(gòu)建的Web Service用這種方式構(gòu)建。
最后SOAP規(guī)范還定義了HTTP消息是怎樣傳輸SOAP消息的。這并不代表SOAP只能用HTTP來作為傳輸協(xié)議,MSMQ、SMTP、TCP/IP都可以做SOAP的傳輸協(xié)議。
安全性對(duì)于應(yīng)用程序來說是很重要的。那么SOAP的安全性如何呢?對(duì)于把HTTP作為傳輸協(xié)議的SOAP來說是沒有問題的,因?yàn)?/span>HTTP協(xié)議已經(jīng)有很好的安全構(gòu)架。那么用其他傳輸協(xié)議會(huì)出現(xiàn)安全問題嗎?這方面也已經(jīng)有相關(guān)規(guī)范
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnglobspec/html/ws-security.asp)。
1.2.3 何為WSDL?
WSDL是一種XML文檔,它定義SOAP消息和這些消息是怎樣交換的。IDL(Interface Description Language,接口描述語言)是用于COM和CORBA的,WSDL是用于SOAP的。WSDL是一種XML文檔,所以可以閱讀和編輯,但很多時(shí)候是用工具來創(chuàng)建、由程序閱讀。
舉個(gè)實(shí)例,當(dāng)讀者需要使用第三方的Web Service構(gòu)建應(yīng)用程序。你可以向接口提供商索取使用WSDL文檔,在該文檔中詳細(xì)的說明了各個(gè)方法的方法名、參數(shù)和參數(shù)類型等信息。在Java等編程語言的IDE(例如My Eclipse)中,可以根據(jù)Web Servie生成對(duì)應(yīng)的測(cè)試代碼,稍微修改一下即可。
1.2.4 何為UDDI?
UDDI可以比喻成電話本,電話本里記錄的是電話信息,而UDDI記錄的是Web Service信息。可以不把Web Service注冊(cè)到UDDI。但如果要讓全球的人知道這個(gè)Web Service,最好還是注冊(cè)到UDDI。
UDDI目錄說明文件也是一個(gè)XML文檔,它包括三個(gè)部分。“白頁(yè)(White Paper)”說明提供Web Service的公司(人)信息,比如說名稱、地址和聯(lián)系方式等等。“黃頁(yè)(Yellow Paper)”說明UDDI目錄的分類,比如說金融、服務(wù)和印刷等等。“綠頁(yè)(green Paper)”說明接口(Web Service 提供的)的詳細(xì)信息。 UDDI提供多種查詢方式,來幫助你找到需要的Web Service。如果你查詢與財(cái)務(wù)有關(guān)的Web Service,那么UDDI會(huì)提供詳細(xì)的信息。
1.2.5 何為XML?
XML(Extensible Markup Language)即可擴(kuò)展標(biāo)記語言,它與HTML一樣,都是SGML(Standard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語言)。在Web Service接口中,WSDL和UDDI目錄文件都是一種XML文檔,XML解決了數(shù)據(jù)表示的問題。
1.2.6 何為XSD?
XML解決了數(shù)據(jù)表示的問題,但它沒有定義一套標(biāo)準(zhǔn)的數(shù)據(jù)類型,更沒有說怎么去擴(kuò)展這套數(shù)據(jù)類型。例如,整型數(shù)到底代表什么?16位,32位,還是64位?
W3C制定的XML Schema(XSD)就是專門解決這個(gè)問題的一套標(biāo)準(zhǔn)。它定義了一套標(biāo)準(zhǔn)的數(shù)據(jù)類型,并給出了一種語言來擴(kuò)展這套數(shù)據(jù)類型。Web Service就是用XSD來作為其數(shù)據(jù)類型系統(tǒng)的。
1.3 開發(fā)Web Service接口和調(diào)用測(cè)試
在Java IDE環(huán)境中開發(fā)Web Service接口,以及如何調(diào)用第三方的WSDL文檔如何進(jìn)行接口測(cè)試的參考文章詳見:
1)《使用XFire+Spring構(gòu)建Web Service(一)——helloWorld篇》:
http://www.aygfsteel.com/amigoxie/archive/2007/09/26/148207.html
2)《使用XFire+Spring構(gòu)建Web Service(二)》:
http://www.aygfsteel.com/amigoxie/archive/2007/09/28/149074.html
3)《根據(jù)wsdl生成對(duì)應(yīng)的Java代碼進(jìn)行接口測(cè)試(一)》:
http://www.aygfsteel.com/amigoxie/archive/2009/11/20/303038.html
1.4 開發(fā)舉例
1.4.1 作為提供商提供hello world的接口
參見:《使用XFire+Spring構(gòu)建Web Service(一)——helloWorld篇》:
http://www.aygfsteel.com/amigoxie/archive/2007/09/26/148207.html
1.4.2作為提供商提供用戶信息查詢接口
參見:《使用XFire+Spring構(gòu)建Web Service(二)》:
http://www.aygfsteel.com/amigoxie/archive/2007/09/28/149074.html
2. js接口
2.1 接口方式說明和優(yōu)缺點(diǎn)
在開發(fā)的過程中,也遇到過需要調(diào)用第三方接口的情況,例如筆者在完成的一個(gè)股票查詢的小demo中,就需要調(diào)用新浪提供的股票查詢的js接口。另外有一次,在系統(tǒng)中使用了第三方的GIS系統(tǒng),調(diào)用的也是js接口。因?yàn)檎{(diào)用js接口的門檻很低,所以有的接口供應(yīng)商會(huì)提供多種調(diào)用接口的方式,例如Web Servivce接口和js接口等。
對(duì)于瀏覽器來說,script標(biāo)簽的src屬性所指向資源就跟img標(biāo)簽的src屬性所指向的資源一樣,都是一個(gè)靜態(tài)資源,瀏覽器會(huì)在適當(dāng)?shù)臅r(shí)候自動(dòng)去加 載這些資源,而不會(huì)出現(xiàn)所謂的跨域問題。這樣我們就可以通過該屬性將要訪問的數(shù)據(jù)對(duì)象引用進(jìn)當(dāng)前頁(yè)面而繞過js跨域問題。當(dāng)然,前提是接口必須是返回一段js腳本,如一個(gè)json對(duì)象數(shù)組定義的腳本:





但script標(biāo)簽也有一定的局限性,并不能解決所有js跨域問題。script標(biāo)簽的src屬性值不能動(dòng)態(tài)改變以滿足在不同條件下獲取不同數(shù)據(jù)的需求, 更重要的是,不能通過這種方式正確訪問以xml內(nèi)容方式組織的數(shù)據(jù)。
2.2 開發(fā)舉例
2.2.1 新浪股票查詢的js接口
功能說明:stockDetail.jsp根據(jù)傳入的stockId參數(shù),調(diào)用新浪股票查詢提供的js接口返回股票結(jié)果信息,并解析返回結(jié)果,將股票信息在頁(yè)面展示出來。
stockDetail.jsp代碼參考如下:












































































帶上6位stockId參數(shù)(例如:值為000002),實(shí)時(shí)的A股(代號(hào)為s_sh000002)查詢結(jié)果如下圖所示:
在文件頭部可看到如下一句引入了新浪提供的js:

用如下語句獲得通過接口查詢到的數(shù)據(jù):

對(duì)外提供js接口只需要通過<script src="..." type="..."/>請(qǐng)求的地址返回的是JSON字符串即可。
在本實(shí)例中,用到了筆者一篇JSON文章的實(shí)例(《JSON知識(shí)總結(jié)入門篇》:http://www.aygfsteel.com/amigoxie/archive/2010/09/25/332832.html),在上面進(jìn)行了小幅修改,簡(jiǎn)便起見,沒有創(chuàng)建任何的Java類,提供的對(duì)外的js接口是直接通過json.txt,通過該文件返回一個(gè)JSON字符串,在實(shí)際的應(yīng)用情況中,可以是一個(gè)Ation等。
json.txt定義了JSON格式的字符串,并定義放在json這個(gè)變量中,jsInterface.html文件請(qǐng)求遠(yuǎn)端的一個(gè)路徑,而后解析返回的JSON串,并打印出來。json.txt在遠(yuǎn)端的一個(gè)服務(wù)器上,例如該文件訪問地址為:http://test.com/json.txt,文件的內(nèi)容如下:

















在本地創(chuàng)建一個(gè)jsInterface.html網(wǎng)頁(yè),使用<script type="text/javascript" src=”…”/>請(qǐng)求返回json字符串的路徑信息,接著進(jìn)行打印,該文件代碼如下:





















3. http接口
3.1 接口方式說明和優(yōu)缺點(diǎn)
需要為第三方提供一個(gè)接口,本來打算繼續(xù)使用Web Service接口,結(jié)果那邊的開發(fā)人員說,他們沒有使用過Web Service接口(是做IPTV的一個(gè)公司),希望我們能夠提供http方式的接口。
另外我們一般在提供Web Sservice接口的同時(shí),也對(duì)外提供http接口。
3.2 開發(fā)實(shí)例
3.2.1 向http接口發(fā)送消息的使用小程序
本實(shí)例對(duì)自己提供請(qǐng)求信息為xml格式的http接口,將xml格式的請(qǐng)求信息發(fā)給http接口的地址后,將調(diào)用接口的返回消息簡(jiǎn)單的顯示在頁(yè)面,為了簡(jiǎn)便起見,筆者沒有對(duì)js代碼進(jìn)行包裝。
該html文件代碼如下:


















































































































訪問該頁(yè),頁(yè)面很簡(jiǎn)單,輸入正確的xml請(qǐng)求消息,和正確的路徑信息,點(diǎn)擊“Submit”按鈕,通過ajax調(diào)用http端口,并在成功取得信息后將返回結(jié)果顯示在最后一個(gè)文本框:
3.2.2 作為提供商提供http接口
在這個(gè)實(shí)例中,服務(wù)器提供了一個(gè)http接口,在這里是一個(gè)jsp頁(yè)面的訪問地址,實(shí)際應(yīng)用過程中,可以是Servlet或Action的訪問地址,在這個(gè)實(shí)例中,客戶端發(fā)送http get發(fā)送請(qǐng)求,帶上了hotel(賓館信息)和name(顧客姓名),http接口程序拿到參數(shù)信息后,根據(jù)一定算法檢查分配空閑房間號(hào),這里為了簡(jiǎn)便起見,只是隨機(jī)的生成一個(gè)數(shù)字返回給客戶端。http接口的簡(jiǎn)單程序httpInterface.jsp如下所示:




















可在IE上帶上參數(shù)訪問這個(gè)地址,可看到參考的結(jié)果信息,例如訪問http://IP:端口/應(yīng)用名稱/httpInterface.jsp?hotel=motel&name=amigo,參考返回結(jié)果如下:

4. 參考文章
1)《Web Service入門》:http://tech.it168.com/j/2007-09-09/200709092111735.shtml
2)《Web Service簡(jiǎn)介特點(diǎn),優(yōu)點(diǎn),缺點(diǎn)》:
http://hi.baidu.com/linjk03/blog/item/4ee93b03a5d29a8dd43f7cd5.html
3)《Web Service百度百科》:
http://baike.baidu.com/view/67105.htm
4)《如何解決js跨域問題》: