Home  >  Article  >  Backend Development  >  php学习之道:WSDL详解(1)

php学习之道:WSDL详解(1)

WBOY
WBOYOriginal
2016-06-13 12:01:20967browse

php学习之道:WSDL详解(一)

WSDL文档使用web服务描述语言来定义服务。

文档包括逻辑(抽象)部分和具体部分。

抽象部分用于定义独立于实现的数据类型和消息,具体部分定义一个endpoint如何实现一个可以与外界进行交互的服务。

通常建议在写代码前定义WSDL文档和XML schema,但是这就要求对WSDL非常熟悉。

逻辑部分:

包括types,message以及portType元素。types元素中,xml schema用来定义组成消息的数据的结构。一定数量的消息元素用来定义服务所用消息的格式。portType元素包括一个或多个operation元素,用来定义被operation发送的消息。

具体部分:

包括binding和service元素。binding元素描述message元素描述的那些数据单元如何映射到一个具体的数据格式。Service元素包括一个或多个port元素,这些port元素用于定义endpoint。

总体上来说,一个WSDL文档有以下元素组成:

  • definitions--WSDL文档的根元素,该元素的属性指明了wsdl文档的名称,文档的目标名字空间,以及WSDL文档应用的名字空间的速记定义。
  • types--数据单元的xml样式定义,形成了服务所用消息的构建块。
  • portType---描述服务逻辑接口的operation元素的集合。
  • operation--一个服务包含的操作的描述,当操作被调用时,操作被定义为两个endpoint之间的消息传递。
  • binding---一个endpoint的实际数据格式说明,一个binding元素定义如何将一个抽象消息映射到一个具体数据格式。该元素指明诸如参数顺序,返回值等信息。
  • service---相关port元素的集合,这些元素被库藏,用户组织endpoint定义。
  • port--通过binding和物理地址定义的endpoint,这个元素将所有抽象定义聚集在一起。

设计一个WSDL的步骤:

1.定义服务用到的data types

2.定义服务用到的消息

3.定义服务接口

4.定义消息与接口之间的bindings和线上数据的具体呈现方式

5.定义每个服务的传输细节。

下面根据每步展开论述:

1.定义逻辑数据单元

   定义一个服务时,第一件事情,你必须考虑的是作为暴露到外部的参数所用到的数据,将怎样呈现。与那些是选用固定数据结构编码的程序不同,服务必须定义出他们的数据以逻辑单元的形式,这包括两步:

  1.1将数据拆分成逻辑单元,这些单元能被映射为数据类型,并被服务的物理实现所引用。

       如果你定义了一个服务接口,并且该接口已经实现,你必须将实现操作的数据类型转换成xml元素,用于组装成消息。如果你从头开始,你必须定义你的消息构建时用到的构建块,这样的话,他们从实施角度看才有意义。

      注1:定义服务数据单元可用的类型体系:根据WSDL规范,你可以使用任何类型体系。然而在W3C规范中定义的XML schema是首选的规范的类型体系。因此,XML架构在Apache CXF的内在类型系统。

     注2:xml schema:xml schema被用来定义一个xml文档如何构建,用于定义一个文档由哪些元素组成。这些元素可以使用xml schema类型,比如xsd:int的或者他可以使用用户定义的类型,用户定义类型也是使用xml元素的组合来构建的饿,或者他们是用严格的已存在类型构建。通过结合类型定义和元素定义,你可以创建复杂的XML文档可以包含复杂的数据。当定义服务使用的数据单元时,你可以定义他们作为类型,这些类型指明消息组成部分的结构,你也能够定义你的消息单元作为组成消息结构的元素。

    注3:生成数据单元的考虑:你可以考虑简单地生成逻辑数据单元,这些单元直接映射你在服务中使用的数据类型。当以这个方式工作时,必须紧密遵循构建RPC类型应用程序的构建模型,这不是构建面向服务架构程序必须的策略。webservice组织提供了一定数量的手册来定义数据单元,另外W3C也提供了下main的手册来教你如何使用xml schema展现数据类型。

  1.2将数据单元(data units)添加到文档

       依赖于你如何选择去生成WSDL文档,生成新的数据定义要求有大量的知识,CXF GUI工具提供一定数量的帮助来描述数据类型。其他的xml编辑器提供不同级别的帮助。不论你选择哪种编辑器,拥有一些与文档相关的知识是很重要的。

       定义WSDL中用到的数据,需以下步骤:

       a.确定接口要用到的所有数据单元

       b.在文档中生成一个types元素。

       c.创建一个schema元素,作为types元素的子元素

       d.complex类型是元素的集合,使用complexType元素来定义数据类型

       e.对于每个数组来说,定义他的数据类型也使用complexType元素

       f.对于每个复杂类型来说,都可以从简单类型衍生出来,定义数据局类型可以通过simpleType元素。

       g.对于每个枚举类型,定义数据类型使用simpleType元素。

       h.对于每个元素来说,定义他们使用element元素。

