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

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

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

    posts - 56, comments - 77, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    1. SOAP: 與 Web Service 無關(guān)

    雖然SOAP可能是為了實(shí)現(xiàn)Web Service而被發(fā)明的,但實(shí)際上它可以被用在任何需要交換數(shù)據(jù)的場(chǎng)合(SOAP is an XML-based communication protocol and encoding format for inter-application communication)

    • SOAP本身是語義獨(dú)立的,基本上只是一個(gè)信封,你可以往SOAP Header和SOAP Body里塞任何東西,也沒有什么Header元素和Body元素是SOAP本身定義的,除了SOAP Fault

    • SOAP也是與數(shù)據(jù)交換方式,或者說傳輸方式無關(guān)的,HTTP,TCP...;

    • SOAP本身也是無狀態(tài),單向的;

    讓我們比較一下SOAP和現(xiàn)實(shí)生活中的信封:

    • 信封只是一個(gè)殼,但必不可少,其作用就是讓接收者一看就知道是一封信,而不是一束花.(SOAP Envelop元素必不可少)

    • 信封對(duì)里面的信件內(nèi)容一無所知,它也沒規(guī)定里面必須是情書或者工資單. (SOAP 可以包裹任何內(nèi)容)

    • 信件可以由信封包著,交給郵局送達(dá),也可以由熟人順路帶過去. (SOAP 與傳輸方式無關(guān),HTTP, JMS, SMTP...)

    • 信件接收者可以選擇回信,也可以不回. (SOAP 是單向的)

    是的,就像<<Web Service Security>>作者的比喻,SOAP是應(yīng)用程序間的電子郵件

    正是由于SOAP的這種靈活性,許多新的規(guī)范都在SOAP的基礎(chǔ)上進(jìn)行擴(kuò)展和定制,像WS-Security, WS-Addressing等,無非就是定義了幾個(gè)標(biāo)準(zhǔn)化的SOAP Header或SOAP Body元素

    ?

    2. WSDL: 與 Runtime 無關(guān)

    WSDL是Web Service的靜態(tài)描述信息,主要是用于在客戶程序的編碼設(shè)計(jì)階段告訴客戶程序Web Service的信息,一旦客戶程序在設(shè)計(jì)階段獲得了足夠的信息,運(yùn)行時(shí)根本不需要什么WSDL

    或許某種情況下運(yùn)行時(shí)需要WSDL的幫助吧,但我沒有遇到過,如果你知道,請(qǐng)告訴我

    portType其實(shí)就是Web服務(wù)的接口,但這個(gè)名字實(shí)在不直觀,尤其對(duì)非英語國(guó)家的人來說,新版本的WSDL規(guī)范已經(jīng)將portType改名為了 “Interface”

    ?

    3. WSDL-SOAP Binding Style

    就是所謂RPC與Document或者Wrapped,Literal與Encoding

    先說Literal與Encoding

    • Literal就是不在SOAP消息中表明數(shù)據(jù)類型,而通過其它方式獲知數(shù)據(jù)類型,這種方式是開發(fā)包相關(guān)的,沒有什么標(biāo)準(zhǔn);如<x>50</x>,單從SOAP消息,你無法判斷50是數(shù)字還是字符串,而具體的類型可以在開發(fā)包將SOAP請(qǐng)求映射到具體的Service類時(shí)來確定并完成轉(zhuǎn)換,對(duì)于返回值也一樣,客戶端可已通過SetReturnValueType(...)之類的方法告知開發(fā)包自己期待什么類型

    • Encoding就是在SOAP消息中攜帶類型信息,并且依據(jù)某種規(guī)則將數(shù)據(jù)編碼傳遞,接收端可以根據(jù)類型信息和編碼規(guī)則完成解碼,獲得原始數(shù)據(jù);如<x xsi:type="xsd:string">50</x>

    再看看RPC與Document

    • RPC就是按照類似函數(shù)調(diào)用時(shí)所需的信息來組裝SOAP消息:操作名作為根元素,參數(shù)組成子元素,如:

    <envelope><body><myMethod><x>5</x><y>8</y></myMethod></body></envelope> (RPC/Literal)

    <envelope><body><myMethod><x type=string>5</x><y type=int>8</y></myMethod></body></envelope>? (RPC/Encoded)

    ?

    • Document就是將SOAP請(qǐng)求和響應(yīng),或者說輸入輸出定義為XML元素,有嚴(yán)格的Schema("document" style means the messages in and out of the service are exactly as they are describe by the XML Schema in the WSDL).如某個(gè)Web Service的WSDL片斷:

    <types>
    ??? <schema>
    ??????? <element name="xElement" type="xsd:int"/>
    ??? </schema>
    </types>


    <message name="myMethodRequest">
    ??? <part name="x"??? element="xElement"/>
    </message>
    <message name="empty"/>

    <portType name="PT">
    ??? <operation name="myMethod">
    ??????? <input message="myMethodRequest"/>
    ??????? <output message="empty"/>
    ??? </operation>
    </portType>


    則對(duì)應(yīng)的SOAP消息如下:

    <soap:envelope>
    ??? <soap:body>
    ??????? <xElement>5</xElement>
    ??? </soap:body>
    </soap:envelope>

    然而這種方式?jīng)]有在SOAP消息中包含操作名,所以如果兩個(gè)不同的操作具有相同的輸入,開發(fā)包有可能無法決定把請(qǐng)求轉(zhuǎn)發(fā)到哪個(gè)函數(shù),為避免這種情況,開發(fā)包一般為每個(gè)操作的輸入輸出都產(chǎn)生具有唯一名稱的Element,不管它們是否內(nèi)容相同;或者作為開發(fā)者,你可以選擇 Wrapped 風(fēng)格

    ?

    • Wrapped 風(fēng)格就是定義與操作同名的Element,將參數(shù)作為 Child Element;這樣操作名又重新回到了SOAP消息中,如WSDL片斷:

    <types>
    ??? <schema>???????
    ???????
    <element name="myMethod"/>
    ??????????? <complexType>
    ??????????????? <sequence>
    ??????????????????? <element name="x" type="xsd:int"/>
    ??????????????? </sequence>
    ??????????? </complexType>
    ??????? </element>

    ??? </schema>
    </types>
    <message name="myMethodRequest">
    ??? <part name="parameters" element="myMethod"/>
    </message>
    <message name="empty"/>

    <portType name="PT">
    ??? <operation name="myMethod">
    ??????? <input message="myMethodRequest"/>
    ??????? <output message="empty"/>
    ??? </operation>
    </portType>


    對(duì)應(yīng)的SOAP消息:

    <soap:envelope>
    ??? <soap:body>
    ??????? <myMethod>? <x>5</x>?? </myMethod>
    ??? </soap:body>
    </soap:envelope>

    這種方式也具有明顯的弱點(diǎn):無法方便的處理重載,因?yàn)閄ML Schema不允許定義相同名稱的元素;這樣,即使你的后臺(tái)編程語言支持函數(shù)重載,你也應(yīng)該盡量避免使用

    ?

    Document services and wrapped services are similar in that neither uses the SOAP encoding for data; it's just plain old XML schema.

    ?

    4. UDDI:與 WSDL 無關(guān)

    雖然都是描述Web Service的,但UDDI與WSDL各司其責(zé);事實(shí)上,UDDI野心太大,定義了很多社會(huì)性的Attribute,而不局限于技術(shù)性的Web服務(wù),如人工電話服務(wù)信息和傳真服務(wù)信息都可以注冊(cè)到UDDI中,描述性的東西很多(descriptive information )一些overviewURL 也都推薦指向文檔,關(guān)于這點(diǎn),參照目前UDDI的應(yīng)用情況,我認(rèn)為UDDI是過度設(shè)計(jì)了

    UDDI注冊(cè)表其實(shí)是一堆元數(shù)據(jù)的集合,元元數(shù)據(jù)...,元數(shù)據(jù)用tModel來表達(dá),可以有不同的分類,通過tModel key來引用;當(dāng)你試圖用字符串表達(dá)什么東西時(shí),你最好看看是否已經(jīng)有了對(duì)應(yīng)的tModel,有的話你就需要用對(duì)該tModel的引用來代替字符串,如在UDDI中表達(dá)一個(gè)Web Service的PortType時(shí),你不應(yīng)該在某處用字符串“PortType”來表明這是一個(gè)Port Type,你應(yīng)該引用預(yù)定義的PortType tModel來表明:

    <tModel tModelKey="uuid:e8cf1163-8234-4b35-865f-94a7322e40c3" >

    ??? <name> StockQuotePortType</name>

    ??? <overviewDoc> <overviewURL> http://location/sample.wsdl <overviewURL> <overviewDoc>

    ??? <categoryBag>

    ???????? <keyedReference tModelKey="uuid:d01987d1-ab2e-3013-9be2-2a66eb99d824"? keyName="namespace" keyValue="http://example.com/stockquote/" />

    ???????? <keyedReference tModelKey="uuid:6e090afa-33e5-36eb-81b7-1ca18373f457"? keyName="WSDL type" keyValue="portType" />

    ??? </categoryBag>

    </tModel>

    Web Service與UDDI的關(guān)系類似于COM組件服務(wù)與Windows注冊(cè)表的關(guān)系,其實(shí)它們可以看作是同一個(gè)概念的不同發(fā)展階段或不同實(shí)現(xiàn)

    而UDDI直觀的比喻可以是圖書館卡片索引,在我上中學(xué)的時(shí)候,圖書館沒有計(jì)算機(jī)供讀者查詢圖書信息,只有一柜一柜一櫥一櫥的索引卡片,記錄了圖書信息,如作者出版社等,當(dāng)然最重要的是它在書庫(kù)里的位置,第幾排第幾格

    分類體系在UDDI中占很大比重,不同的Category如傳輸協(xié)議,命名空間,WSDL Type等,每一個(gè)Entity或tModel都可以具有多個(gè)分類屬性,比如上面的StockQuotePortType tModel,按名稱空間來分,它屬于http://example.com/stockquote/,按WSDL Type來分,它屬于portType;BindingTemplate Entity還具有傳輸協(xié)議的分類,值可以是HTTP或SMTP之類

    分類體系在現(xiàn)實(shí)生活中隨處可見,比如說同一個(gè)人,按性別分是mm,按婚否分是未婚,按政治面貌分是刁民;圖書館的索引卡片上也隨處可見,按出版社分是三聯(lián),按題材分是小說,按風(fēng)格分是后現(xiàn)代等等

    ?

    5. UDDI:與WSDL 有關(guān)

    畢竟都是描述WebService的,還是有部分內(nèi)容有關(guān)系的,于是有了WSDL到UDDI的映射,這樣某些工具就可以自動(dòng)將WebService注冊(cè)到UDDI中

    大體上就是<portType>和<binding>作為tModel映射到UDDI中,<service>映射為<businessService>, <port>映射為<bindingTemplate>

    ?

    6. JAX-RPC: 首先是Java,其次才是RPC

    雖然JAX-RPC不厭其煩的表達(dá)自己支持但不依賴SOAP的特性,但支持SOAP之外的消息交換機(jī)制究竟目前有沒有具體應(yīng)用,我不知道,每個(gè)開發(fā)包也從框架上支持任意的消息交換機(jī)制,但我見過的應(yīng)用都是把它們作為SOAP引擎,如果你知道SOAP之外的消息交換機(jī)制的具體應(yīng)用,請(qǐng)告訴我

    ?


    評(píng)論

    # re: Essential Web Services: SOAP, WSDL, UDDI  回復(fù)  更多評(píng)論   

    2006-05-25 13:18 by 原創(chuàng)專欄 開源學(xué)習(xí)
    不錯(cuò)

    # re: Essential Web Services: SOAP, WSDL, UDDI  回復(fù)  更多評(píng)論   

    2006-05-25 17:12 by 切爾斯基
    see also

    http://blog.csdn.net/gongflow/archive/2006/04/01/647057.aspx

    # re: Essential Web Services: SOAP, WSDL, UDDI  回復(fù)  更多評(píng)論   

    2006-05-26 00:04 by xunliyong
    通過webservice服務(wù)提供的接口方法傳入相應(yīng)的參數(shù)后,服務(wù)端卻沒有接收到傳入的數(shù)據(jù),這是為什么

    # re: Essential Web Services: SOAP, WSDL, UDDI  回復(fù)  更多評(píng)論   

    2006-05-26 12:11 by 切爾斯基
    看看兩邊的日志吧

    # re: Essential Web Services: SOAP, WSDL, UDDI  回復(fù)  更多評(píng)論   

    2006-05-26 16:10 by xunliyong
    接口內(nèi)的方法返回值是正確的,這邊沒有出現(xiàn)錯(cuò)誤日志(客戶端),服務(wù)端是其他公司的,不知是否有日志記錄;
    想問一下,有沒有什么方法可以監(jiān)測(cè)webservice接口的運(yùn)行情況,及發(fā)送和返回信息的具體內(nèi)容;

    # re: Essential Web Services: SOAP, WSDL, UDDI  回復(fù)  更多評(píng)論   

    2006-05-26 16:18 by 切爾斯基
    既然'"服務(wù)端卻沒有接收到傳入的數(shù)據(jù)'",,那又如何會(huì)'"接口內(nèi)的方法返回值是正確的'"呢? 看來確實(shí)需要監(jiān)控工具;

    Apache的TCPMonitor不錯(cuò),,原先隨axis提供,,現(xiàn)在好像獨(dú)立出來了

    # re: Essential Web Services: SOAP, WSDL, UDDI  回復(fù)  更多評(píng)論   

    2006-05-30 18:40 by xunliyong
    服務(wù)端對(duì)我傳入數(shù)據(jù)內(nèi)容是沒有作認(rèn)證的,我是根據(jù)雙方約定的返回值來看調(diào)用情況,調(diào)用接口應(yīng)該是正常的;前期接口調(diào)用也是采用這種方法實(shí)現(xiàn)的,所以就沒有意識(shí)到會(huì)出現(xiàn)數(shù)據(jù)丟失的現(xiàn)象,具體原因,還有待高手多指點(diǎn)

    # re: Essential Web Services: SOAP, WSDL, UDDI[未登錄]  回復(fù)  更多評(píng)論   

    2007-11-06 20:19 by aaa
    我不告訴你

    # re: Essential Web Services: SOAP, WSDL, UDDI  回復(fù)  更多評(píng)論   

    2008-05-06 15:56 by me
    謝謝你啊,這個(gè)問題困擾了我一天,今天發(fā)現(xiàn)是輸入?yún)?shù)一樣,就是不知道為什么,看到你的文章才明白,謝謝

    然而這種方式?jīng)]有在SOAP消息中包含操作名,所以如果兩個(gè)不同的操作具有相同的輸入,開發(fā)包有可能無法決定把請(qǐng)求轉(zhuǎn)發(fā)到哪個(gè)函數(shù),為避免這種情況,開發(fā)包一般為每個(gè)操作的輸入輸出都產(chǎn)生具有唯一名稱的Element,不管它們是否內(nèi)容相同;或者作為開發(fā)者,你可以選擇 Wrapped 風(fēng)格

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


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 又黄又大又爽免费视频| 亚洲成AV人片在线观看无码 | 亚洲日本乱码卡2卡3卡新区| 嫩草影院免费观看| 国产免费内射又粗又爽密桃视频| 亚洲av福利无码无一区二区| 精品国产免费观看久久久| 国产在线观a免费观看| 亚洲综合av一区二区三区不卡| 亚洲深深色噜噜狠狠爱网站| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 国产亚洲精aa在线看| 国产成人亚洲精品影院| 国产成人免费在线| 国产成人1024精品免费| 亚洲激情电影在线| 亚洲精品二区国产综合野狼| 在线观看成人免费视频| 国产精品免费无遮挡无码永久视频 | 亚洲欧洲AV无码专区| 亚洲AV永久精品爱情岛论坛| 国产无遮挡吃胸膜奶免费看视频| 亚洲视频免费在线观看| 永久免费观看黄网站| 亚洲一区二区三区高清在线观看| 久久精品7亚洲午夜a| 亚洲AV无码一区二区三区国产| 免费a级毛片无码a∨蜜芽试看| 免费精品99久久国产综合精品| 特级av毛片免费观看| 亚洲人成网站999久久久综合| 亚洲国产精品久久66| 丝袜熟女国偷自产中文字幕亚洲| 在线免费观看a级片| 日本妇人成熟免费中文字幕| 久久青草91免费观看| 最新国产乱人伦偷精品免费网站| 成人在线免费视频| 久久久久久亚洲av无码蜜芽 | 亚洲视频在线观看免费| 国产拍拍拍无码视频免费|