ricegun

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            2 Posts :: 4 Stories :: 3 Comments :: 0 Trackbacks
          2009-05-11

          WSDL實例解析

          關(guān)鍵字: web service

          WSDL的主要文檔元素

          WSDL文檔可以分為兩部分。頂部分由抽象定義組成,而底部分則由具體描述組成。抽象部分以獨立于平臺和語言的方式定義SOAP消息,它們并不包含任何隨 機器或語言而變的元素。這就定義了一系列服務(wù),截然不同的應(yīng)用都可以實現(xiàn)。具體部分,如數(shù)據(jù)的序列化則歸入底部分,因為它包含具體的定義。在上述的文檔元 素中,<types>、<message>、<portType>屬于抽象定義 層,<binding>、<service>屬于具體定義層。所有的抽象可以是單獨存在于別的文件中,也可以從主文檔中導(dǎo)入。 

          WSDL文檔的結(jié)構(gòu)實例解析 
          下面我們將通過一個實際的WSDL文檔例子來詳細說明各標簽的作用及關(guān)系。

          Wsdl代碼 
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <definitions  
          3. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
          4. xmlns:tns="http://www.jsoso.com/wstest"  
          5. xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
          6. xmlns="http://schemas.xmlsoap.org/wsdl/"  
          7. targetNamespace="http://www.jsoso.com/wstest"  
          8. name="Example">  
          9. <types>  
          10. <xsd:schema>  
          11. <xsd:import  
          12. namespace="http://www.jsoso.com/wstest"  
          13. schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>  
          14. </xsd:schema>  
          15. </types>  
          16. <message name="toSayHello">  
          17. <part name="userName" type="xsd:string"></part>  
          18. </message>  
          19. <message name="toSayHelloResponse">  
          20. <part name="returnWord" type="xsd:string"></part>  
          21. </message>  
          22. <message name="sayHello">  
          23. <part name="person" type="tns:person"></part>  
          24. <part name="arg1" type="xsd:string"></part>  
          25. </message>  
          26. <message name="sayHelloResponse">  
          27. <part name="personList" type="tns:personArray"></part>  
          28. </message>  
          29. <message name="HelloException">  
          30. <part name="fault" element="tns:HelloException"></part>  
          31. </message>  
          32. <portType name="Example">  
          33. <operation name="toSayHello" parameterOrder="userName">  
          34. <input message="tns:toSayHello"></input>  
          35. <output message="tns:toSayHelloResponse"></output>  
          36. </operation>  
          37. <operation name="sayHello" parameterOrder="person arg1">  
          38. <input message="tns:sayHello"></input>  
          39. <output message="tns:sayHelloResponse"></output>  
          40. <fault message="tns:HelloException" name="HelloException"></fault>  
          41. </operation>  
          42. </portType>  
          43. <binding name="ExamplePortBinding" type="tns:Example">  
          44. <soap:binding  
          45. transport="http://schemas.xmlsoap.org/soap/http"  
          46. style="rpc"></soap:binding>  
          47. <operation name="toSayHello">  
          48. <soap:operation soapAction="sayHello"></soap:operation>  
          49. <input>  
          50. <soap:body use="literal"  
          51. namespace="http://www.jsoso.com/wstest"></soap:body>  
          52. </input>  
          53. <output>  
          54. <soap:body use="literal"  
          55. namespace="http://www.jsoso.com/wstest"></soap:body>  
          56. </output>  
          57. </operation>  
          58. <operation name="sayHello">  
          59. <soap:operation soapAction="sayHello"></soap:operation>  
          60. <input>  
          61. <soap:body use="literal"  
          62. namespace="http://www.jsoso.com/wstest"></soap:body>  
          63. </input>  
          64. <output>  
          65. <soap:body use="literal"  
          66. namespace="http://www.jsoso.com/wstest"></soap:body>  
          67. </output>  
          68. <fault name="HelloException">  
          69. <soap:fault name="HelloException" use="literal"></soap:fault>  
          70. </fault>  
          71. </operation>  
          72. </binding>  
          73. <service name="Example">  
          74. <port name="ExamplePort" binding="tns:ExamplePortBinding">  
          75. <soap:address location="http://localhost:8080/hello"></soap:address>  
          76. </port>  
          77. </service>  
          78. </definitions>  

           

          由于上面的事例XML較長,我們將其逐段分解講解

           

          WSDL文檔的根元素:<definitions>

          Xml代碼 
          1. <definitions  
          2. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
          3. xmlns:tns="http://www.jsoso.com/wstest"  
          4. xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
          5. xmlns="http://schemas.xmlsoap.org/wsdl/"  
          6. targetNamespace="http://www.jsoso.com/wstest"  
          7. name="Example">  
          8. ……  
          9. ……  
          10. </definitions>  

           <definitions>定義了文檔中用到的各個xml元素的namespace縮寫,也界定了本文檔自己的 targetNamespace="http://www.jsoso.com/wstest",這意味著其它的XML要引用當前XML中的元素時,要聲 明這個namespace。注意xmlns:tns="http://www.jsoso.com/wstest"這個聲明,它標示了使用tns這個前綴 指向自身的命名空間。

           

          WSDL文檔數(shù)據(jù)類型定義元素:<types>

          Xml代碼 
          1. <types>  
          2. <xsd:schema>  
          3. <xsd:import  
          4. namespace="http://www.jsoso.com/wstest"  
          5. schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>  
          6. </xsd:schema>  
          7. </types>  

           <types>標簽定義了當前的WSDL文檔用到的數(shù)據(jù)類型。要說明的是,為了最大程度的平臺中立性,WSDL 使用 XML Schema 語法來定義數(shù)據(jù)類型。這些數(shù)據(jù)類型用來定義web service方法的參數(shù)和返回指。對于通用的原生數(shù)據(jù)類型如:integer , boolean , char , float等,在W3C的標準文檔http://www.w3.org/2001/XMLSchema中已經(jīng)做了定義。這里我們要引入的schema定義 schemaLocation="http://localhost:8080/hello?xsd=1"是我們自定義的Java對象類型。

           

          WSDL文檔消息體定義元素:< message >

          Xml代碼 
          1. <message name="toSayHello">  
          2. <part name="userName" type="xsd:string"></part>  
          3. </message>  
          4. <message name="toSayHelloResponse">  
          5. <part name="returnWord" type="xsd:string"></part>  
          6. </message>  
          7. <message name="sayHello">  
          8. <part name="person" type="tns:person"></part>  
          9. <part name="arg1" type="xsd:string"></part>  
          10. </message>  
          11. <message name="sayHelloResponse">  
          12. <part name="personList" type="tns:personArray"></part>  
          13. </message>  
          14. <message name="HelloException">  
          15. <part name="fault" element="tns:HelloException"></part>  
          16. </message>  

           <message>元素定義了web service函數(shù)的參數(shù)。<message>元素中的每個<part>子元素都和某個參數(shù)相符。輸入?yún)?shù)在<message>元素中定義,與輸出參數(shù)相 隔離,輸出參數(shù)有自己的<message>元素。兼作輸入、輸出的參數(shù)在輸入輸出的<message>元素中有它們相應(yīng)的<part>元素。輸出 <message>元素以"Response"結(jié)尾,對Java而言方法得返回值就對應(yīng)一個輸出的<message>。每個<part>元素都有名字和類 型屬性,就像函數(shù)的參數(shù)有參數(shù)名和參數(shù)類型。 

          在上面的文檔中有兩個輸入?yún)?shù)、兩個輸出參數(shù)和一個錯誤參數(shù)(對應(yīng)Java中的Exception)。 

          ? 輸入?yún)?shù)<message>的name屬性分別命名為toSayHello,sayHello。 
          toSayHello對應(yīng)輸入?yún)?shù)userName,參數(shù)類型為xsd:string,在Java語言中就是String; 
          sayHello對應(yīng)兩個輸入?yún)?shù)person和arg1,類型為tns:person和xsd:string。這里tns:person類型就是引用了< types >標簽中的類型定義。 

          ? 輸出參數(shù)<message>的name屬性分別命名為toSayHelloResponse和sayHelloResponse。 
          這個名稱和輸入?yún)?shù)的<message>標簽name屬性對應(yīng),在其后面加上Response尾綴。 
          toSayHelloResponse對應(yīng)的返回值是returnWord,參數(shù)類型為xsd:string; 
          sayHelloResponse對應(yīng)的返回值是personList,參數(shù)類型為tns:personArray(自定義類型); 

          ? 錯誤參數(shù)<message>的name屬性為HelloException。 
          它的<part>子標簽element而不是type來定義類型。 

          以上的message標簽的name屬性通常使用web service函數(shù)方法名作為參照,錯誤參數(shù)標簽則使用異常類名為參照。標簽中的參數(shù)名稱,即part子元素的name屬性是可自定義的(下一章節(jié)詳細說 明)。message標簽的參數(shù)類型將引用types標簽的定義。

           

          WSDL文檔函數(shù)體定義元素:< portType >

          Xml代碼 
          1. <portType name="Example">  
          2. <operation name="toSayHello" parameterOrder="userName">  
          3. <input message="tns:toSayHello"></input>  
          4. <output message="tns:toSayHelloResponse"></output>  
          5. </operation>  
          6. <operation name="sayHello" parameterOrder="person arg1">  
          7. <input message="tns:sayHello"></input>  
          8. <output message="tns:sayHelloResponse"></output>  
          9. <fault message="tns:HelloException" name="HelloException"></fault>  
          10. </operation>  
          11. </portType>  

           
          在<operation>元素中,name屬性表示服務(wù)方法名,parameterOrder屬性表示方法的參數(shù)順序,使用空格符分割多個參 數(shù),如:“parameterOrder="person arg1”。<operation>元素的子標簽<input>表示輸入?yún)?shù)說明,它引用<message>標簽中的輸入?yún)?數(shù)。<output>表示輸出參數(shù)說明,它引用<message>標簽中的輸出參數(shù)。<fault>標簽在Java方法中的特別 用來表示異常(其它語言有對應(yīng)的錯誤處理機制),它引用<message>標簽中的錯誤參數(shù)。 

          WSDL綁定實現(xiàn)定義元素:< binding >

          Xml代碼 
          1. <binding name="ExamplePortBinding" type="tns:Example">  
          2. <soap:binding  
          3. transport="http://schemas.xmlsoap.org/soap/http"  
          4. style="rpc"></soap:binding>  
          5. <operation name="toSayHello">  
          6. <soap:operation soapAction="sayHello"></soap:operation>  
          7. <input>  
          8. <soap:body use="literal"  
          9. namespace="http://www.jsoso.com/wstest"></soap:body>  
          10. </input>  
          11. <output>  
          12. <soap:body use="literal"  
          13. namespace="http://www.jsoso.com/wstest"></soap:body>  
          14. </output>  
          15. </operation>  
          16. <operation name="sayHello">  
          17. <soap:operation soapAction="sayHello"></soap:operation>  
          18. <input>  
          19. <soap:body use="literal"  
          20. namespace="http://www.jsoso.com/wstest"></soap:body>  
          21. </input>  
          22. <output>  
          23. <soap:body use="literal"  
          24. namespace="http://www.jsoso.com/wstest"></soap:body>  
          25. </output>  
          26. <fault name="HelloException">  
          27. <soap:fault name="HelloException" use="literal"></soap:fault>  
          28. </fault>  
          29. </operation>  
          30. </binding>  

           <binding>標簽是完整描述協(xié)議、序列化和編碼的地方,<types>,<message>和<portType>標簽處理抽象的數(shù)據(jù)內(nèi)容,而<binding>標簽是處理數(shù)據(jù)傳輸?shù)奈锢韺崿F(xiàn)。 
          <binding>標簽把前三部分的抽象定義具體化。 

          首先<binding>標簽使用<soap:binding>的transport和style屬性定義了Web Service的通訊協(xié)議HTTP和SOAP的請求風(fēng)格RPC。其次<operation>子標簽將portType中定義的 operation同SOAP的請求綁定,定義了操作名稱soapAction,輸出輸入?yún)?shù)和異常的編碼方式及命名空間。 

          WSDL服務(wù)地址綁定元素:< service >

          Xml代碼 
          1. <service name="Example">  
          2. <port name="ExamplePort" binding="tns:ExamplePortBinding">  
          3. <soap:address location="http://localhost:8080/hello"></soap:address>  
          4. </port>  
          5. </service>  

           service是一套<port>元素。在一一對應(yīng)形式下,每個<port>元素都和一個location關(guān)聯(lián)。如果同一個<binding>有多個<port>元素與之關(guān)聯(lián),可以使用額外的URL地址作為替換。 

          一個WSDL文檔中可以有多個<service>元素,而且多個<service>元素十分有用,其中之一就是可以根據(jù)目標URL來組織端口。在一個 WSDL文檔中,<service>的name屬性用來區(qū)分不同的service。在同一個service中,不同端口,使用端口的"name"屬性區(qū) 分。 

          簡單的描述了WSDL對SOAP協(xié)議的支持,以及在Web Service中的作用。

          posted on 2010-08-11 16:06 第七日 閱讀(5279) 評論(1)  編輯  收藏

          Feedback

          # re: WSDL實例解析 2011-04-25 11:55 jay_hbb
          好  回復(fù)  更多評論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 虹口区| 南部县| 彩票| 青神县| 平塘县| 新昌县| 唐海县| 泰顺县| 尖扎县| 遂川县| 雷山县| 富民县| 礼泉县| 滦南县| 镇赉县| 京山县| 临泉县| 三明市| 荣成市| 夏津县| 方山县| 彰化县| 广安市| 瓦房店市| 定远县| 台东市| 西平县| 红原县| 彰武县| 乡城县| 辛集市| 南郑县| 建平县| 万盛区| 政和县| 岳阳县| 安宁市| 蓝田县| 高陵县| 会宁县| 鹤峰县|