posts - 297,  comments - 1618,  trackbacks - 0
           

          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)記語言)、XSDXML 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,有的使用phpC#asp。當(dāng)各種系統(tǒng)之間需要交互時(shí),可使用各種語言都通用的WSDL定義接口,對(duì)外將需要的接口暴露給指定的客戶。

          XML Web services 提供了在松耦合環(huán)境中使用標(biāo)準(zhǔn)協(xié)議(HTTPXMLSOAP 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è)接口說明書叫WSDLWeb服務(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ì)DCOMCORBA熟悉。它還支持Document-style應(yīng)用程序(SOAP消息只包含XML文本信息)。Document-style應(yīng)用程序有很好的靈活性,所以很多用RPC很難構(gòu)建的Web Service用這種方式構(gòu)建。 

          最后SOAP規(guī)范還定義了HTTP消息是怎樣傳輸SOAP消息的。這并不代表SOAP只能用HTTP來作為傳輸協(xié)議,MSMQSMTPTCP/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消息和這些消息是怎樣交換的。IDLInterface Description Language,接口描述語言)是用于COMCORBA的,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

          XMLExtensible Markup Language)即可擴(kuò)展標(biāo)記語言,它與HTML一樣,都是SGML(Standard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語言)。在Web Service接口中,WSDLUDDI目錄文件都是一種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ù)組定義的腳本:

          modlist = [
          {"modname": "mod1", "usernum": 200, "url": "/widget/info/1"},
          {"modname": "mod2", "usernum": 300, "url" : "/widget/info/2"},

          ];

          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代碼參考如下:

          <%@ 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">&nbsp;</span></td>
                          
          </tr>
                          
          <tr>
                              
          <td>當(dāng)前點(diǎn)數(shù): </td>
                              
          <td><span id="currentPoint">&nbsp;</span></td>
                          
          </tr>
                          
          <tr>
                              
          <td>當(dāng)前價(jià)格: </td>
                              
          <td><span id="currentPrice">&nbsp;</span></td>
                          
          </tr>
                          
          <tr>
                              
          <td>漲跌率: </td>
                              
          <td><span id="ratio">&nbsp;</span></td>
                          
          </tr>
                          
          <tr>
                              
          <td>成交額(w): </td>
                              
          <td><span id=turnVolume>&nbsp;</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線&nbsp;&nbsp;&nbsp;0返回</b></font>
                                  
          </span>
                              
          </td>
                          
          </tr>
                      
          </table>
                  
          </div>
                  
          <script language="javascript">
                  
          <!--
                  
          // 查詢結(jié)果的格式為:指數(shù)名稱,當(dāng)前點(diǎn)數(shù),當(dāng)前價(jià)格,漲跌率,成交量(手),成交額(萬元)
                  // 解析字符串
                  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>

          帶上6stockId參數(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>

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

          var stockValue = hq_str_s_sh<%=stockId %>;
             2.2.2 對(duì)外提供js接口
           

          對(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)容如下:

          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 接口方式說明和優(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文件代碼如下:

          <!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>

          訪問該頁(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)用過程中,可以是ServletAction的訪問地址,在這個(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如下所示:

          <%@ 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ù)訪問這個(gè)地址,可看到參考的結(jié)果信息,例如訪問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跨域問題》:

          http://www.yaronspace.cn/blog/index.php/archives/542

          posted on 2010-12-21 17:24 阿蜜果 閱讀(8738) 評(píng)論(3)  編輯  收藏 所屬分類: Java解決方案


          FeedBack:
          # re: Java Web系統(tǒng)常用的第三方接口[未登錄]
          2010-12-22 14:26 | abc
          不錯(cuò)。標(biāo)題有點(diǎn)大了,歡迎再補(bǔ)充其他的接口。  回復(fù)  更多評(píng)論
            
          # re: Java Web系統(tǒng)常用的第三方接口
          2010-12-22 14:54 | 阿蜜果
          @abc
          是從word上拷貝過來的,就變成這樣了,等全部寫的差不多了提供個(gè)word下載吧。  回復(fù)  更多評(píng)論
            
          # re: Java Web系統(tǒng)常用的第三方接口
          2010-12-23 20:32 | 何楊
          好!有空來細(xì)讀。  回復(fù)  更多評(píng)論
            
          <2010年12月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊(cè)

          關(guān)注blog

          積分與排名

          • 積分 - 2295929
          • 排名 - 3

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 宣威市| 井研县| 横山县| 通榆县| 景泰县| 康乐县| 朝阳区| 普陀区| 重庆市| 白山市| 车致| 济阳县| 尼玛县| 沧州市| 利辛县| 和政县| 武安市| 乌海市| 三明市| 新沂市| 卓资县| 宿松县| 大安市| 祁连县| 仁寿县| 开原市| 沽源县| 冀州市| 都江堰市| 偏关县| 余庆县| 遂平县| 额济纳旗| 普兰县| 尉氏县| 西盟| 靖安县| 潼南县| 双桥区| 云和县| 缙云县|