1.3 xml Schema simple types:

       如果一个消息组件是简单类型的话,那么就不需要给他定义一个类型。接口使用的复杂类型也是通过简单类型定义的。

      注1:输入简单类型:xml简单类型是主要的放置元素,在element元素中。简单类型也被使用在restriction元素和extension元素的base属性中。简单类型总是使用xsd作为前缀,例如,为了指明类型int,你将输入xsd:int在type属性中。

    CXF支持下列xml schema简单类型:xsd:string,xsd:normalizedString,xsd:int,xsd:base64Binary等。

1.4定义复杂数据类型:

     xml schema提供灵活和强大的机制来构建负责数据结构。你可以创建数据结构通过创建一个元素和属性的序列。你看可以扩展已有类型来创建更复杂的类型。

    另外,为了构建复杂数据结构,你可以描述特定的类型,诸如:枚举类型。数据类型中的数据有一个特定的取值范围,或者数据类型的数值必须遵循某种特定的模式,通过扩展或者限制原始类型。

1.5定义数据结构:

    在xml schema中,数据单元是数据域的集合,这些数据域是通过负责类型元素定义的。指明一个复杂的类型需要三块信息:

    a.复杂元素的名称需要被指定。

    b.复杂类型的第一个子元素用来描述该结构的域的行为,当他被放入线上时。

    c.每个结构中的域,都被用element元素定义。

    下面的雷子是一个复杂类型有两个子元素:

              结构如下:

<div style="text-align:left">struct personalInfo</p>{  string name;<div style="text-align:left"></p>  int age;<div style="text-align:left"></p>};

              对应的WSDL文档:

<div style="text-align:left"><complexType name="personalInfo"></p>  <sequence><div style="text-align:left">name="name" type="xsd:string" />    <element</p>    <element  name="age" type="xsd:int" />  </sequence><div style="text-align:left"></p></complexType>

注1:复杂类型的种类:

      xml schema有三种方式描述当xml文档被展现并通过线上展示时,其中的域如何被组织。第一个子元素确定哪种复杂类型被引用。下面展示了用来定义复杂类型行为的三种方式:

  • sequence:所有的复杂类型域必须被显示,并且他们必须有一个确定的次序,该次序与类型定义的次序相同。
  • all:所有的复杂类型域都需要有,但是次序无所谓
  • choice:仅仅是元素中一个可以出现在消息中。

注2:定义结构的部分:

      你定义数据域,这些数据域是由一个结构体组成。每个复杂类型元素应该包括至少一个element元素。每个element元素对应已经定义的数据结构中的一个域。

     为了充分描述数据结构中的域,element必须有两个属性:

    name属性:指明数据域的名称并且是唯一的

    type属性:指明该域存储的数据的类型。可以是简单类型也可以是复杂类型。

  除此而外还有两个重要属性:minOccurs和maxOccurs,这个属性用来设置该域在结构中发生的次数上下限。缺省情况下每个字段值发生一次。使用这些属性,你可以改变结构体中一个域发生的次数。下面的例子中,previousJobs最少发生一次,最多7次。

<div style="text-align:left"><complexType name="personalInfo></p>  <all><div style="text-align:left">ment name="name" type="xsd:string"/>    <el</p>    <eleement name="age" type="xsd:int"/><div style="text-align:left">pe="xsd:string:             minOccurs="3" maxOccu</p>    <element name="previousJobs" tyrs="7"/>  </all><div style="text-align:left"></p></complexType>

注3:定义属性:在xml文档中,属性被包含在element内部的。例如在complexType元素中name就是属性,它通常跟在等元素的后面。例如:
 

<div style="text-align:left"><complexType name="personalInfo></p>  <all><div style="text-align:left">ment name="name" type="xsd:string"/>    <el</p>    <eleement name="previousJobs" type="xsd:string"<div style="text-align:left"></all>  <attribute name="age" type="xsd:i</p>             minOccurs="3" maxOccurs="7"/>  nt" use="optional" /><div style="text-align:left"></p></complexType>

