描述與注冊(cè),發(fā)布Web服務(wù)(((ok了轉(zhuǎn)完了)))
2024-07-21 02:21:51
供稿:網(wǎng)友
,歡迎訪問(wèn)網(wǎng)頁(yè)設(shè)計(jì)愛(ài)好者web開(kāi)發(fā)。架構(gòu)web service: 描述與注冊(cè),發(fā)布web服務(wù)
內(nèi)容:
soap消息示例
xml schema建模
wsdl服務(wù)描述
uddi服務(wù)發(fā)布
總結(jié)
參考資料
作者簡(jiǎn)介
相關(guān)內(nèi)容:
交互界面,web服務(wù)定義的核心
實(shí)戰(zhàn)web服務(wù)
基于web服務(wù)的應(yīng)用、解決方案和開(kāi)發(fā)平臺(tái)
什么是web服務(wù)?
為什么需要web服務(wù)?
wsdl: 描述你的web服務(wù)
uddi 注冊(cè)信息的數(shù)據(jù)模型
柴曉路 ([email protected])
chief system architect
2001年9月20日
本文是架構(gòu)web服務(wù)的系列文章的第六篇,也是最后一篇,文本以前文為基礎(chǔ),在前文的應(yīng)用實(shí)例的基礎(chǔ)上,考察了發(fā)布web服務(wù)界面的整個(gè)過(guò)程:xml schema建模、wsdl發(fā)布和uddi注冊(cè)。通過(guò)本文,大家可以詳細(xì)具體地了解各個(gè)xml和web service的系列規(guī)范在web service的發(fā)布時(shí)所起的左右,對(duì)web service技術(shù)也將有一個(gè)深入的理解。
在前文中,我已經(jīng)介紹過(guò),web服務(wù)是通過(guò)soap消息調(diào)用的,通過(guò)wsdl進(jìn)行界面描述的,以及通過(guò)uddi進(jìn)行公共注冊(cè)發(fā)布的。在前一篇文章中,我已經(jīng)介紹了如何進(jìn)行soap api的消息定義,那么在本文中,我將單把save_category提出來(lái),看看在具體的實(shí)現(xiàn)上,應(yīng)當(dāng)如何對(duì)這個(gè)消息使用w3c xml schema進(jìn)行建模,如果使用wsdl將基于該消息調(diào)用的web服務(wù)進(jìn)行規(guī)范描述并交付調(diào)用者,以及如何將這個(gè)web服務(wù)連同它的wsdl規(guī)范化描述文件一起發(fā)布到uddi注冊(cè)中心中去。希望大家能通過(guò)本文的實(shí)例講解,在本系列的最后完整地了解web服務(wù)的工作原理和相關(guān)技術(shù)規(guī)范的作用。
本文所引用的資源主要包括兩類,一類是web服務(wù)的技術(shù)資源網(wǎng)站,包含了大量web服務(wù)的技術(shù)信息,另一類是web服務(wù)“stack"系列技術(shù)規(guī)范,他們是一個(gè)整體的技術(shù)體系,包括uddi、soap、wsdl、xml schema, xml等。本文的最后給出了這些資源的鏈接,有興趣的讀者可以通過(guò)這些資源鏈接找到所需的內(nèi)容。
soap消息示例
以下是一個(gè)save_category的調(diào)用例子,在例子中使用了soap http binding(使用的soap規(guī)范的版本是1.2),假設(shè)目標(biāo)web服務(wù)被部署在www.sagitta.com,而調(diào)用的web服務(wù)的入口位置將是http://www.sagitta.com/catalog/。
在這個(gè)消息中,將在一個(gè)現(xiàn)有的category中添加一個(gè)新的category和一個(gè)新的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>
該調(diào)用消息的返回消息可能是:
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兩個(gè)元素后面都帶了一個(gè)xmlns的修飾"http://www.sagitta.com/schema/"。這uri唯一表示了該元素及其所有子元素的的命名空間。同時(shí)通過(guò)這個(gè)url可以獲得這些元素的schema定義。
使用w3c xml schema描述的xml文檔的模式定義在整個(gè)web服務(wù)的技術(shù)系列中處于一個(gè)支持工具的地位。w3c xml schema是任何類型的xml文檔的建模工具。在web服務(wù)體系中,無(wú)論在soap消息的表示上,還是在wsdl的界面描述上,xml schema都是不可缺少的重要工具和底層支持。
下面我將從xml schema開(kāi)始,針對(duì)save_category這個(gè)消息(同時(shí)也對(duì)應(yīng)一個(gè)服務(wù)入口)逐一介紹如何為我們的xml消息進(jìn)行xml schema建模,如何使用wsdl將save_category這個(gè)服務(wù)入口進(jìn)行界面描述,然后將這個(gè)入口發(fā)布到uddi注冊(cè)中心中去。
xml schema建模
xml schema的文件后綴是.xsd文件,一個(gè)xml schema中的定義通常分為兩部分,型(type)定義和元素(element)定義。下面我們結(jié)合save_category具體的xml schema定義來(lái)說(shuō)明如何使用xml schema來(lái)實(shí)現(xiàn)模式定義。
在下面的xml schema文檔中,型定義包括:compliantspecbag,featurebag,parameter,parameterbag,product和category六個(gè)類型,而元素定義為save_category這一個(gè)元素。
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這個(gè)元素類型,任何使用compliantspecbag類型的元素可以包含的元素是specification,這個(gè)元素可以出現(xiàn)0次到無(wú)窮次(無(wú)限制,事實(shí)上不可能出現(xiàn)無(wú)窮次),而specification這個(gè)元素中包含一個(gè)屬性specificationkey,該屬性是必須的,同時(shí)類型為字符串(xs:string)。xs這個(gè)命名空間是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這個(gè)元素類型,任何使用featurebag類型的文檔元素可以包含的子元素是feature,而feature元素能夠出現(xiàn)0次到無(wú)窮次(無(wú)限制,事實(shí)上不可能出現(xiàn)無(wú)窮次)。該元素的內(nèi)容的類型是字符串(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這個(gè)元素類型,任何使用parameter類型的文檔元素可以包含的子元素有兩個(gè)keyname和keyvalue,它們都是必須出現(xiàn)的子元素,同時(shí)僅可出現(xiàn)一次。他們的類型也都是字符串(xs:string)。然后描述的是parameterbag元素類型,任何使用parameterbag類型的文檔元素可以包含的子元素是parameter,而這個(gè)子元素的類型是先前定義的parameter(在xml schema中,類型名和元素名的域空間是正交的,不需要考慮任何的名字重復(fù)問(wèn)題),parameter元素出現(xiàn)的次數(shù)可以是從0次到無(wú)窮次。
<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這個(gè)元素類型,任何使用product類型的文檔元素可以包含的子元素是name、description、compliantspecbag、featurebag、parameterbag。name和description元素的類型都是xs:string。而compliantspecbag、featurebag、parameterbag的類型大家通過(guò)查看這斷xml schema定義也可以很清楚地發(fā)現(xiàn)是引用了前面定義的這些類型定義。任何使用product類型的文檔元素還有兩個(gè)必須出現(xiàn)的屬性productkey和parentcategorykey,這是兩個(gè)字符串(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元素的類型都是簡(jiǎn)單類型xs:string。而category是一個(gè)遞歸元素,引用了自身這個(gè)元素類型。而product的元素類型則是前面描述好的product類型。任何使用product類型的文檔元素還有兩個(gè)必須出現(xiàn)的屬性categorykey和parentcategorykey,這是兩個(gè)字符串(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>
這是在這個(gè)schema文檔中唯一的一個(gè)元素定義,元素save_category是一個(gè)復(fù)合類型,它的元素可以有authinfo和category。其中authinfo是一個(gè)base64編碼的字符串,而category則是一個(gè)可以出現(xiàn)0次到無(wú)限次的類型為category的子元素。我們不難發(fā)現(xiàn)元素定義和類型定義的基本機(jī)制是一樣的,事實(shí)上,我們完全可以將這段定義拆分成兩段,一段為類型定義,一段為元素定義,下面給出這個(gè)等價(jià)實(shí)例,希望有助于對(duì)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" />
那為什么要采用第一種方法,而不使用第二種方法呢,原因也很簡(jiǎn)單,由于整個(gè)web服務(wù)相關(guān)的消息schema中,諸如category、product、featurebag、compliantspecbag、parameterbag這些元素都可能被復(fù)用,因此定義成類型比較合適,而save_category是一個(gè)單一的消息,不可能被其他元素復(fù)用,因此就直接定義成了元素。
</xs:schema>