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

<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元素定义。

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

结构如下:

struct personalInfo
{
  string name;
  int age;
};

对应的WSDL文档:

<complexType name="personalInfo">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="age" type="xsd:int" />
  </sequence>
</complexType>

注1:复杂类型的种类:

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

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

注2:定义结构的部分:

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

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

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

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

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

<complexType name="personalInfo>
  <all>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int"/>
    <element name="previousJobs" type="xsd:string:
             minOccurs="3" maxOccurs="7"/>
  </all>
</complexType>

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

<complexType name="personalInfo>
  <all>
    <element name="name" type="xsd:string"/>
    <element name="previousJobs" type="xsd:string"
             minOccurs="3" maxOccurs="7"/>
  </all>
  <attribute name="age" type="xsd:int" use="optional" />
</complexType>

1.6定义数组

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

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

<complexType name="personalInfo>
  <element name="averages" type="xsd:float" maxOccurs="20"/>
</complexType>

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

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

<complexType name="TypeName">
  <complexContent>
    <restriction base="SOAP-ENC:Array">
      <attribute ref="SOAP-ENC:arrayType"
                 wsdl:arrayType="ElementType<ArrayBounds>"/>
    </restriction>
  </complexContent>
</complexType>

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

<complexType name="SOAPStrings">
  <complexContent>
    <restriction base="SOAP-ENC:Array">
      <attribute ref="SOAP-ENC:arrayType"
                 wsdl:arrayType="xsd:string[]"/>
    </restriction>
  </complexContent>
</complexType>

1.7通过extension定义类型

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

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

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

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

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

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

<complexType name="alienInfo">
  <complexContent>
    <extension base="personalInfo">
      <sequence>
        <element name="planet" type="xsd:string"/>
      </sequence>
    </extension>
  </complexContent>
</complexType>

1.8通过restriction来定义类型

简单例子

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

1.9定义枚举类型:

<simpleType name="widgetSize">
  <restriction base="xsd:string">
    <enumeration value="big"/>
    <enumeration value="large"/>
    <enumeration value="mungo"/>
  </restriction>
</simpleType>

2定义元素:

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

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

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

WSDL详解(一),布布扣,bubuko.com

时间: 2024-08-08 19:31:14

WSDL详解(一)的相关文章

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

通过声明方式定义绑定(binding)属性 如果你在服务中采用SOAP binding,你可以使用JAX-WS来指定一定数量的属性binding.这些属性指定对应你在WSDL中指定的属性.某些设置,比如参数类型,可以约束你实现的方法,这些设置也影响声明的效用. @SOAPBinding声明,定义在javax.jws.soap.SOAPBinding接口中.它提供发布时的SOAP Binding细节.如果@SOAPBinding没有被指定,则用缺省的doc/literal SOAPBinding.

WebService中的WSDL详解

WebService中的WSDL详解 有人在WebService开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户(或后台)给你一个WSDL文件(或网址),说按照上面的进行适配, 这时就要对WebService的WSDL有一定的理解,本文将对WSDL(WebService描述语言)进行详细总结. WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端

WSDL 详解

WSDL 详解 转载自:http://kalogen.javaeye.com/blog/418958 WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用).WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署

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

WSDL文档使用web服务描述语言来定义服务. 文档包括逻辑(抽象)部分和具体部分. 抽象部分用于定义独立于实现的数据类型和消息,具体部分定义一个endpoint如何实现一个可以与外界进行交互的服务. 通常建议在写代码前定义WSDL文档和XML schema,但是这就要求对WSDL非常熟悉. 逻辑部分: 包括types,message以及portType元素.types元素中,xml schema用来定义组成消息的数据的结构.一定数量的消息元素用来定义服务所用消息的格式.portType元素包括

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

3.定义服务使用的逻辑消息 当服务的操作被调用时,服务被定义为消息交换.在wsdl文档中,这些消息被定义message元素.这些消息由称之为part元素的部分组成. 一个服务的操作,通过指定逻辑消息的方式来定义.当操作被调用时,逻辑消息被交换.(也就是说,逻辑消息代表了服务的操作)这些逻辑消息,将在网络上传输的数据定义为xml文档.他包含了所有的参数,这些参数是方法调用的一部分.(也就是说,逻辑消息里的参数,是操作对应方法的参数集合) 消息和参数列表:每一个被服务暴露的操作能且仅能有一个输入消息

WebService WSDL详解(上)

为什么使用WSDL? 像Internet协议之类的标准有没有为权威所利用,或者人们这样看待它是因为顺之所获的好处远远超出了代价?曾经有许多试图建立的标准都流产了.有时候,那些还没有普遍使用的标准甚至由法令或政府规定强行推出:Ada语言就是一例. 我相信正是跟随标准所带来的好处使它广泛接受.例如,对于铁路服务来说,真正重要的是,不同公司所铺设的铁路结合到一起,或者是来自好几个公司的产品协调的工作在一起.几家大的企业合力建立了SOAP标准.Web Service描述语言(WSDL)向这种Web Se

WebService中的WSDL详解 及jmeter测试

首先简单讲解一下什么是wsdl. 一个WSDL文档通常包含8个重要的元素,即definitions.types.import.message.portType.operation.binding.service元素.这些元素嵌套在definitions元素中,definitions是WSDL文档的根元素. WSDL文档外层结构图示: WSDL 服务进行交互的基本元素: Types(消息类型):数据类型定义的容器,它使用某种类型系统(如 XSD). Message(消息):通信数据的抽象类型化定义

wsdl详解

wsdl的结构: definitions ---types: ---message:用来定义消息的结构 ---part:指定引用types中定义的标签片段 ---portType:用来定义服务器端的sei ---operation:用来指定sei中的处理请求的方法: ---input:指定客户端应用传过来的数据,会引用上面定义的<message> ---output:指定服务器端返回给客户端的数据,会引用上面定义的<message> ---binding:用于定义sei的实现类 -

Webservice学习之WSDL详解

1. <definitions/> 这部分在基础篇里已经介绍,主要说明引用了哪些schema以及schema的位置等,可以看下基础篇的介绍,SayHello的Demo这部分内容如下: <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://im