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属性中。

<element name="simpleInt" type="xsd:int" />

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

1.4定义复杂数据类型:

xml schema提供灵活和强大的机制来构建负责数据结构。你能够创建数据结构通过创建一个元素和属性的序列。

你看能够扩展已有类型来创建更复杂的类型。

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

1.5定义数据结构:

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

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

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

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

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

结构例如以下:

  1. struct personalInfo
  2.  
  3. {
  4. string name;
  5.  
  6. int age;
  7.  
  8. };

相应的WSDL文档:

  1. <complexType name="personalInfo">
  2.  
  3. <sequence>
  4. name="name" type="xsd:string" />
  5. <element
  6.  
  7. <element
  8. name="age" type="xsd:int" />
  9. </sequence>
  10.  
  11. </complexType>

注1:复杂类型的种类:

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

  • sequence:全部的复杂类型域必须被显示,而且他们必须有一个确定的次序,该次序与类型定义的次序同样。

  • all:全部的复杂类型域都须要有。可是次序无所谓
  • choice:不过元素中一个能够出如今消息中。

注2:定义结构的部分:

你定义数据域。这些数据域是由一个结构体组成。

每一个复杂类型元素应该包含至少一个element元素。每一个element元素相应已经定义的数据结构中的一个域。

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

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

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

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

  1. <complexType name="personalInfo>
  2.  
  3. <all>
  4. ment name="name" type="xsd:string"/>
  5. <el
  6.  
  7. <el
  8. eement name="age" type="xsd:int"/>
  9. pe="xsd:string:
  10. minOccurs="3" maxOccu
  11.  
  12. <element name="previousJobs" t
  13. yrs="7"/>
  14. </all>
  15.  
  16. </complexType>
注3:定义属性:在xml文档中,属性被包括在element内部的。比如在complexType元素中name就是属性,它通常跟在<sequence>,<all>等元素的后面。比如:
 
  1. <complexType name="personalInfo>
  2.  
  3. <all>
  4. ment name="name" type="xsd:string"/>
  5. <el
  6.  
  7. <el
  8. eement name="previousJobs" type="xsd:string"
  9. </all>
  10. <attribute name="age" type="xsd:i
  11.  
  12. minOccurs="3" maxOccurs="7"/>
  13.  
  14. nt" use="optional" />
  15.  
  16. </complexType>
1.6定义数组
 

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

复合类型数组:复合类型数组是特殊的sequence复合类型。你能够简单定义一个复合类型通过简单元素,而且制定该元素的最大发生maxOccurs属性。

比如,定义一个数组。拥有二个浮点数字,你能够使用复合类型例如以下:

  1. <complexType name="personalInfo>
  2. <element name="averages" type="xsd:float" maxOccurs="20"/>
  3. </complexType>
你也能够定义一个最小发生属性。

 

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

  1. <complexType name="TypeName">
  2. <complexContent>
  3. <restriction base="SOAP-ENC:Array">
  4. <attribute ref="SOAP-ENC:arrayType"
  5. wsdl:arrayType="ElementType<ArrayBounds>"/>
  6. </restriction>
  7. </complexContent>
  8. </complexType>
上述语法中。typename指定新定义的数组名,ElementType指定数组中元素的数据类型。ArrayBounds指定数组的维度及元素数量,单位数组通过[],多维通过[][]。

 
  1. <complexType name="SOAPStrings">
  2.  
  3. <complexContent>
  4. se="SOAP-ENC:Array">
  5. <attribute r
  6.  
  7. <restriction b
  8. aef="SOAP-ENC:arrayType"
  9. ayType="xsd:string[]"/>
  10. </restriction>
  11. </c
  12.  
  13. wsdl:ar
  14. romplexContent>
  15.  
  16. </complexType>

1.7通过extension定义类型

类似基本的编码语言,xml schema同意你创建数据类型。这些数据类型集成已有的数据类型,这样的机制被称之为:extension。比如你能够创建一个新类型名叫alienInfo,它集成了PersonalInfo结构,通过郑家了新的元素planet。

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

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

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

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

d.新类型和属性被定义在extension元素中。

样例例如以下:

  1. <complexType name="alienInfo">
  2.  
  3. <complexContent>
  4. ="personalInfo">
  5. <sequence>
  6.  
  7. <extension bas
  8. e <element name="planet" type="xsd:string"/>
  9. nt>
  10. </complexType
  11.  
  12. </sequence>
  13. </extension>
  14. </complexCont
  15. e>

1.8通过restriction来定义类型

简单样例

  1. <simpleType name="SSN">
  2. <restriction base="xsd:string">
  3. <pattern value="\d{3}-\d{2}-\d{4}"/>
  4.  
  5. </restriction>
  6.  
  7. </simpleType>

1.9定义枚举类型:

  1. <simpleType name="widgetSize">
  2. <restriction base="xsd:string">
  3.  
  4. <enumeration value="big"/>
  5. >
  6. <enumeration value="mungo"
  7.  
  8. <enumeration value="large"
  9. //>
  10. </restriction>
  11.  
  12. </simpleType>

2定义元素:

在xml schema中的元素体现为一个元素的实例。

大多数最主要的元素有简单元素组成。像element元素,他是由一定数量的复杂类型定义的。它有三个属性:

  • 名称:一个须要的属性来指明元素的名字
  • type:指明元素的类型。这个类型能够是不论什么xml schema的原类型或者不论什么已经命名的复合类型。

    这个属性属性能够被省略,假设类型已经内置定义。

  • nillable:指定是否元素能够从一个文档中忽略,假设是ture。则元素能够被不论什么依据该SCHEMA生成数据文件里忽略。

一个元素能够有一个内置类型定义,内置类型被指明,通过复合类型元素或者简单类型元素。

一旦你说明了是否数据类型是复合或者简单,你能够定义不论什么你须要的数据类型。内置类型定义建议不被使用。由于他不支持重用。

php学习之道:WSDL具体解释(一)的更多相关文章

  1. Android 布局学习之——Layout(布局)具体解释二(常见布局和布局參数)

     [Android布局学习系列]   1.Android 布局学习之--Layout(布局)具体解释一   2.Android 布局学习之--Layout(布局)具体解释二(常见布局和布局參数)   ...

  2. webservice学习01:wsdl文档结构

    webservice学习01:wsdl文档结构 wsdl文档结构 WSDL文档示例 <wsdl:definitions xmlns:xsd="http://www.w3.org/200 ...

  3. Linux快速入门打开你的学习之道

    Linux快速入门打开你的学习之道 相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什 ...

  4. php学习之道:WSDL具体解释(三)

    通过声明方式定义绑定(binding)属性 假设你在服务中採用SOAP binding.你能够使用JAX-WS来指定一定数量的属性binding. 这些属性指定相应你在WSDL中指定的属性.某些设置. ...

  5. php学习之道:php中soap的使用实例以及生成WSDL文件,提供自己主动生成WSDL文件的类库——SoapDiscovery.class.php类

    1. web service普及: Webservice soap wsdl差别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供 ...

  6. php学习之路:WSDL详细解释(两)

    3.定义服务使用的逻辑消息 当服务的操作被调用时.服务被定义为消息交换.在wsdl文档中,这些消息被定义message元素. 这些消息由称之为part元素的部分组成. 一个服务的操作,通过指定逻辑消息 ...

  7. Linux内核学习之道

    来自:http://blog.chinaunix.net/uid-26258259-id-3783679.html 内核文档 内核代码中包含有大量的文档,这些文档对于学习理解内核有着不可估量的价值,记 ...

  8. 摘自:java夜未眠之java学习之道

    目前Java可以说是产业界和学术界最热门的语言,许多读者都很急切想把Java学好.除非是武侠小说中的运功传送内力的方式,否则花上一段时间苦学是免不了的.花时间,不打紧,就是怕方法错误,事倍功半.我认为 ...

  9. Redis学习笔记4-Redis配置具体解释

    在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server   xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redi ...

随机推荐

  1. 联想Thinkpad L460安装Win7 64位

    单位发了L460,自带的系统为win10,但是涉及到很多工作以及客户都是在win7环境下,所以必须安装win7的系统,经过一番折腾,终于装好了. 主要顺序如下: 1,制作WINPE启动盘,如大白菜,老 ...

  2. alipay.trade.refund (统一收单交易退款接口)[支付宝退款]

    首页官网退款的api: https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.UTBitT&docType=4& ...

  3. Blender插件编写指南

    前言 Blender插件是Blender的利器, 用户可以使用各种插件扩充Blender的功能. Blender Python插件以bpy.props, bpy.types.Operator, bpy ...

  4. layui框架 各种小结

    首先项目前端采用的是bootstrap和layui弹窗,验证,表格用的是bootstrapTable layui官方地址:http://www.layui.com/ 文档:http://www.lay ...

  5. [SGU 199] Beautiful People

    [SGU 199] Beautiful People The most prestigious sports club in one city has exactly N members. Each ...

  6. USB 接口探测分类

    USB 接口探测分类 SDP (Standand Downstream Port) 标准下行接口 标准USB都支持的接口 这种端口的D+和D-线上具有15kΩ下拉电阻.限流值如上讨论:挂起时为2.5m ...

  7. C#自动缩进排列代码的快捷键 c# 代码重新排版 变整齐

    C#自动缩进排列代码的快捷键:  ctrl + k + d 1.小技巧, 可以把最后一个}去掉, 重新写下,就可以达到排版的效果. 2.快捷键:编辑-高级-设置文档的格式 快捷键Ctrl+E,D,设置 ...

  8. Haar、pico、npd、dlib等多种人脸检测特征及算法结果比较

    原文:opencv.pico.npd.dlib.face++等多种人脸检测算法结果比较 NDP检测结果: 结果分析: Pico(Pixel Intensity Comparison-based Obj ...

  9. Mac下php连接mysql数据库失败解决办法

    通过phpmyadmin连接mysql成功,但是通过php连接数据库失败,执行如下php语句 ? 1 @mysql_connect("localhost","root&q ...

  10. 【转载】Jmeter分布式部署测试-----远程连接多台电脑做压力性能测试

    在使用Jmeter进行接口的性能测试时,由于Jmeter 是JAVA应用,对于CPU和内存的消耗比较大,所以,当需要模拟数以万计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起J ...