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元素定义。
下面的雷子是一个复杂类型有两个子元素:
结构如下:
struct personalinfo
{ string name;
int age;
};
对应的wsdl文档:
name=name type=xsd:string />
2定义元素:
在xml schema中的元素体现为一个元素的实例。大多数最基本的元素有简单元素组成。像element元素,他是由一定数量的复杂类型定义的。它有三个属性:
名称:一个需要的属性来指明元素的名字type:指明元素的类型,这个类型可以是任何xml schema的原类型或者任何已经命名的复合类型。这个属性属性可以被省略,如果类型已经内置定义。nillable:指定是否元素可以从一个文档中忽略,如果是ture,则元素可以被任何根据该schema生成数据文件中忽略。一个元素可以有一个内置类型定义,内置类型被指明,通过复合类型元素或者简单类型元素。一旦你说明了是否数据类型是复合或者简单,你可以定义任何你需要的数据类型。内置类型定义建议不被使用,因为他不支持重用。
