Java Web系統(tǒng)常用的第三方接口
編寫(xiě)人:阿蜜果
日期:2010-12-21
版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處:http://www.tkk7.com/amigoxie/archive/2010/12/21/341257.html
1. Web Service接口
1.1 接口方式說(shuō)明和優(yōu)點(diǎn)
在筆者的開(kāi)發(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)記語(yǔ)言)、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àn)的用戶,而且分布在世界各地,那么客戶端和服務(wù)器之間的通信將是一個(gè)棘手的問(wèn)題。因?yàn)榭蛻舳撕头?wù)器之間通常會(huì)有防火墻或者代理服務(wù)器。要調(diào)用Web Service,可以直接使用SOAP客戶端,然后把它和應(yīng)用程序連接起來(lái)。不僅縮短了開(kāi)發(fā)周期,還減少了代碼復(fù)雜度,并能夠增強(qiáng)應(yīng)用程序的可維護(hù)性。
1.1.2 跨程序語(yǔ)言的應(yīng)用程序集成
在企業(yè)的各種應(yīng)用系統(tǒng)中,很多系統(tǒng)不是使用相同的語(yǔ)言編寫(xiě)的,例如有的使用Java,有的使用php、C#、asp。當(dāng)各種系統(tǒng)之間需要交互時(shí),可使用各種語(yǔ)言都通用的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)用程序的功能集成起來(lái),通過(guò)Web Service “暴露”出來(lái),就可以非常容易地把所有這些功能都集成到你的門戶站點(diǎn)中,為用戶提供一個(gè)統(tǒng)一的、友好的界面。
可以在應(yīng)用程序中使用第三方的Web Service 提供的功能,也可以把自己的應(yīng)用程序功能通過(guò)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è)能夠通過(guò)Web進(jìn)行調(diào)用的API。這就是說(shuō),別人能夠用編程的方法通過(guò)Web來(lái)調(diào)用這個(gè)應(yīng)用程序。
它通過(guò)標(biāo)準(zhǔn)通信協(xié)議,在互聯(lián)網(wǎng)上以服務(wù)的方式發(fā)布有用的程序模塊,目前大部分是用SOAP作為通信協(xié)議。
它提供一份詳細(xì)的接口說(shuō)明書(shū),來(lái)幫助用戶構(gòu)建應(yīng)用程序,這個(gè)接口說(shuō)明書(shū)叫WSDL(Web服務(wù)描述語(yǔ)言,Web Service Description Language)。
通常已發(fā)布的Web Service要注冊(cè)到管理服務(wù)器,便于使用者查詢和使用。這個(gè)是通過(guò)UDDI(統(tǒng)一描述、發(fā)現(xiàn)和集成,Universal Discovery Description and Integration)來(lái)完成的。
1.2.2 何為SOAP協(xié)議?
SOAP定義SOAP消息的XML格式(XML格式),如果你用一對(duì)SOAP標(biāo)記(SOAP Elements)把XML文檔括起來(lái),那么這個(gè)就是一個(gè)SOAP消息。
SOAP規(guī)范還定義了怎樣用XML來(lái)描述程序數(shù)據(jù),怎樣執(zhí)行RPC(遠(yuǎn)程過(guò)程調(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來(lái)作為傳輸協(xié)議,MSMQ、SMTP、TCP/IP都可以做SOAP的傳輸協(xié)議。
安全性對(duì)于應(yīng)用程序來(lái)說(shuō)是很重要的。那么SOAP的安全性如何呢?對(duì)于把HTTP作為傳輸協(xié)議的SOAP來(lái)說(shuō)是沒(méi)有問(wèn)題的,因?yàn)?/span>HTTP協(xié)議已經(jīng)有很好的安全構(gòu)架。那么用其他傳輸協(xié)議會(huì)出現(xiàn)安全問(wè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,接口描述語(yǔ)言)是用于COM和CORBA的,WSDL是用于SOAP的。WSDL是一種XML文檔,所以可以閱讀和編輯,但很多時(shí)候是用工具來(lái)創(chuàng)建、由程序閱讀。
舉個(gè)實(shí)例,當(dāng)讀者需要使用第三方的Web Service構(gòu)建應(yīng)用程序。你可以向接口提供商索取使用WSDL文檔,在該文檔中詳細(xì)的說(shuō)明了各個(gè)方法的方法名、參數(shù)和參數(shù)類型等信息。在Java等編程語(yǔ)言的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目錄說(shuō)明文件也是一個(gè)XML文檔,它包括三個(gè)部分。“白頁(yè)(White Paper)”說(shuō)明提供Web Service的公司(人)信息,比如說(shuō)名稱、地址和聯(lián)系方式等等。“黃頁(yè)(Yellow Paper)”說(shuō)明UDDI目錄的分類,比如說(shuō)金融、服務(wù)和印刷等等。“綠頁(yè)(green Paper)”說(shuō)明接口(Web Service 提供的)的詳細(xì)信息。 UDDI提供多種查詢方式,來(lái)幫助你找到需要的Web Service。如果你查詢與財(cái)務(wù)有關(guān)的Web Service,那么UDDI會(huì)提供詳細(xì)的信息。
1.2.5 何為XML?
XML(Extensible Markup Language)即可擴(kuò)展標(biāo)記語(yǔ)言,它與HTML一樣,都是SGML(Standard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)。在Web Service接口中,WSDL和UDDI目錄文件都是一種XML文檔,XML解決了數(shù)據(jù)表示的問(wèn)題。
1.2.6 何為XSD?
XML解決了數(shù)據(jù)表示的問(wèn)題,但它沒(méi)有定義一套標(biāo)準(zhǔn)的數(shù)據(jù)類型,更沒(méi)有說(shuō)怎么去擴(kuò)展這套數(shù)據(jù)類型。例如,整型數(shù)到底代表什么?16位,32位,還是64位?
W3C制定的XML Schema(XSD)就是專門解決這個(gè)問(wèn)題的一套標(biāo)準(zhǔn)。它定義了一套標(biāo)準(zhǔn)的數(shù)據(jù)類型,并給出了一種語(yǔ)言來(lái)擴(kuò)展這套數(shù)據(jù)類型。Web Service就是用XSD來(lái)作為其數(shù)據(jù)類型系統(tǒng)的。
1.3 開(kāi)發(fā)Web Service接口和調(diào)用測(cè)試
在Java IDE環(huán)境中開(kāi)發(fā)Web Service接口,以及如何調(diào)用第三方的WSDL文檔如何進(jìn)行接口測(cè)試的參考文章詳見(jiàn):
1)《使用XFire+Spring構(gòu)建Web Service(一)——helloWorld篇》:
http://www.tkk7.com/amigoxie/archive/2007/09/26/148207.html
2)《使用XFire+Spring構(gòu)建Web Service(二)》:
http://www.tkk7.com/amigoxie/archive/2007/09/28/149074.html
3)《根據(jù)wsdl生成對(duì)應(yīng)的Java代碼進(jìn)行接口測(cè)試(一)》:
http://www.tkk7.com/amigoxie/archive/2009/11/20/303038.html
1.4 開(kāi)發(fā)舉例
1.4.1 作為提供商提供hello world的接口
參見(jiàn):《使用XFire+Spring構(gòu)建Web Service(一)——helloWorld篇》:
http://www.tkk7.com/amigoxie/archive/2007/09/26/148207.html
1.4.2作為提供商提供用戶信息查詢接口
參見(jiàn):《使用XFire+Spring構(gòu)建Web Service(二)》:
http://www.tkk7.com/amigoxie/archive/2007/09/28/149074.html
2. js接口
2.1 接口方式說(shuō)明和優(yōu)缺點(diǎn)
在開(kāi)發(fā)的過(guò)程中,也遇到過(guò)需要調(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ì)于瀏覽器來(lái)說(shuō),script標(biāo)簽的src屬性所指向資源就跟img標(biāo)簽的src屬性所指向的資源一樣,都是一個(gè)靜態(tài)資源,瀏覽器會(huì)在適當(dāng)?shù)臅r(shí)候自動(dòng)去加 載這些資源,而不會(huì)出現(xiàn)所謂的跨域問(wèn)題。這樣我們就可以通過(guò)該屬性將要訪問(wèn)的數(shù)據(jù)對(duì)象引用進(jìn)當(dāng)前頁(yè)面而繞過(guò)js跨域問(wèn)題。當(dāng)然,前提是接口必須是返回一段js腳本,如一個(gè)json對(duì)象數(shù)組定義的腳本:
modlist = [
{"modname": "mod1", "usernum": 200, "url": "/widget/info/1"},
{"modname": "mod2", "usernum": 300, "url" : "/widget/info/2"},
…
];
但script標(biāo)簽也有一定的局限性,并不能解決所有js跨域問(wèn)題。script標(biāo)簽的src屬性值不能動(dòng)態(tài)改變以滿足在不同條件下獲取不同數(shù)據(jù)的需求, 更重要的是,不能通過(guò)這種方式正確訪問(wèn)以xml內(nèi)容方式組織的數(shù)據(jù)。
2.2 開(kāi)發(fā)舉例
2.2.1 新浪股票查詢的js接口
功能說(shuō)明:stockDetail.jsp根據(jù)傳入的stockId參數(shù),調(diào)用新浪股票查詢提供的js接口返回股票結(jié)果信息,并解析返回結(jié)果,將股票信息在頁(yè)面展示出來(lái)。
stockDetail.jsp代碼參考如下:

<%
@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<%
String stockId = request.getParameter("stockId");
if (stockId == null) {
stockId = "000001";
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>股票查詢結(jié)果</title>
<link href="<%=request.getContextPath() %>/css/style.css" type="text/css" rel="stylesheet">
<script type="text/javascript" src="http://hq.sinajs.cn/list=s_sh<%=stockId %>" charset="gb2312"></script>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body onload="">
<div class="bodyDiv">
<table>
<tr>
<td colspan="2" valign="bottom" align="left"
style="width:176px; background: url(<%=request.getContextPath() %>/images/line2_bg.gif) repeat-x;border-bottom: 1px solid #b0bec7;"
height="19">
<span class="titleFont">
<font class="newTitleFont"><b>股票查詢結(jié)果</b></font>
</span>
</td>
</tr>
<tr>
<td>指數(shù)名稱: </td>
<td><span id="stockName"> </span></td>
</tr>
<tr>
<td>當(dāng)前點(diǎn)數(shù): </td>
<td><span id="currentPoint"> </span></td>
</tr>
<tr>
<td>當(dāng)前價(jià)格: </td>
<td><span id="currentPrice"> </span></td>
</tr>
<tr>
<td>漲跌率: </td>
<td><span id="ratio"> </span></td>
</tr>
<tr>
<td>成交額(w): </td>
<td><span id=turnVolume> </span></td>
</tr>
<tr>
<td colspan="2" valign="bottom" align="right"
style="width:176px; background: url(<%=request.getContextPath() %>/images/line2_bg.gif) repeat-x;border-bottom: 1px solid #b0bec7;"
height="19">
<span class="titleFont">
<font class="newTitleFont"><b>1日K線 0返回</b></font>
</span>
</td>
</tr>
</table>
</div>

<script language="javascript">
<!--
// 查詢結(jié)果的格式為:指數(shù)名稱,當(dāng)前點(diǎn)數(shù),當(dāng)前價(jià)格,漲跌率,成交量(手),成交額(萬(wàn)元)
// 解析字符串
var stockValue = hq_str_s_sh<%=stockId %>;
var stockArray = stockValue.split(",");
document.getElementById("stockName").innerText = stockArray[0];
document.getElementById("currentPoint").innerText = stockArray[1];
document.getElementById("currentPrice").innerText = stockArray[2];
document.getElementById("ratio").innerText = stockArray[3];
document.getElementById("turnVolume").innerText = stockArray[5];
-->
</script>
</body>
</html>
帶上6位stockId參數(shù)(例如:值為000002),實(shí)時(shí)的A股(代號(hào)為s_sh000002)查詢結(jié)果如下圖所示:

在文件頭部可看到如下一句引入了新浪提供的js:
<script type="text/javascript" src="http://hq.sinajs.cn/list=s_sh<%=stockId %>" charset="gb2312"></script>
用如下語(yǔ)句獲得通過(guò)接口查詢到的數(shù)據(jù):
var stockValue = hq_str_s_sh<%=stockId %>; 2.2.2 對(duì)外提供js接口
對(duì)外提供js接口只需要通過(guò)<script src="..." type="..."/>請(qǐng)求的地址返回的是JSON字符串即可。
在本實(shí)例中,用到了筆者一篇JSON文章的實(shí)例(《JSON知識(shí)總結(jié)入門篇》:http://www.tkk7.com/amigoxie/archive/2010/09/25/332832.html),在上面進(jìn)行了小幅修改,簡(jiǎn)便起見(jiàn),沒(méi)有創(chuàng)建任何的Java類,提供的對(duì)外的js接口是直接通過(guò)json.txt,通過(guò)該文件返回一個(gè)JSON字符串,在實(shí)際的應(yīng)用情況中,可以是一個(gè)Ation等。
json.txt定義了JSON格式的字符串,并定義放在json這個(gè)變量中,jsInterface.html文件請(qǐng)求遠(yuǎn)端的一個(gè)路徑,而后解析返回的JSON串,并打印出來(lái)。json.txt在遠(yuǎn)端的一個(gè)服務(wù)器上,例如該文件訪問(wèn)地址為:http://test.com/json.txt,文件的內(nèi)容如下:
var json={
"programmers": [
{ "firstName": "阿蜜果", "lastName":"McLaughlin", "email": "brett@newInstance.com" },
{ "firstName": "范范", "lastName":"Hunter", "email": "jason@servlets.com" },
{ "firstName": "高子", "lastName":"Harold", "email": "elharo@macfaq.com" }
],
"authors": [
{ "firstName": "安安", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "茂茂", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
]
}

在本地創(chuàng)建一個(gè)jsInterface.html網(wǎng)頁(yè),使用<script type="text/javascript" src=”…”/>請(qǐng)求返回json字符串的路徑信息,接著進(jìn)行打印,該文件代碼如下:
<html>
<head>
<title>JS Interface Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="http://test.com/json.txt"></script>

<script type="text/javascript">
alert(json.programmers[0].firstName + ',' + json.programmers[0].lastName + ',' + json.programmers[0].email);
alert(json.programmers[1].firstName + ',' + json.programmers[1].lastName + ',' + json.programmers[1].email);
alert(json.programmers[2].firstName + ',' + json.programmers[2].lastName + ',' + json.programmers[2].email);
alert(json.authors[0].firstName + ',' + json.authors[0].lastName + ',' + json.authors[0].genre);
alert(json.authors[1].firstName + ',' + json.authors[1].lastName + ',' + json.authors[1].genre);
alert(json.authors[2].firstName + ',' + json.authors[2].lastName + ',' + json.authors[2].genre);
alert(json.musicians[0].firstName + ',' + json.musicians[0].lastName + ',' + json.musicians[0].instrument);
alert(json.musicians[1].firstName + ',' + json.musicians[1].lastName + ',' + json.musicians[1].instrument);
</script>
</head>
<body>
</body>
</html> 運(yùn)行后可看到運(yùn)行結(jié)果與《JSON知識(shí)總結(jié)入門篇》第一個(gè)實(shí)例的運(yùn)行結(jié)果一致。
3. http接口
3.1 接口方式說(shuō)明和優(yōu)缺點(diǎn)
需要為第三方提供一個(gè)接口,本來(lái)打算繼續(xù)使用Web Service接口,結(jié)果那邊的開(kāi)發(fā)人員說(shuō),他們沒(méi)有使用過(guò)Web Service接口(是做IPTV的一個(gè)公司),希望我們能夠提供http方式的接口。
另外我們一般在提供Web Sservice接口的同時(shí),也對(duì)外提供http接口。
3.2 開(kāi)發(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)便起見(jiàn),筆者沒(méi)有對(duì)js代碼進(jìn)行包裝。
該html文件代碼如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>http interface test</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">

<script>
// XMLHttpRequest
var http_request = false;

function send_request(method, url, content, responseType, callback)
{
http_request = false;
// XMLHttpRequest

if(window.XMLHttpRequest)
{
//Mozilla
http_request = new XMLHttpRequest();

if(http_request.overrideMimeType)
{
//MIME
http_request.overrideMimeType("text/xml");
}

} else if(window.ActiveXObject)
{
//IE

try
{
http_request = new ActiveXObject("Msxml2.XMLHTTP");

} catch (e)
{

try
{
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}

catch (e)
{}
}
}

if(!http_request)
{
window.alert("XMLHttpRequest create Error.");
return false;
}

if(responseType.toLowerCase() == "text" || responseType.toLowerCase() == "xml")
{
http_request.onreadystatechange = callback;

} else
{
window.alert("error responseType.");
return false;
}

if(method.toLowerCase() == "get")
{
http_request.open(method, url, true);

} else if(method.toLowerCase() == "post")
{
http_request.open(method, url, true);
http_request.setRequestHeader("Content-Type", "text/xml");

} else
{
window.alert("http method error.");
return false;
}
http_request.send(content);
}
function submitInfo()

{
var form = document.httpTestForm;
var pathInfo = form.pathInfo.value;
var xmlInfo = form.xmlInfo.value;
form.returnInfo.value = "wait
";
send_request("POST", pathInfo, xmlInfo, "xml", showHttpTestBack);
}

function showHttpTestBack()
{
if(http_request.readyState == 4)

{
if(http_request.status == 200)

{
var responseInfo = http_request.responseText;
var form = document.httpTestForm;
form.returnInfo.value = responseInfo;
}
}
}
</script>
</head>
<body>
<form name="httpTestForm" action="" method="post">
<table width="100%" border="1">
<tr>
<td colspan="2" align="center">
<b>http interface Test</b>
</td>
</tr>
<tr>
<td>xmlInfo:</td>
<td>
<textarea id="xmlInfo" name="xmlInfo" cols="100" rows="5"></textarea>
</td>
</tr>
<tr>
<td>pathInfo:</td>
<td>
<input type="text" name="pathInfo" value="http://192.168.2.154:16000/Mbd/http/video" size="100" />
</td>
</tr>
<tr>
<td>returnInfo:</td>
<td>
<textarea name="returnInfo" id="returnInfo" cols="100" rows="5"></textarea>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" name="submitButton1" value="Submit" onclick="javascript:submitInfo()" />
</td>
</tr>
</table>
</form>
</body>
</html>

訪問(wèn)該頁(yè),頁(yè)面很簡(jiǎn)單,輸入正確的xml請(qǐng)求消息,和正確的路徑信息,點(diǎn)擊“Submit”按鈕,通過(guò)ajax調(diào)用http端口,并在成功取得信息后將返回結(jié)果顯示在最后一個(gè)文本框:

3.2.2 作為提供商提供http接口
在這個(gè)實(shí)例中,服務(wù)器提供了一個(gè)http接口,在這里是一個(gè)jsp頁(yè)面的訪問(wèn)地址,實(shí)際應(yīng)用過(guò)程中,可以是Servlet或Action的訪問(wèn)地址,在這個(gè)實(shí)例中,客戶端發(fā)送http get發(fā)送請(qǐng)求,帶上了hotel(賓館信息)和name(顧客姓名),http接口程序拿到參數(shù)信息后,根據(jù)一定算法檢查分配空閑房間號(hào),這里為了簡(jiǎn)便起見(jiàn),只是隨機(jī)的生成一個(gè)數(shù)字返回給客戶端。http接口的簡(jiǎn)單程序httpInterface.jsp如下所示:

<%
@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<%
Double room = 500 * Math.random();
out.write("hotel=" + request.getParameter("hotel")
+ ";name=" + request.getParameter("name")
+ ";room=" + room.intValue());
out.close();
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>http Interface</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
</body>
</html>
可在IE上帶上參數(shù)訪問(wèn)這個(gè)地址,可看到參考的結(jié)果信息,例如訪問(wèn)http://IP:端口/應(yīng)用名稱/httpInterface.jsp?hotel=motel&name=amigo,參考返回結(jié)果如下:
hotel=motel;name=amigo;room=407
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跨域問(wèn)題》:
http://www.yaronspace.cn/blog/index.php/archives/542
posted on 2010-12-21 17:24
阿蜜果 閱讀(8742)
評(píng)論(3) 編輯 收藏 所屬分類:
Java 、
解決方案