争怎路由网:是一个主要分享无线路由器安装设置经验的网站,汇总WiFi常见问题的解决方法。

描述与注册,公布Web服务(((ok了转完了)))

时间:2024/7/12作者:未知来源:争怎路由网人气:

架构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>






关键词:描述与注册,公布Web服务(((ok了转完了)))




Copyright © 2012-2018 争怎路由网(http://www.zhengzen.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版