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

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

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

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks
    http://www-128.ibm.com/developerworks/cn/webservices/ws-intwsdl/part1/

    Web 服務(wù)和 WSDL 簡介

    Bilal Siddiqui
    CEO, WAP Monster
    2001 年 11 月

    在“使用 WSDL 部署 Web 服務(wù)”系列中,Bilal 將研究創(chuàng)建、部署和發(fā)布 Web 服務(wù)的所有主要技術(shù)方面 ― 從 Web 服務(wù)描述語言(WSDL),到簡單對象訪問協(xié)議(SOAP)以及通用描述、發(fā)現(xiàn)和集成(UDDI)注冊中心。第 1 部分集中講述了 WSDL 創(chuàng)建:您將學(xué)習(xí)如何手工創(chuàng)建 WSDL 接口,然后將您的成果與 WSDL 編寫工具的輸出作比較。

    可互操作的基于 Web 分布式應(yīng)用程序的思想并非新近出現(xiàn)。僅舉一例,電子數(shù)據(jù)交換(EDI)市場需求早在 B2B 在線電子商務(wù)獲得任何有意義的實(shí)現(xiàn)之前就存在了 ― 并且隨著 B2B 電子市場的普及,互操作性已經(jīng)成為最迫切的 EDI 需求。

    以任何在線電子市場為例。存在著許多企業(yè),各自提供特有的“服務(wù)( services )”(讓我們稱之為“Web 服務(wù)( Web services )”)。在當(dāng)今的電子商務(wù)中,尚不存在一種機(jī)制,使一個業(yè)務(wù)能自動發(fā)現(xiàn)其預(yù)期伙伴提供的服務(wù)。所謂的 下一代 .com還是提供這種自動的發(fā)現(xiàn)機(jī)制。

    什么是 WSDL?
    這種新的 .com 需要一種解決方案來描述它所提供的服務(wù)(Web 服務(wù))。具體而言,這意味著您需要一種格式或某種類型的語法,使您可以通過使用它們來描述下列問題的答案:

    • 您的在線業(yè)務(wù)提供什么服務(wù)?
    • 您如何調(diào)用業(yè)務(wù)服務(wù)?
    • 當(dāng)用戶調(diào)用您的業(yè)務(wù)服務(wù)時,該業(yè)務(wù)服務(wù)需要他/她提供什么信息?
    • 用戶將如何提供這些必需信息?
    • 服務(wù)將以什么格式發(fā)送返回給用戶的信息?

    很幸運(yùn),WSDL 提供了完成所有這些作業(yè)的機(jī)制。

    WSDL 和 SOAP
    為更好理解 WSDL 是如何工作的,我將首先描述 SOAP 和 HTTP 是如何使用 WSDL 工作的。WSDL 的用途是“描述”您的 Web 服務(wù)。業(yè)務(wù)之間將通過交換 WSDL 文件來理解對方的服務(wù)。一旦知道您伙伴的服務(wù)并希望調(diào)用它們,SOAP 就派上用場了。可以將服務(wù)看作是通過 SOAP 訪問的對象。

    最有可能的情況是,您將通過因特網(wǎng)或電子郵件與潛在伙伴通信。當(dāng)然,因特網(wǎng)使用 HTTP 而電子郵件以 SMTP 方式工作,這使得 HTTP 和 SMTP 成為作為 SOAP 的“傳輸服務(wù)提供者”的有利候選人。

    WSDL 編寫
    現(xiàn)在,我將講述為 Web 服務(wù)編寫 WSDL 的過程。目的是公開現(xiàn)有的 Web 服務(wù)。您所處的情況也許就是下列情況之一:

    • 您有一個現(xiàn)存的服務(wù)(例如,一個網(wǎng)站),并希望表示它的功能性。
    • 您有一個 WSDL,并且希望依照已經(jīng)決定表示的功能性來實(shí)現(xiàn) Web服務(wù)器端的邏輯。(有些人也許會認(rèn)為這是一個不可能的方案,但是 UDDI 的指紋概念使它變得極為可能;我將在本系列的第四部分討論 UDDI)。
    • 您正在從零開始,并且既無網(wǎng)站又無 WSDL 界面。

    本文中所涵蓋的信息適用于這些可能性中的任意一種或全部。

    WSDL 編寫的四個步驟
    我將把 WSDL 編寫分成四個簡單步驟。遵循每個步驟,您的 Web 服務(wù)將準(zhǔn)備就緒用于部署。

    步驟 1:服務(wù)接口
    您將構(gòu)建一個移動電話銷售公司的服務(wù)接口作為樣本項目(我將這個服務(wù)稱為 MobilePhoneService )。該公司銷售不同型號的移動電話,所以公司 Web 服務(wù)的后端數(shù)據(jù)存儲庫中將包含一個具有兩列( model numberprice )的表格。(為了將焦點(diǎn)保持在 WSDL 本身,我保持該表格的簡單性)。有兩個關(guān)于要使用 WSDL 表示的服務(wù)的方法:

    • getListOfModels ()
    • getPrice (modelNumber)

    GetListOfModels 方法提供了一個字符串?dāng)?shù)組,其中每個字符串表示一種移動電話的型號。 GetPrice 獲得型號,然后返回它的價格。WSDL 將這些方法作為操作調(diào)用。現(xiàn)在將開始構(gòu)建“WSDL 接口文件( WSDL interface file )”。

    每個 WSDL 文件的根元素都是 <definitions> ,必須在其中提供服務(wù)的完整描述。首先,必須在 <definitions> 元素中提供各種名稱空間的聲明。三個必須做的外部名稱空間聲明是 WSDL、SOAP 和 XSD(XML 模式定義)。還有一個名稱空間 ― TNS,它指您的 MobilePhoneService(這表示 TNS(targetNamespace 的縮寫)包含專為 MobilePhoneService 定義的所有元素和屬性的名稱)。但是 WSDL 是您將在 WSDL 編寫中使用得最多的主要名稱空間。在本系列文章中使用到其它名稱空間時,我將提到它們的效用。

    關(guān)于名稱空間只要注意一點(diǎn):WSDL 廣泛地使用名稱空間這一概念。我鼓勵您到 W3C 的官方網(wǎng)站去學(xué)習(xí)關(guān)于名稱空間的更多知識(請參閱 參考資料)。WSDL 是這種思想的一種實(shí)現(xiàn),因為名稱空間提供了無限的靈活性,而這恰恰是用于電子數(shù)據(jù)交換的可移植格式所需要的。

    <definitions> 元素包含一個或多個 <portType> 元素,實(shí)際上,每個元素都是您希望表示的一系列 operation 。或者,您也可以將單個 portType 元素看作是將各種方法組成類的一個邏輯分組。例如,如果您的供應(yīng)鏈管理解決方案需要在客戶和供應(yīng)商之間進(jìn)行交互,您最可能做的是分別定義與他們交互的功能性;也就是說,您將為用戶和供應(yīng)商各定義一個 portType。應(yīng)該將每個 portType 稱為 服務(wù),因此整個 WSDL 文件將成為一個服務(wù)集合。

    必須為每個服務(wù)提供一個名稱。在本例中,僅有一個服務(wù)(因此只有一個 <portType> )。 需要使用該 portType 元素的 name 屬性為移動電話銷售服務(wù)指定名稱。

    在每個服務(wù)內(nèi)可以有幾個方法、或者 operation ,WSDL 通過 <operation> 元素來引用它們。樣本應(yīng)用程序有兩個要表示的方法: getListOfModelsgetPrice 。因此,您需要提供兩個 <operation> 元素,每個元素有一個 name 。 我已經(jīng)使用 <operation> 元素的 name 屬性命名了每個操作。

    此時,WSDL 文件看上去象 清單 1

    清單 1:定義操作
    <?xml version="1.0" encoding="UTF-8" ?>
    <definitions  name="MobilePhoneService"
         targetNamespace="www.mobilephoneservice.com/MobilePhoneService-interface"
         xmlns="http://schemas.xmlsoap.org/wsdl/"
         xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
         xmlns:tns="http://www.mobilephoneservice.com/MobilePhoneService"
         xmlns:xsd="http://www.w3.org/1999/XMLSchema">
    
         <portType name="MobilePhoneService_port">
                 <operation name="getListOfModels ">
                         .......
                         .......
                 </operation>
    
                 <operation name="getPrice">
                         .......
                             .......
                 </operation>
         </portType>
    </definitions>
    
    

    步驟 2:指定參數(shù)
    定義好操作(或方法)以后,現(xiàn)在需要指定將向它們發(fā)送和從它們返回的參數(shù)。在 WSDL 術(shù)語中,所有參數(shù)稱為“消息”。認(rèn)為您是在遞送消息而結(jié)果得到返回的消息是有用的。方法調(diào)用是這樣一種操作:它準(zhǔn)備返回“消息”來響應(yīng)進(jìn)入的消息。

    請回憶,在第一步驟中有兩個操作要表示。第一個操作 getListOfModels 不必獲得任何參數(shù)并且返回一個字符串?dāng)?shù)組,其中每個字符串表示移動電話的型號。因此,必須定義一個包含字符串?dāng)?shù)組的 <message> 元素。

    看看 清單 2 中的各種 <message> 元素。其中的第一個元素有一個等于 ListOfPhoneModels 的名稱屬性(該消息的邏輯名稱),以及名稱為 models 的單個 <part> 元素,這意味著該 ListOfPhoneModels 是一個“只含有一個 part 的”消息,其中僅有的這個 part 的名稱是“models”。消息可以有任意多個 part ― 只要為它們起不同的名稱,以唯一標(biāo)識。

    我已包括了 <part> 元素的另一個屬性,它就是 type 。將這個“type”屬性當(dāng)作 C++ 或 Java 中的數(shù)據(jù)類型。我已經(jīng)將 models 的數(shù)據(jù)類型指定為 tns:Vector。(請回憶,我在 <definitions> 根元素中指定了一些名稱空間,其中之一是 tns 。)這個類型即指 MobilePhoneService 名稱空間。這意味著當(dāng)編寫 WSDL 時,您可以創(chuàng)建自己的名稱空間。現(xiàn)在您也許會問兩個邏輯問題:為什么?和怎么做?

    要回答 為什么,讓我們以 getListOfModels 操作返回的字符串?dāng)?shù)組為例。WSDL 使用 XML 模式定義(XSD)定義的一些原始數(shù)據(jù)類型(諸如 int、float、long、short、byte、string、Boolean 等等),并允許您直接使用它們,或者以這些原始數(shù)據(jù)類型構(gòu)建復(fù)雜數(shù)據(jù)類型后,在消息中使用它們。這就是為什么當(dāng)引用復(fù)雜數(shù)據(jù)類型時,您需要定義自己的名稱空間。在本例中,需要為 array of strings 構(gòu)建一個復(fù)雜數(shù)據(jù)類型。

    現(xiàn)在來看 怎么做問題,您將使用 XSD 創(chuàng)建自己的名稱空間。為實(shí)現(xiàn)這個目的,我在 <types> 元素中使用了 xsd:complexType 元素用來定義稱為 Vector 的數(shù)據(jù)類型。 Vector 使用兩個原始數(shù)據(jù)類型:string(元素數(shù)據(jù))和 Integer(元素計數(shù))。因此, Vector 成為名稱空間的一部分并可以通過別名 tns 來引用。

    清單 2 中,我以類似的方式定義了另外兩個消息 PhoneModelPhoneModelPrice 。這兩個消息只使用了 xsd 名稱空間中的原始數(shù)據(jù)類型 string,因此您不必為使用它們而定義任何更復(fù)雜的數(shù)據(jù)類型。

    您也許已經(jīng)注意到當(dāng)創(chuàng)建 <message> 元素時,沒有指定這些消息是進(jìn)入?yún)?shù)還是返回值。這是一個您將在 <portType> 元素內(nèi)的 <operation> 元素中完成的工作。因此,正如您在 清單 2 中所看到的,我已經(jīng)將 <input><output> 元素都添加到這兩個操作中。每個 input 元素通過消息名來引用它并將它當(dāng)作用戶調(diào)用該操作時要提供的參數(shù)。類似地,每個 <output> 元素引用一個消息;它將該消息當(dāng)作操作調(diào)用的返回值。

    至今, 清單 2準(zhǔn)確地限定了目前的討論的范圍。

    步驟 3:消息傳遞和傳輸
    我以一種抽象方式定義了操作和消息,而不考慮實(shí)現(xiàn)的細(xì)節(jié)。實(shí)際上,WSDL 的任務(wù)是定義或描述 Web 服務(wù),然后提供一個對外部框架的引用來定義 WSDL 用戶將如何實(shí)現(xiàn)這些服務(wù)。可以將這個框架當(dāng)作 WSDL 抽象定義和它們的實(shí)現(xiàn)之間的“綁定( binding )”。

    當(dāng)前,最流行的綁定( binding )技術(shù)是使用簡單對象訪問協(xié)議(SOAP)。WSDL 將指定能夠訪問 Web 服務(wù)實(shí)際實(shí)現(xiàn)的 SOAP 服務(wù)器,并且從那時起 SOAP 的整個任務(wù)就是將用戶從 WSDL 文件帶到它的實(shí)現(xiàn)。SOAP 是本系列文章中下一部分的主題,所以我將暫時避免討論 SOAP 細(xì)節(jié)而繼續(xù)集中講述 WSDL 編寫。

    WSDL 編寫的第三個步驟是描述將 SOAP 與 WSDL 文件綁定到一起的過程。您將把 <binding> 元素包括到 <definitions> 元素內(nèi)。這個 binding 元素應(yīng)該有 nametype 屬性。 name 將標(biāo)識這個綁定而 type 將標(biāo)識您希望與這個綁定相關(guān)聯(lián)的 portType(一組操作)。在 清單 3 中,您會發(fā)現(xiàn) <portType> 元素的 name<binding> 元素的 type 屬性值相匹配。

    WSDL binding 元素包含您將用于綁定用途的外部技術(shù)的聲明。因為正在使用 SOAP,所以這里將使用 SOAP 的名稱空間。WSDL 術(shù)語中,對外部名稱空間的使用稱為 extensibility 元素。

    清單 3 中,您將看見一個空的 <soap:binding/> 元素。該元素的用途是聲明將把 SOAP 作為綁定和傳輸服務(wù)使用。

    <soap:binding> 元素有兩個屬性:style 和 transport。style 是一個可選屬性,它描述該綁定內(nèi)操作的性質(zhì)。transport 屬性指定 HTTP 作為該綁定將使用的級別較低的傳輸服務(wù)。

    SOAP 客戶機(jī)將從 WSDL 文件中讀取 SOAP 結(jié)構(gòu)并與另一端的 SOAP 服務(wù)器協(xié)調(diào),所以必須特別關(guān)注 interoperability 。我打算在本系列文章的第三部分詳細(xì)講述該問題。

    在空的 <soap:binding/> 元素后面,有兩個 WSDL <operation> 元素,分別表示步驟 1 的操作。每個 <operation> 元素提供各自操作的綁定細(xì)節(jié)。因此,我提供了另一個 extensibility 元素,即 <soap:operation/> (仍然是一個空元素,與它發(fā)生的那個操作相關(guān))。該 <soap:operation/> 元素有一個 soapAction 屬性,SOAP 客戶機(jī)將使用該屬性創(chuàng)建 SOAP 請求。

    請回憶步驟 2 中, getListOfModels 操作只有輸出而無任何輸入。因此,必須為該操作提供一個 <output> 元素。該輸出包含 <soap:body/> 元素(仍然是一個空元素,與它發(fā)生的那個操作相關(guān))。SOAP 客戶機(jī)需要該信息來創(chuàng)建 SOAP 請求。 <soap:body/> 的名稱空間屬性值應(yīng)該與您將部署到 SOAP 服務(wù)器上的 service 的名稱相對應(yīng),SOAP 服務(wù)器將在在本系列文章的下一部分中講述。

    您已幾乎要完成步驟 3 了。只要將下一個操作復(fù)制到這個操作的后面,您將完成 清單 3

    步驟 4:概括
    您已經(jīng)生成了一個完整描述服務(wù) interface 的 WSDL 文件。現(xiàn)在,WSDL 需要一個附加步驟來創(chuàng)建該 WSDL 文件的概要。WSDL 將該文件稱為 implementation 文件,在本系列文章的第四部分中,當(dāng)您在 UDDI 注冊中心發(fā)布 Web 服務(wù)時,會使用它。請看 清單 4― 這個 WSDL 實(shí)現(xiàn)文件。它的主要特性如下:

    • 除了
      清單 4(實(shí)現(xiàn)文件)引用不同的 targetNamespace 去引用實(shí)現(xiàn)文件以外, <definitions> 根元素和 清單 3(WSDL 接口文件)中的完全相同。
    • 有一個
      <import> 元素,該元素引用 清單 3的接口文件(文件名 MobilePhoneService-interface.wsdl)和它的名稱空間。
    • 有一個
      <service> 標(biāo)記,其中有一個表示該服務(wù)的邏輯名 name 。在 service 元素內(nèi)有一個引用在 清單 3中創(chuàng)建的 SOAP 綁定的 port 元素。

    將 IBM 的 Web Services ToolKit(WSTK)用于 WSDL 編寫
    現(xiàn)在,Web 服務(wù)已經(jīng)完全就緒用于部署。我已經(jīng)展示了如何手工創(chuàng)建這些文件(使用象 emacs 這樣的簡單文本編輯器)。可以使用諸如 IBM 的 WSTK(請參閱 參考資料以獲得該工具箱以及本文提到的其它參考資料的鏈接)之類的 Web 服務(wù)編寫工具來生成相同的這些文件。

    WSTK 可以使用向?qū)椭^程來生成這些文件。用戶可以生成與我在以上教程中演示的同樣兩種方法的 WSDL 文件,并將 WSTK 文件和 清單 34中的 WSDL 文件作比較。

    您將注意到下列差異:

    • WSTK
      依照邏輯規(guī)則創(chuàng)建了所有名稱屬性;在本示例中,我使用了自己視為方便的名稱。
    • WSTK 為每個操作至少生成一個 input
      標(biāo)記,即使該操作不必獲得任何輸入。 listAllPhoneModels 操作沒有任何 input 元素,但是如果使用 WSTK 生成相同文件,它將因為包含這個方法的一個空 input 元素。
    • WSTK 產(chǎn)生了除已生成的兩個文件以外的第三個文件。這第三個文件是
      SOAP 引擎用于服務(wù)部署的 SOAP 部署描述符。我將在本系列文章中討論服務(wù)部署。

    在這部分中,我演示了手工進(jìn)行 WSDL 編寫以創(chuàng)建接口和實(shí)現(xiàn)文件,并與 IBM 的 Web Services ToolKit 生成的文件作了比較。在本系列的下一部分中,我將討論在 SOAP 服務(wù)器上部署這個 WSDL 服務(wù)。

    參考資料

    • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文.

    • 請訪問 W3C 的官方網(wǎng)站以查找 Web 服務(wù)描述語言(WSDL)1.1 規(guī)范以及所有其它 XML 相關(guān)的官方規(guī)范,包括 XSD 和名稱空間的技術(shù)文檔。

    • 請訪問 IBM 的 alphaWorks網(wǎng)站以下載本文中使用的 Web Services ToolKit(WSTK)。

    • 請從 Apache.org下載 Apache 的 SOAP 工具箱。 Building Web Services:Making Sense of XML, SOAP, WSDL, and UDDI是一本新書,其作者是 Steve Graham、Simeon Simeonov、Toufic Boubez、Glen Daniels、Doug Davis、Yuichi Nakamura 和 Ryo Neyama ― 一群來自 Web 服務(wù)技術(shù)領(lǐng)域各處的人。(Sams 出版,2001)。

    • 請閱讀這篇 developerWorks 上的文章,它描述了如何將 WSDL 元素映射到 UDDI 注冊中心。

    • 請訪問 WebServicesArchitect.com以獲得關(guān)于 Web 服務(wù)的好文章。

    關(guān)于作者
    Bilal Siddiqui 是一位 XML 顧問。自從 1995 年畢業(yè)于拉合爾工程技術(shù)大學(xué)(University of Engineering and Technology,Lahore)電子工程專業(yè)以后,他就開始為工業(yè)控制系統(tǒng)設(shè)計各種軟件解決方案。稍后,他致力于 XML 方面并使用他在 C++ 編程中取得的經(jīng)驗來構(gòu)建基于 Web 和 WAP 的 XML 處理工具、服務(wù)器端解析方案和服務(wù)應(yīng)用程序。可以通過電子郵件( wap_monster@yahoo.com)向 Bilal 索取本文中包含的代碼文件的工作副本。
    posted on 2005-05-09 09:42 笨笨 閱讀(219) 評論(0)  編輯  收藏 所屬分類: J2EEALL
    主站蜘蛛池模板: 亚洲三级高清免费| 国产亚洲精品VA片在线播放| 无套内射无矿码免费看黄| 狠狠色香婷婷久久亚洲精品| 91在线老王精品免费播放| 毛片大全免费观看| 亚洲一卡2卡3卡4卡乱码 在线| 无码区日韩特区永久免费系列 | 香蕉蕉亚亚洲aav综合| 爽爽爽爽爽爽爽成人免费观看| 国产高清不卡免费在线| 亚洲国产福利精品一区二区| 国产乱子精品免费视观看片| 亚洲精品第一综合99久久| 色吊丝永久在线观看最新免费| 特级毛片A级毛片100免费播放 | 亚洲GV天堂无码男同在线观看| 中国一级特黄的片子免费| 亚洲成在人线av| 99亚洲乱人伦aⅴ精品| 99久久久国产精品免费蜜臀| 亚洲成人黄色在线| 日本免费人成黄页在线观看视频 | 国产在线观看免费视频播放器| 美女无遮挡免费视频网站| 亚洲午夜久久久久久噜噜噜| 69视频在线观看免费| 亚洲午夜无码久久久久小说 | 亚洲日韩国产AV无码无码精品| 免费国产不卡午夜福在线| 亚洲狠狠婷婷综合久久蜜芽| 亚洲国产精品自产在线播放| 亚洲人成网国产最新在线| 四虎永久免费影院| 麻豆精品成人免费国产片| 国产亚洲精品无码专区| 精品无码人妻一区二区免费蜜桃| 亚洲中文字幕无码av| 亚洲一区二区三区无码中文字幕| 国产乱码免费卡1卡二卡3卡| 九一在线完整视频免费观看|