描述與註冊,發布Web服務(((ok了轉完了)))

來源:互聯網
上載者:User
web|web服務 架構Web Service: 描述與註冊,發布Web服務  
  


   
內容:

SOAP訊息樣本
XML Schema建模
WSDL服務描述
UDDI服務發布
總結
參考資料
作者簡介


相關內容:

互動介面,Web服務定義的核心
實戰Web服務
基於Web服務的應用、解決方案和開發平台
什麼是Web服務?
為什麼需要Web服務?
WSDL: 描述你的Web服務
UDDI 註冊資訊的資料模型




柴曉路 (fennivel@uddi-china.org)
Chief System Architect
2001年9月20日

本文是架構Web服務的系列文章的第六篇,也是最後一篇,文本以前文為基礎,在前文的應用執行個體的基礎上,考察了發布Web服務介面的整個過程:XML Schema建模、WSDL發布和UDDI註冊。通過本文,大家可以詳細具體地瞭解各個XML和Web Service的系列規範在Web Service的發布時所起的左右,對Web Service技術也將有一個深入的理解。
在前文中,我已經介紹過,Web服務是通過SOAP訊息調用的,通過WSDL進行介面描述的,以及通過UDDI進行公用註冊發布的。在前一篇文章中,我已經介紹了如何進行SOAP API的訊息定義,那麼在本文中,我將單把save_category提出來,看看在具體的實現上,應當如何對這個訊息使用W3C XML Schema進行建模,如果使用WSDL將基於該訊息調用的Web服務進行規範描述並交付調用者,以及如何將這個Web服務連同它的WSDL正常化描述檔案一起發布到UDDI註冊中心中去。希望大家能通過本文的執行個體講解,在本系列的最後完整地瞭解Web服務的工作原理和相關技術規範的作用。

本文所引用的資源主要包括兩類,一類是Web服務的技術資源網站,包含了大量Web服務的技術資訊,另一類是Web服務“stack"系列技術規範,他們是一個整體的技術體系,包括UDDI、SOAP、WSDL、XML Schema, XML等。本文的最後給出了這些資源的連結,有興趣的讀者可以通過這些資源連結找到所需的內容。

SOAP訊息樣本

以下是一個save_category的調用例子,在例子中使用了SOAP HTTP Binding(使用的SOAP規範的版本是1.2),假設目標Web服務被部署在www.sagitta.com,而調用的Web服務的入口位置將是http://www.sagitta.com/catalog/。

在這個訊息中,將在一個現有的category中添加一個新的category和一個新的product。


POST /catalog HTTP/1.1
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "http://www.sagitta.com/catalog/"
Host: www.sagitta.com

<?xml version="1.0" encoding="UTF-8" ?>
<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope">
  <env:Body>
    <save_category xmlns="http://www.sagitta.com/schema/">
      <authInfo>5Az784kJceHCE982eB</authInfo>
      <category categoryKey="cb4e17d1-6100-47f6-a532-cd9cbd30c073" parentCategoryKey="ab4e3de1-7865-f2c1-b49a-beccbd21c072">
        <name>Consumer Electronics</name>
        <description>Product Category for Consumer Electronics </description>
        <category categoryKey="" parentCategoryKey="cb4e17d1-6100-47f6-a532-cd9cbd30c073">
          <name>SONY Consumer Electronics</name>
          <description>Sony's Product Category for Consumer Electronics</description>
        </category>
        <product productKey="" parentCategoryKey=" cb4e17d1-6100-47f6-a532-cd9cbd30c073">
          <name>DSC-S75 Digital Camera</name>
          <description>Sony's Brand-New Professional Digital Camera</description>
          <compliantSpecBag>
            <specification specificationKey="Key[USB1.1]" />
          </compliantSpecBag>
          <featureBag>
            <feature>……</feature>
            <feature>……</feature>
          </featureBag>
          <parameterBag>
            ……
          </parameterBag>
        </product>
      </category>
    </save_category>
  </env:Body>
</env:Envelope>




該調用訊息的返回訊息可能是:

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

<?xml version="1.0" encoding="UTF-8" ?>
<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope">
  <env:Body>
    <categoryList xmlns="http://www.sagitta.com/schema/">
      <category categoryKey="cb4e17d1-6100-47f6-a532-cd9cbd30c073" parentCategoryKey="ab4e3de1-7865-f2c1-b49a-beccbd21c072">
        <category categoryKey="8933aa50-3aaf-11d5-80dc-002035229c64" parentCategoryKey="cb4e17d1-6100-47f6-a532-cd9cbd30c073" />
        <product productKey="89307600-3aaf-11d5-80dc-002035229c64" parentCategoryKey="cb4e17d1-6100-47f6-a532-cd9cbd30c073" />
      </category>
    </categoryList>
  </env:Body>
</env:Envelope>




從中我們可以看到在save_category和categoryList兩個元素後面都帶了一個xmlns的修飾"http://www.sagitta.com/schema/"。這URI唯一表示了該元素及其所有子項目的的命名空間。同時通過這個URL可以獲得這些元素的Schema定義。

使用W3C XML Schema描述的XML文檔的模式定義在整個Web服務的技術系列中處於一個支援工具的地位。W3C XML Schema是任何類型的XML文檔的建模工具。在Web服務體系中,無論在SOAP訊息的表示上,還是在WSDL的介面描述上,XML Schema都是不可缺少的重要工具和底層支援。