1.6定义数组
 

   CXF支持两种方式来定义数组,第一种是定义一个复杂类型,采用简单元素,他的最大发生属性是个大于1的值,第二种方式是使用SOAP数组,SOAP数组提供增加的功能,比如ability来简化定义多为数组并且发送分离后的数组。

  复合类型数组:复合类型数组是特殊的sequence复合类型。你可以简单定义一个复合类型通过简单元素,并且制定该元素的最大发生maxOccurs属性。例如,定义一个数组,拥有二个浮点数字,你可以使用复合类型如下:

<div style="text-align:left"><complexType name="personalInfo></p><div style="text-align:left">  <element name="averages" type="xsd:float" maxOccurs="20"/></p><div style="text-align:left"></complexType></p>

你也可以定义一个最小发生属性。
 

SOAP数组:SOAP数组定义通过SOAP-ENC:Array,该类型基于wsdl:arrayType元素。

<div style="text-align:left"><complexType name="<span class="replaceable" style="padding:0px; margin:0px"><code style="padding:0px; margin:0px"><span style="font-family:NSimsun; padding:0px; margin:0px">TypeName</span></code></span>"></p><div style="text-align:left">  <complexContent></p><div style="text-align:left">    <restriction base="SOAP-ENC:Array"></p><div style="text-align:left">      <attribute ref="SOAP-ENC:arrayType" </p><div style="text-align:left">                 wsdl:arrayType="<span class="replaceable" style="padding:0px; margin:0px"><code style="padding:0px; margin:0px"><span style="font-family:NSimsun; padding:0px; margin:0px">ElementType<ArrayBounds></span></code></span>"/></p><div style="text-align:left">    </restriction></p><div style="text-align:left">  </complexContent></p><div style="text-align:left"></complexType></p>

上述语法中,typename指定新定义的数组名,ElementType指定数组中元素的数据类型。ArrayBounds指定数组的维度及元素数量,单位数组通过[],多维通过[][]。
 

<div style="text-align:left"><complexType name="SOAPStrings"></p>  <complexContent><div style="text-align:left">se="SOAP-ENC:Array">      <attribute r</p>    <restriction baef="SOAP-ENC:arrayType"<div style="text-align:left">ayType="xsd:string[]"/>    </restriction>  </c</p>                 wsdl:arromplexContent><div style="text-align:left"></p></complexType>

1.7通过extension定义类型

   类似主要的编码语言,xml schema允许你创建数据类型,这些数据类型集成已有的数据类型,这种机制被称之为:extension。例如你可以创建一个新类型名叫alienInfo,它集成了PersonalInfo结构,通过郑家了新的元素planet。

  extension的类型定义包括四个部分:

 a.通过name属性来定义类型名

 b.通过complexContent元素来指定新类型将拥有多余一个的元素。

 c.被继承的那个类,被称之为base类型,通过base属性来指定。

 d.新类型和属性被定义在extension元素中。例子如下:

<div style="text-align:left"><complexType name="alienInfo"></p>  <complexContent><div style="text-align:left">="personalInfo">      <sequence> </p>    <extension base       <element name="planet" type="xsd:string"/><div style="text-align:left">nt></complexType</p>      </sequence>    </extension>  </complexCont<div style="text-align:left">e></p>

1.8通过restriction来定义类型

简单例子

<div style="text-align:left"><simpleType name="SSN"></p><div style="text-align:left">  <restriction base="xsd:string"></p><div style="text-align:left">    <pattern value="\d{3}-\d{2}-\d{4}"/></p>  </restriction><div style="text-align:left"></p></simpleType>

1.9定义枚举类型:

<div style="text-align:left"><simpleType name="widgetSize"></p><div style="text-align:left">  <restriction base="xsd:string"></p>    <enumeration value="big"/><div style="text-align:left">>    <enumeration value="mungo"</p>    <enumeration value="large"//>  </restriction><div style="text-align:left"></p></simpleType>

2定义元素:

在xml schema中的元素体现为一个元素的实例。大多数最基本的元素有简单元素组成。像element元素,他是由一定数量的复杂类型定义的。它有三个属性:

  • 名称:一个需要的属性来指明元素的名字
  • type:指明元素的类型,这个类型可以是任何xml schema的原类型或者任何已经命名的复合类型。这个属性属性可以被省略,如果类型已经内置定义。
  • nillable:指定是否元素可以从一个文档中忽略,如果是ture,则元素可以被任何根据该SCHEMA生成数据文件中忽略。

一个元素可以有一个内置类型定义,内置类型被指明,通过复合类型元素或者简单类型元素。一旦你说明了是否数据类型是复合或者简单,你可以定义任何你需要的数据类型。内置类型定义建议不被使用,因为他不支持重用。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn