<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    當(dāng)柳上原的風(fēng)吹向天際的時候...

    真正的快樂來源于創(chuàng)造

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
    注:下文是關(guān)于WebService的一個概念和總結(jié),其中的例子來自http://www.box.net/shared/cyg98xgz78 。 如果您對WebService已經(jīng)熟悉就不用浪費時間了。

    一.什么是Web服務(wù)?

    Web服務(wù)是網(wǎng)絡(luò)化應(yīng)用程序的一種,我們可以將Web服務(wù)看成一種函數(shù)調(diào)用,只不過這個函數(shù)的實體存在于某個服務(wù)器上,而調(diào)用在客戶端進行。Web服務(wù)的思想很簡單,即服務(wù)器通過網(wǎng)絡(luò)提供Web服務(wù),其它程序可以將由Web服務(wù)器封裝的功能無縫的集成到自己的程序中去。Web服務(wù)是跨平臺跨語言的,它可以由多種語言創(chuàng)建,也可以由多種語言使用。WebService定義了一套標(biāo)準(zhǔn)的調(diào)用過程:服務(wù)器端使用WSDL來向外界描述它所提供的服務(wù),客戶端與服務(wù)器端的交互采用SOAP協(xié)議。

    二.Web服務(wù)有什么益處?
    處于這個信息化高度發(fā)展的世界,每個軟件系統(tǒng)都勢必要和別的軟件系統(tǒng)進行交互,它們可能由不同語言編寫運行在不同的服務(wù)器上,相互間的調(diào)用是一個很大的難題。Web服務(wù)就是為解決這些問題而誕生的,它的語言平臺無關(guān)性可以和任一平臺或語言的軟件進行交互,這樣,Web服務(wù)就可以像一座橋梁,可以連通信息化世界中的孤島。

    三.SOAP協(xié)議。
    在Web服務(wù)中,服務(wù)器和客戶機需要傳遞接收消息,這就需要對傳輸?shù)臄?shù)據(jù)格式采取一定的約定措施,這個約定就是SOAP協(xié)議,它的全稱是簡單對象訪問協(xié)議(Simple Object Access Protocl)。SOAP是基于XML的消息包裝器,它既包括客戶端送給服務(wù)器端希望調(diào)用的類和方法的一種消息格式,也包括服務(wù)器返回數(shù)據(jù)的消息格式。有個這個協(xié)議,服務(wù)器和客戶機就能明白對方想干什么。SOAP消息一般基于HTTP來傳輸,也可以基于其他協(xié)議。
    下面是一個客戶端向服務(wù)器發(fā)送的SOAP消息例子:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Body>
        
    <ns1:getServerPublicKey xmlns:ns1="http://heyang.com">
        
    </ns1:getServerPublicKey>
    </soap:Body>
    </soap:Envelope>
    客戶機向服務(wù)器端發(fā)送消息時,</soap:Body>中的XML包含要調(diào)用的方法和參數(shù),如上述的getServerPublicKey。

    下面是服務(wù)器反饋給客戶機的SOAP消息例子:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        
    <soap:Body>
        
    <ns1:getServerPublicKeyResponse xmlns:ns1="hello.XFire">    <ns1:out>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkSpbrSfBIIu+f4mMr7Ie2JdWCBEmlZ1mcoZ0UTNMGaVwexfRax+HC/uusXvkkdoUGYjMaiMycRsQtSOLsfKjOVY/8zBLs0tAOEVelg6MyiF3DV7PVgGEq0dpXJCz0MWFY34a1YJMbPfvPa+VpZaIFbzICUPRhVdBYPAboXthFyQIDAQAB
        
    </ns1:out>
        
    </ns1:getServerPublicKeyResponse>
        
    </soap:Body>
    </soap:Envelope>
    當(dāng)服務(wù)器端送回消息時,</soap:Body>中包含調(diào)用的結(jié)果,它可以是單個值,也可以是含有多個值的復(fù)雜數(shù)據(jù)類型。如上面的<ns1:out>中的節(jié)點值。

    另:在調(diào)試WebService程序,想要查看SOAP消息時,可以使用Apache的TCPMon工具,具體使用方法請看http://www.tkk7.com/heyang/archive/2010/12/10/340294.html.

    四.服務(wù)器端收到SOAP消息后的動作

    以XFire為例,當(dāng)一個來自客戶端的SOPA請求送達WebService服務(wù)端時,它會先送到一個Servlet(XFireConfigurableServlet)中(請參看web.xml中的配置),然后開始解析SOAP消息,再根據(jù)配置文件services.xml找到接口com.heyang.IService和具體的實現(xiàn)類com.heyang.ServiceImpl中的方法,調(diào)用函數(shù)產(chǎn)生結(jié)果,然后再包裝成SOAP消息返回。Axis的做法也是類似的。

    五.WSDL
    我們現(xiàn)在可以想到Web服務(wù)是一個對象,含有一個或多個方法。如何對一個WebService服務(wù)器能提供的方法進行說明呢?這里就要用到WSDL(Web Service Description Language),它定義了Web服務(wù)提供的可供操作的函數(shù),具體如下:
    <?xml version="1.0" encoding="UTF-8" ?>
    <wsdl:definitions targetNamespace="hello.XFire" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:tns="hello.XFire" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="hello.XFire">
    <xsd:element name="getServerPublicKey">
      
    <xsd:complexType />
      
    </xsd:element>
    <xsd:element name="getServerPublicKeyResponse">
    <xsd:complexType>
    <xsd:sequence>
      
    <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:base64Binary" />
      
    </xsd:sequence>
      
    </xsd:complexType>
      
    </xsd:element>
    <xsd:element name="getResonse">
    <xsd:complexType>
    <xsd:sequence>
      
    <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:base64Binary" />
      
    <xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="xsd:base64Binary" />
      
    </xsd:sequence>
      
    </xsd:complexType>
      
    </xsd:element>
    <xsd:element name="getResonseResponse">
    <xsd:complexType>
    <xsd:sequence>
      
    <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:base64Binary" />
      
    </xsd:sequence>
      
    </xsd:complexType>
      
    </xsd:element>
      
    </xsd:schema>
      
    </wsdl:types>
    <wsdl:message name="getServerPublicKeyRequest">
      
    <wsdl:part name="parameters" element="tns:getServerPublicKey" />
      
    </wsdl:message>
    <wsdl:message name="getResonseResponse">
      
    <wsdl:part name="parameters" element="tns:getResonseResponse" />
      
    </wsdl:message>
    <wsdl:message name="getServerPublicKeyResponse">
      
    <wsdl:part name="parameters" element="tns:getServerPublicKeyResponse" />
      
    </wsdl:message>
    <wsdl:message name="getResonseRequest">
      
    <wsdl:part name="parameters" element="tns:getResonse" />
      
    </wsdl:message>
    <wsdl:portType name="helloPortType">
    <wsdl:operation name="getServerPublicKey">
      
    <wsdl:input name="getServerPublicKeyRequest" message="tns:getServerPublicKeyRequest" />
      
    <wsdl:output name="getServerPublicKeyResponse" message="tns:getServerPublicKeyResponse" />
      
    </wsdl:operation>
    <wsdl:operation name="getResonse">
      
    <wsdl:input name="getResonseRequest" message="tns:getResonseRequest" />
      
    <wsdl:output name="getResonseResponse" message="tns:getResonseResponse" />
      
    </wsdl:operation>
      
    </wsdl:portType>
    <wsdl:binding name="helloHttpBinding" type="tns:helloPortType">
      
    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="getServerPublicKey">
      
    <wsdlsoap:operation soapAction="" />
    <wsdl:input name="getServerPublicKeyRequest">
      
    <wsdlsoap:body use="literal" />
      
    </wsdl:input>
    <wsdl:output name="getServerPublicKeyResponse">
      
    <wsdlsoap:body use="literal" />
      
    </wsdl:output>
      
    </wsdl:operation>
    <wsdl:operation name="getResonse">
      
    <wsdlsoap:operation soapAction="" />
    <wsdl:input name="getResonseRequest">
      
    <wsdlsoap:body use="literal" />
      
    </wsdl:input>
    <wsdl:output name="getResonseResponse">
      
    <wsdlsoap:body use="literal" />
      
    </wsdl:output>
      
    </wsdl:operation>
      
    </wsdl:binding>
    <wsdl:service name="hello">
    <wsdl:port name="helloHttpPort" binding="tns:helloHttpBinding">
      
    <wsdlsoap:address location="http://localhost:8080/XfireSample/services/hello" />
      
    </wsdl:port>
      
    </wsdl:service>
      
    </wsdl:definitions>
      以上內(nèi)容在瀏覽器中輸入http://localhost:8080/XfireSample/services/hello?wsdl 可以看到。

      WSDL本身比較復(fù)雜,它主要給程序看的,利用當(dāng)前大多數(shù)的Web服務(wù)工具可以生成它,而無需手工編寫它。
      WSDL的主要目的在于將自己的Web服務(wù)的所有相關(guān)內(nèi)容如提供服務(wù)的傳輸方式,服務(wù)方法接口,接口參數(shù),服務(wù)路徑等,生成相應(yīng)的完全的文檔,發(fā)布給使用者。使用者可以通過這個WSDL文檔,創(chuàng)建相應(yīng)的SOAP請求消息,通過HTTP傳遞給Web服務(wù)提供者;Web服務(wù)提供者在完成請求服務(wù)后,將SOAP返回消息傳回給請求者,服務(wù)請求者再根據(jù)WSDL文檔將SOAP返回消息解析成程序能夠理解的內(nèi)容。

    六.UDDI
    UDDI是Universal Description Discovery and Intergretion的縮寫,是一種創(chuàng)建注冊服務(wù)的規(guī)范,以便大家將自己的Web Service進行注冊發(fā)布供使用者查找。
    當(dāng)服務(wù)提供者想將自己的Web Service發(fā)布,以便外部能找到其服務(wù)時,那么服務(wù)提供這可以將自己的Web Service注冊到相應(yīng)的UDDI商用注冊網(wǎng)站。
    UDDI并非一個必須的Web Service組件,服務(wù)方完全可以不進行UDDI的注冊。因為WSDL文件中已經(jīng)給出了Web Service的地址URI,外部可以通過它進行相應(yīng)的Web Service調(diào)用.

    七.消息服務(wù)與WebService的比較

    在概念上,Web Service和消息服務(wù)它們都是傳輸數(shù)據(jù)到別的組件,都是使應(yīng)用程序之間可以進行異步通信。
    消息處理和Web Service是互補的技術(shù),消息服務(wù)明確是一項為企業(yè)內(nèi)部而不是為商業(yè)領(lǐng)域內(nèi)的應(yīng)用程序提供通信的技術(shù),使用消息處理,企業(yè)必須與共用的傳輸格式達成一致,在定義應(yīng)用程序之間傳遞的數(shù)據(jù)方面,消息具有更多的靈活性,另外,Web Service缺乏一個定義好的機制,用于確保SOAP傳輸和事務(wù)處理,這些是消息服務(wù)已經(jīng)定義好和成熟的部分。
    Web Service,是松散耦合的組件,應(yīng)用程序發(fā)送請求給它進行處理和數(shù)據(jù)服務(wù),結(jié)果返回給應(yīng)用程序繼續(xù)處理,傳輸機制是Simple Object Access Protocol(簡單對象訪問協(xié)議,SOAP),Web Service通過SOAP能有效的通過HTTP協(xié)議發(fā)送XML文檔。Web Service具有公開性,具有快速推進的標(biāo)準(zhǔn)和大量出版物與技術(shù)文檔。Web Service有潛力來連接不同的應(yīng)用程序組件,把軟件定義成服務(wù)而不是產(chǎn)品。如果應(yīng)用程序是新建的,則Web Service更為合理。

    八.使用Axis的WebService實現(xiàn)。
    以上文章是針對XFire的WS實現(xiàn),如果要用Axis的實現(xiàn),可以參考這里 http://www.tkk7.com/heyang/archive/2009/10/10/297729.htmlhttp://www.tkk7.com/heyang/archive/2009/09/29/296897.html。個人感覺XFire的方案更方便快捷,如果沒有限制的話建議使用XFire實現(xiàn)Web Service。

    好了,感謝您看到這里。
    posted on 2010-12-10 17:27 何楊 閱讀(446) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲综合最新无码专区| 亚洲国产av玩弄放荡人妇| 亚洲av午夜成人片精品电影| 91久久青青草原线免费| 国产福利免费视频| 蜜桃传媒一区二区亚洲AV| 亚洲国产电影在线观看| 亚洲成色www久久网站夜月| 国产在线观看免费不卡| 国产在线a免费观看| 亚洲午夜免费视频| 国产免费高清69式视频在线观看| 亚洲中文字幕无码中文| 久久精品国产亚洲AV网站| 亚洲国产精品专区在线观看| 国产成人免费a在线资源| 成人免费一区二区无码视频| 亚洲视频在线观看免费| 精品一区二区三区免费| 久久久久久av无码免费看大片| 特黄特色大片免费| 亚洲Av高清一区二区三区| 亚洲电影中文字幕| 亚洲va久久久噜噜噜久久男同| 亚洲国产一区视频| 亚洲熟妇少妇任你躁在线观看无码| 日韩在线天堂免费观看| 成年丰满熟妇午夜免费视频| 免费大片黄在线观看yw| 2020久久精品国产免费| xxxx日本免费| 4444www免费看| 精品国产污污免费网站aⅴ| 久久精品免费全国观看国产| 97性无码区免费| 99久久免费国产精品特黄| 免费av欧美国产在钱| 成年女人午夜毛片免费视频 | 亚洲a级在线观看| 亚洲午夜精品国产电影在线观看| 亚洲va成无码人在线观看|