下面我將從XML Schema開始,針對save_category這個訊息(同時也對應一個服務入口)逐一介紹如何為我們的XML訊息進行XML Schema建模,如何使用WSDL將save_category這個服務入口進行介面描述,然後將這個入口發布到UDDI註冊中心中去。

XML Schema建模

XML Schema的檔案尾碼是.xsd檔案,一個XML Schema中的定義通常分為兩部分,型(Type)定義和元素(Element)定義。下面我們結合save_category具體的XML Schema定義來說明如何使用XML Schema來實現模式定義。

在下面的XML Schema文檔中,型定義包括:compliantSpecBag,featureBag,parameter,parameterBag,product和category六個類型,而元素定義為save_category這一個元素。

save_category的XML Schema描述定義:(完整的XML Schema文檔是:sagitta.xsd)


<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">




以上是XML Schema的檔案頭。


  <xs:complexType name="compliantSpecBag">
    <xs:sequence>
      <xs:element name="specification" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="specificationKey" type="xs:string" use="required"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>




在這段Schema描述中,描述了compliantSpecBag這個元素類型,任何使用compliantSpecBag類型的元素可以包含的元素是specification,這個元素可以出現0次到無窮次(無限制,事實上不可能出現無窮次),而specification這個元素中包含一個屬性specificationKey,該屬性是必須的,同時類型為字串(xs:string)。xs這個命名空間是W3C XML Schema 2001的命名空間(namespace)。


  <xs:complexType name="featureBag">
    <xs:sequence>
      <xs:element name="feature" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>




在這裡,描述了featureBag這個元素類型,任何使用featureBag類型的文件項目可以包含的子項目是feature,而feature元素能夠出現0次到無窮次(無限制,事實上不可能出現無窮次)。該元素的內容的類型是字串(xs:string)。


  <xs:complexType name="parameter">
    <xs:sequence>
      <xs:element name="keyName" type="xs:string"/>
      <xs:element name="keyValue" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="parameterBag">
    <xs:sequence>
      <xs:element name="parameter" type="parameter" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>




這裡首先描述了parameter這個元素類型,任何使用parameter類型的文件項目可以包含的子項目有兩個keyName和keyValue,它們都是必須出現的子項目,同時僅可出現一次。他們的類型也都是字串(xs:string)。然後描述的是parameterBag元素類型,任何使用parameterBag類型的文件項目可以包含的子項目是parameter,而這個子項目的類型是先前定義的parameter(在XML Schema中,類型名和元素名的域空間是正交的,不需要考慮任何的名字重複問題),parameter元素出現的次數可以是從0次到無窮次。


  <xs:complexType name="product">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="description" type="xs:string"/>
      <xs:element name="compliantSpecBag" type="compliantSpecBag"/>
      <xs:element name="featureBag" type="featureBag"/>
      <xs:element name="parameterBag" type="parameterBag"/>
    </xs:sequence>
    <xs:attribute name="productKey" type="xs:string" use="required"/><xs:attribute name="parentCategoryKey" type="xs:string" use="required"/>
  </xs:complexType>




這裡描述了product這個元素類型,任何使用product類型的文件項目可以包含的子項目是name、description、compliantSpecBag、featureBag、parameterBag。name和description元素的類型都是xs:string。而compliantSpecBag、featureBag、parameterBag的類型大家通過查看這斷XML Schema定義也可以很清楚地發現是引用了前面定義的這些類型定義。任何使用product類型的文件項目還有兩個必須出現的屬性productKey和parentCategoryKey,這是兩個字串(xs:string)類型的屬性值,分別表示了自身元素的索引值和父輩category的索引值。


  <xs:complexType name="category">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="description" type="xs:string"/>
      <xs:element name="category" type="category" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="product" type="product" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="categoryKey" type="xs:string" use="required"/>
    <xs:attribute name="parentCategoryKey" type="xs:string" use="required"/>
  </xs:complexType>




這是category元素類型的描述,任何使用product類型的文件項目可以包含的子項目是name、description、category和product。name和description元素的類型都是簡單類型xs:string。而category是一個遞迴元素,引用了自身這個元素類型。而product的元素類型則是前面描述好的product類型。任何使用product類型的文件項目還有兩個必須出現的屬性categoryKey和parentCategoryKey,這是兩個字串(xs:string)類型的屬性值,分別表示了自身元素的索引值和父輩category的索引值。


  <xs:element name="save_category">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="authInfo" type="xs:base64Binary"/>
        <xs:element name="category" type="category" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>




這是在這個Schema文檔中唯一的一個元素定義,元素save_category是一個複合類型,它的元素可以有authInfo和category。其中authInfo是一個base64編碼的字串,而category則是一個可以出現0次到無限次的類型為category的子項目。我們不難發現元素定義和類型定義的基本機制是一樣的,事實上,我們完全可以將這段定義拆分成兩段,一段為類型定義,一段為元素定義,下面給出這個等價執行個體,希望有助於對Schema的理解。


  <xs:complexType name="save_category">
    <xs:sequence>
      <xs:element name="authInfo" type="xs:base64Binary"/>
      <xs:element name="category" type="category" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="save_category" type="save_category" />




那為什麼要採用第一種方法,而不使用第二種方法呢,原因也很簡單,由於整個Web服務相關的訊息Schema中,諸如category、product、featureBag、compliantSpecBag、parameterBag這些元素都可能被複用,因此定義成類型比較合適,而save_category是一個單一的訊息,不可能被其他元素複用,因此就直接定義成了元素。


</xs:schema>






相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。