首页 > 开发 > 综合 > 正文

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

2024-07-21 02:21:51
字体:
来源:转载
供稿:网友
,欢迎访问网页设计爱好者web开发。架构web service: 描述与注册,发布web服务  
  


   
内容:

soap消息示例
xml schema建模
wsdl服务描述
uddi服务发布
总结
参考资料
作者简介


相关内容:

交互界面,web服务定义的核心
实战web服务
基于web服务的应用、解决方案和开发平台
什么是web服务?
为什么需要web服务?
wsdl: 描述你的web服务
uddi 注册信息的数据模型




柴晓路 ([email protected])
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>




发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表