wsdl中的php soap wsdlaction属性,有什么用

WSDL 规则解释
WSDL 规则解释
发布时间: 2:18:24
编辑:www.fx114.net
本篇文章主要介绍了"WSDL 规则解释",主要涉及到WSDL 规则解释方面的内容,对于WSDL 规则解释感兴趣的同学可以参考一下。
WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务,截然不同的网站都可以实现。随网站而异的东西如序列化便归入底部分,因为它包含具体的定义。
l 抽象定义
&&&&&&&&Types
&&&&&&&&&&&&独立与机器和语言的类型定义
  Messages
&&&&&&&&&& 包括函数参数(输入与输出分开)或文档描述
  PortTypes
&&&&&&&&&& 引用消息部分中消息定义来描述函数签名(操作名、输入参数、输出参数)
2 具体定义
&&&&&&&&Bindings
    && PortTypes部分的每一操作在此绑定实现
  Services
&&&&&&&&  确定每一绑定的端口地址
下面的图中,箭头连接符代表文档不同栏之间的关系。点和箭头代表了引用或使用关系。双箭头代表&修改&关系。3-D的箭头代表了包含关系。这样,各Messages栏使用Types栏的定义,PortTypes栏使用Messages栏的定义;Bindings栏引用了PortTypes栏,Services栏引用Bindings栏,PortTypes和Bindings栏包含了operation元素,而Services栏包含了port元素。PortTypes栏里的operation元素由Bindings栏里的operation元素进一步修改或描述。
首先看看一段简单的JAVA代码,我们用它作为WSDL的服务实现代码:
public&class&Test{
&&public&String&echo(String&u){
&&&&return&&Hello&&&+&u;
看看它导出的文件:
&&//第一行申明该文档是XML。尽管这并不是必需的,但它有助于XML解析器决定是否解析WSDL文件或只是报错。第二行是WSDL文档的根元素:&definitions&。一些属性附属于根元素,就像&schema&子元素对于&types&元素。
&&& &?xml&version=&1.0&&encoding=&UTF-8&&?&&
-&&wsdl:definitions&targetNamespace=&http://localhost/axis/Test2.jws&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &xmlns:wsdl=&http://schemas.xmlsoap.org/wsdl/&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& xmlns:xsd=&http://www.w3.org/2001/XMLSchema&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& xmlns:soapenc=&http://schemas.xmlsoap.org/soap/encoding/&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& xmlns:wsdlsoap=&http://schemas.xmlsoap.org/wsdl/soap/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &xmlns:apachesoap=&http://xml.apache.org/xml-soap&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& xmlns:intf=&http://localhost/axis/Test2.jws&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& xmlns:impl=&http://localhost/axis/Test2.jws&&
WSDL&created&by&Apache&Axis&version:&1.4
Built&on&Apr&22,&:48&PDT)
定义好操作(或方法)以后,现在需要指定将向它们发送和从它们返回的参数。在 WSDL 术语中,所有参数称为“消息”。认为您是在递送消息而结果得到返回的消息是有用的。方法调用是这样一种操作:它准备返回“消息”来响应进入的消息。
&message&元素包含了Messages栏。如果我们把操作看作函数,&message&元素定义了那个函数的参数。&message&元素中的每个&part&子元素都和某个参数相符。输入参数在&message&元素中定义,与输出参数相隔离--输出参数有自己的&message&元素。兼作输入、输出的参数在输入输出的&message&元素中有它们相应的&part&元素。输出&message&元素以&Response&结尾,就像以前所用的&fooResponse&。每个&part&元素都有名字和类型属性,就像函数的参数有参数名和参数类型。
-&&wsdl:message&name=&echoResponse&&&&&//返回的消息
&&&wsdl:part&name=&echoReturn&&type=&xsd:string&&/&&
&&&/wsdl:message&
-&&wsdl:message&name=&echoRequest&&&&//请求的消息
&&&wsdl:part&name=&u&&type=&xsd:string&&/&&
&&&/wsdl:message&
&definitions&&元素包含一个或多个&&portType&&元素,实际上,每个元素都是您希望表示的一系列&operation&。或者,您也可以将单个 portType 元素看作是将各种方法组成类的一个逻辑分组。例如,如果您的供应链管理解决方案需要在客户和供应商之间进行交互,您最可能做的是分别定义与他们交互的功能性;也就是说,您将为用户和供应商各定义一个 portType。应该将每个
portType 称为&服务,因此整个 WSDL 文件将成为一个服务集合。&
-&&wsdl:portType&name=&Test2&&&&&//一个portType可以看成一个类
-&&wsdl:operation&name=&echo&&parameterOrder=&u&&&&&//一个operation就是一个方法
&&&wsdl:input&name=&echoRequest&&message=&impl:echoRequest&&/&&&
//输入消息
&&&wsdl:output&name=&echoResponse&&message=&impl:echoResponse&&/&&
//返回消息
&&&/wsdl:operation&
&&&/wsdl:portTyp&
消息传递和传输:
我以一种抽象方式定义了操作和消息,而不考虑实现的细节。实际上,WSDL 的任务是定义或描述 Web 服务,然后提供一个对外部框架的引用来定义 WSDL 用户将如何实现这些服务。可以将这个框架当作 WSDL 抽象定义和它们的实现之间的“绑定(&binding&)”。
当前,最流行的绑定(&binding&)技术是使用简单对象访问协议(SOAP)。WSDL 将指定能够访问 Web 服务实际实现的 SOAP 服务器,并且从那时起 SOAP 的整个任务就是将用户从 WSDL 文件带到它的实现。
WSDL 编写的第三个步骤是描述将 SOAP 与 WSDL 文件绑定到一起的过程。您将把&&binding&&元素包括到&&definitions&&元素内。这个 binding 元素应该有&name&和&type&属性。&name&将标识这个绑定而&type&将标识您希望与这个绑定相关联的 portType(一组操作)。
&&&&&&&wsdl:binding&name=&Test2SoapBinding&&type=&impl:Test2&&
&&&wsdlsoap:binding/&&元素。该元素的用途是声明将把 SOAP 作为绑定和传输服务使用
&&&wsdlsoap:binding&&元素有两个属性:style 和 transport。style 是一个可选属性,它描述该绑定内操作的性质。transport 属性指定 HTTP 作为该绑定将使用的级别较低的传输服务。SOAP 客户机将从 WSDL 文件中读取 SOAP 结构并与另一端的 SOAP 服务器协调.
&&&wsdlsoap:binding&style=&rpc&&transport=&http://schemas.xmlsoap.org/soap/http&&/&&
&WSDL&&operation&&元素,分别表示具体的操作。每个&&operation&&元素提供各自操作的绑定细节。因此,我提供了另一个&extensibility&元素,即&&wsdlsoap:operation/&&(仍然是一个空元素,与它发生的那个操作相关)。该&&soap:operation/&&元素有一个 soapAction 属性,SOAP 客户机将使用该属性创建
SOAP 请求。&
&&&&//下面将WSDL描述与具体实现进行绑定,这里采用SOAP方式
-&&wsdl:operation&name=&echo&&
&&&wsdlsoap:operation&soapAction=&&&/&&
-&&wsdl:input&name=&echoRequest&&
&&&wsdlsoap:body&use=&encoded&&encodingStyle=&http://schemas.xmlsoap.org/soap/encoding/&&namespace=&http://DefaultNamespace&&/&&
&&&/wsdl:input&
-&&wsdl:output&name=&echoResponse&&
&&&wsdlsoap:body&use=&encoded&&encodingStyle=&http://schemas.xmlsoap.org/soap/encoding/&&namespace=&http://localhost/axis/Test2.jws&&/&&
&&&/wsdl:output&
&&&/wsdl:operation&
&&&/wsdl:binding&
//下面将发布的服务与前面的SOAP绑定进行关联
-&&wsdl:service&name=&Test2Service&&
-&&wsdl:port&name=&Test2&&binding=&impl:Test2SoapBinding&&
&&&wsdlsoap:address&location=&http://localhost/axis/Test2.jws&&/&&
&&&/wsdl:port&
&&&/wsdl:service&
&每个namespace属性都声明了一个缩略语,用在文档中。例如&xmlns:xsd&就为 http://www.w3.org/2001/XMLSchema定义了一个缩略语(xsd)。这就允许对该namespace的引用只需简单的在名字前加上前缀就可以了,如:&xsd:int&中的&xsd&就是合法的类型名。普通范围规则可运用于缩略前缀。也就是说,前缀所定义的元素只在元素中有效。
  Namespace派什么用?namespace的作用是要避免命名冲突。如果我建立一项Web Service,其中的WSDL文件包含一个名为&foo&的元素,而你想要使用我的服务与另一项服务连接作为补充,这样的话另一项服务的WSDL文件就不能包含名为&foo&的元素。两个服务器程序只有在它们在两个事例中表示完全相同的东西时,才可以取相同的名字。如果有了表示区别的namespace,我的网络服务里的&foo&就可以表示完全不同于另一个网络服务里&foo&的含义。在你的客户端里,你只要加以限制就可以引用我的&foo&。
  见下例:/fooService#foo 就是完全限制的名字,相当于&carlos:foo&,如果我声明了carlos作为/fooService的快捷方式。请注意namespace中的URL是用来确定它们的唯一性的,同时也便于定位。URL所指向的地方不必是实际存在的网络地址,也可以使用GUID来代替或补充URL。例如,GUID&335DB901-D44A-11D4-A96E-D&就是一个合法的namespace指派。
  targetNamespace属性声明了一个namespace,元素中所有的声明的名字都列于其内。在WSDL示例中,&definitions&的targetNamespace 是http://tempuri.org/wsdl。这意味着所有在WSDL文档中声明的名字都属于这个namespace。&schema&元素有自己的targetNamespace属性,其值为&http://tempuri.org/xsd&,在&schma&元素中定义的所有名字都属于这个namespace而不是main的target
namespace。
  &schema&元素的以下这行声明了默认的namespace。Schema中所有有效的名字都属于这个namespace。
本文标题:
本页链接:Web Service概述
Web Service的定义
W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。
里我们从一个程序员的视角来观察web
service。在传统的程序编码中,存在这各种的函数方法调用。通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数
P,方法A执行完毕后,返回处理结果R。这种函数或方法调用通常发生在同一台机器上的同一程序语言环境下。现在的我们需要一种能够在不同计算机间的不同语
言编写的应用程序系统中,通过网络通讯实现函数和方法调用的能力,而Web
service正是应这种需求而诞生的。
普遍的一种说法就是,Web Service = SOAP + HTTP + WSDL。其中,SOAP Simple Object Access
Protocol)协议是web
service的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系
统间的计算服务处理。这里的WSDL(Web
Services Description Language)web
服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的 Web
service服务的URL信息、方法的命名,参数,返回值等。
下面,我们先来熟悉一下SOAP协议,看看它是如何描述程序中的函数方法、参数及结果对象的。
SOAP协议简介
什么是SOAP
SOAP 指简单对象访问协议,它是一种基于XML的消息通讯格式,用于网络上,不同平台,不同语言的应用程序间的通讯。可自定义,易于扩展。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
& Envelope 元素,标识XML 文档一条 SOAP 消息
& Header 元素,包含头部信息的XML标签
& Body 元素,包含所有的调用和响应的主体信息的标签
& Fault 元素,错误信息标签。
以上的元素都在 SOAP的命名空间http://www.w3.org/2001/12/soap-envelope中声明;
SOAP的语法规则
& SOAP 消息必须用 XML 来编码
& SOAP 消息必须使用 SOAP Envelope 命名空间
& SOAP 消息必须使用 SOAP Encoding 命名空间
& SOAP 消息不能包含 DTD 引用
& SOAP 消息不能包含 XML 处理指令
SOAP 消息的基本结构
SOAP Envelope 元素
Envelope 元素是 SOAP 消息的根元素。它指明 XML 文档是一个SOAP 消息。它的属性 xmlns:soap的值必须是http://www.w3.org/2001/12/soap-envelope。
? encodingStyle 属性,语法:soap:encodingStyle="URI"
encodingStyle 属性用于定义文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。
SOAP Header 元素
actor 属性,语法soap:actor="URI"
过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到 SOAP
消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。SOAP 的 actor 属性可被用于将 Header
元素寻址到一个特定的端点。
mustUnderstand 属性 ,语法soap:mustUnderstand="0|1"
SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则要求处理此头部的接收者必须认可此元素。
view plain
SOAP Fault 元素
Fault 元素表示 SOAP的错误消息。它必须是 Body 元素的子元素,且在一条 SOAP 消息中,Fault 元素只能出现一次。Fault 元素拥有下列子元素:
常用的SOAP Fault Codes
HTTP协议中的SOAP 实例
下面的例子中,一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中: "http://www.jsoso.net/stock"
SOAP 请求:(注意HTTP的Head属性)
SOAP 响应:(注意HTTP的Head属性)
HTTP协议中的SOAP RPC工作流程
介绍过了SOAP,让我们关注Web Service中另外一个重要的组成WSDL。
WSDL的主要文档元素
文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语
言而变的元素。这就定义了一系列服务,截然不同的应用都可以实现。具体部分,如数据的序列化则归入底部分,因为它包含具体的定义。在上述的文档元素
中,&types&、&message&、&portType&属于抽象定义
层,&binding&、&service&属于具体定义层。所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。
WSDL文档的结构实例解析
下面我们将通过一个实际的WSDL文档例子来详细说明各标签的作用及关系。
标签定义了当前的WSDL文档用到的数据类型。要说明的是,为了最大程度的平台中立性,WSDL 使用 XML Schema
语法来定义数据类型。这些数据类型用来定义web service方法的参数和返回指。对于通用的原生数据类型如:integer , boolean ,
float等,在W3C的标准文档http://www.w3.org/2001/XMLSchema中已经做了定义。这里我们要引入的schema定义
schemaLocation="http://localhost:8080/hello?xsd=1"是我们自定义的Java对象类型。
WSDL文档消息体定义元素:& message &
<message>
元素定义了web
service函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数在<message>元素中定义,与输出参数相
隔离,输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出
<message>元素以"Response"结尾,对Java而言方法得返回值就对应一个输出的<message>。每个<part>元素都有名字和类
型属性,就像函数的参数有参数名和参数类型。
在上面的文档中有两个输入参数、两个输出参数和一个错误参数(对应Java中的Exception)。
? 输入参数<message>的name属性分别命名为toSayHello,sayHello。
toSayHello对应输入参数userName,参数类型为xsd:string,在Java语言中就是String;
sayHello对应两个输入参数person和arg1,类型为tns:person和xsd:string。这里tns:person类型就是引用了& types &标签中的类型定义。
? 输出参数<message>的name属性分别命名为toSayHelloResponse和sayHelloResponse。
这个名称和输入参数的<message>标签name属性对应,在其后面加上Response尾缀。
toSayHelloResponse对应的返回值是returnWord,参数类型为xsd:string;
sayHelloResponse对应的返回值是personList,参数类型为tns:personArray(自定义类型);
? 错误参数<message>的name属性为HelloException。
它的&part&子标签element而不是type来定义类型。
上的message标签的name属性通常使用web
service函数方法名作为参照,错误参数标签则使用异常类名为参照。标签中的参数名称,即part子元素的name属性是可自定义的(下一章节详细说
明)。message标签的参数类型将引用types标签的定义。
WSDL文档函数体定义元素:& portType &
view plain
但不是所有的Java类都可以发布成Web Service。Java类若要成为一个实现了Web Service的bean,它需要遵循下边这些原则:
? 这个类必须是public类
? 这些类不能是final的或者abstract
? 这个类必须有一个公共的默认构造函数
? 这个类绝对不能有finalize()方法
下面我们将通过一个具体的Java Web Service代码例子,配合上述的WSDL文件,讲述如何编写JavaSE6.0的原生Web Service应用。
完整的Java Web Service类代码
view plain
wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http://localhost:8080/hello?wsdl
? -cp 定义classpath
? -r 生成 bean的wsdl文件的存放目录
? -s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)
? -d 生成发布Web Service的编译过的二进制类文件的存放目录(该异常的描述类的class文件)
? -d 生成客户端执行类的class文件的存放目录
? -s 生成客户端执行类的源文件的存放目录
? -p 定义生成类的包名
--转自 http://blog.csdn.net/lfy/article/details/8302306
阅读(...) 评论()当前位置:
WSDL原来是这样的
发布时间:
浏览次数:
在刚开始学习Webservice的时候,发现里面涉及到的知识点还真不少,每一点单拿出来都可以自成一派了。尤其是看到WSDL的时候,查了很长时间的资料,依然是有些迷惑,对其没有一个清晰的认识。随着在以后的工作中,自己写了一些WSDL的案例,才逐渐的对其内部原理有了一些认识。
首先先看一下WSDL的作用:WSDL(Web&Service&Description&Language)用XML格式的文件来描述可用的Web服务。其实说白了就是一个标准,终端按照这个标准在网络中创建Web服务,客户端也按照此标准去连接这个服务,并且根据WSDL文件获知自己所需要的操作。
接下来我想说一下WSDL的发展过程,了解WSDL的产生历史,在以后的学习过程中不至于产生迷惑。
WSDL的第一个版本是WSDL1.0&在2000年9月有IBM,Microsoft以及Ariba开发,目的就是描述Web&Service&的SOAP工具包。随后在2001年3月,WSDL&1.1版本发布,此举标志着WSDL走向了正轨。但是在1.0&和1.1之间并没有产生多大的变化。时隔两年,在2003年6月最为W3C的工作草案&WSDL1.2发布。按照W3C的说法,WSDL1.2相对于1.1版本来说开发者使用起来更简单并且更灵活了。但是WSDL1.2并不支持大多数的SOAP服务。
在2007年6月,WSDL1.2被正式更名为WSDL2.0,此时WSDL2.0也成为了W3C的推荐版本。做出这一改变的原因是2.0版本相对于1.1版本来说有了实质性的改变,所以上升了一个等级。
所以说现在WSDL流行的两个版本是WSDL2.0&和&WSDL1.1。虽说WSDL2.0&是W3C推荐的版本,但是现在大多数的厂商支持的还是WSDL1.1。举个例子来说,我们都知道PHP的一款官方IDE&&zendstudio还有java&IDE&&Eclipse,当我们使用它们新建WSDl文件时,这个WSDl文件所遵循的格式还是WSDL1.1版本的格式。在我平时的工作中,使用的WSDL也是遵循的1.1版本的格式。
那WSDL1.1和WSDL2.0的格式究竟是怎样的呢,下面我来向大家介绍介绍。
首先我们看一下WSDL1.1,按照此标准,在WSDL文件中包含下面七项内容
可以认为是一个容器,容器里的内容是数据类型的描述,当然需要借助于XML&Schema&来达到这一目的。那么这个容器的格式如下
&wsdl:types&
&&&&&xsd:schema&targetNamespace=&/WSDLFile/&&
&&&&&&&xsd:element&name=&Operation&&
&&&&&&&&&xsd:complexType&
&&&&&&&&&&&xsd:sequence&
&&&&&&&&&&&&&xsd:element&name=&in&&type=&xsd:string&/&
&&&&&&&&&&&/xsd:sequence&
&&&&&&&&&/xsd:complexType&
&&&&&&&/xsd:element&
&&&&&&&xsd:element&name=&OperationResponse&&
&&&&&&&&&xsd:complexType&
&&&&&&&&&&&xsd:sequence&
&&&&&&&&&&&&&xsd:element&name=&out&&type=&xsd:string&/&
&&&&&&&&&&&/xsd:sequence&
&&&&&&&&&/xsd:complexType&
&&&&&&&/xsd:element&
&&&&&/xsd:schema&
&&&/wsdl:types&
2. Message
对操作接口进行一个抽象的定义。格式如下:
&wsdl:message&name=&OperationRequest&&
&&&&&wsdl:part&element=&tns:Operation&&name=&parameters&/&
&&&/wsdl:message&
&wsdl:message&name=&OperationResponse&&
&&&&&wsdl:part&element=&tns:OperationResponse&&name=&parameters&/&
&&&/wsdl:message&
Messages包含了一个或者多个part&元素,对于Message的属性name的值是唯一的,和当前整个WSDL文件中的人和一个Message的name值都不能相同。Part的属性name的值也是唯一的,和当前Message中的其它的任何一个part的name的值都不能相同,当然处于不同的Message中的part的name的值可以相同。
每一个part元素都关联message-type属性,这个message-type属性一般包含两部分:element和type。Message中的每一个part对应Types中的一个element元素,并且part的element属性的值为&Types中的element的name的值,前面再加上tns:&,举例如下(下面的代码是摘自&http://www.w3.org/TR/wsdl#_introduction):
&&&&&&&&&schema&....&&
&&&&&&&&&&&&element&name=&PO&&type=&tns:POType&/&
&&&&&&&&&&&&complexType&name=&POType&&
&&&&&&&&&&&&&&&&all&
&&&&&&&&&&&&&&&&&&&&element&name=&id&&type=&string/&
&&&&&&&&&&&&&&&&&&&&element&name=&name&&type=&string&/&
&&&&&&&&&&&&&&&&&&&&element&name=&items&&
&&&&&&&&&&&&&&&&&&&&&&&&complexType&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&all&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&element&name=&item&&type=&tns:Item&&minOccurs=&0&&maxOccurs=&unbounded&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&/all&
&&&&&&&&&&&&&&&&&&&&&&&&/complexType&
&&&&&&&&&&&&&&&&&&&&/element&
&&&&&&&&&&&&&&&/all&
&&&&&&&&&&&&/complexType&
&&&&&&&&&&&&complexType&name=&Item&&
&&&&&&&&&&&&&&&&all&
&&&&&&&&&&&&&&&&&&&&element&name=&quantity&&type=&int&/&
&&&&&&&&&&&&&&&&&&&&element&name=&product&&type=&string&/&
&&&&&&&&&&&&&&&&/all&
&&&&&&&&&&&&/complexType&
&&&&&&&&&&&&element&name=&Invoice&&type=&tns:InvoiceType&/&
&&&&&&&&&&&&complexType&name=&InvoiceType&&
&&&&&&&&&&&&&&&&all&
&&&&&&&&&&&&&&&&&&&&element&name=&id&&type=&string&/&
&&&&&&&&&&&&&&&&/all&
&&&&&&&&&&&&/complexType&
&&&&&&&&&/schema&
&&&&&/types&
&message&name=&PO&&
&&&&&&&&&part&name=&po&&element=&tns:PO&/&
&&&&&&&&&part&name=&invoice&&element=&tns:Invoice&/&
&&&&&/message&
对于Message这一项在WSDL2.0中已经去掉了。
3. Port&Type
由终端定义的一系列的抽象方法,其格式如下 &
&wsdl:portType&name=&WSDLFile&&
&&&&&wsdl:operation&name=&Operation&&
&&&&&&&wsdl:input&message=&tns:OperationRequest&/&
&&&&&&&wsdl:output&message=&tns:OperationResponse&/&
&&&&&/wsdl:operation&
&/wsdl:portType&
同样的,port&type&的属性name的值不同于整个WSDL文档中其他的prottype的name的值。
WSDL有四种传递方式:
One-way:&终端服务接受消息
&wsdl:operation&name=&Operation&&
&&&&&&&wsdl:input&message=&tns:OperationRequest&/&
&&/wsdl:operation&
Request-response:终端服务接受消息,并且发送相关的消息给客户端
&wsdl:operation&name=&Operation&&
&&&&&&&wsdl:input&message=&tns:&OperationRequest&/&
&&&&&&&wsdl:output&message=&tns:OperationResponse&/&
&/wsdl:operation&
Solicit-response:终端发送一个消息,并且接受一个相关消息
&wsdl:operation&name=&Operation&&
&wsdl:output&message=&tns:OperationResponse&/&
&&&&&&&wsdl:input&message=&tns:&OperationRequest&/&
&/wsdl:operation&
Notification:终端服务发送一个消息
&wsdl:operation&name=&Operation&&
&wsdl:output&message=&tns:OperationResponse&/&
&/wsdl:operation&
对于input和output的name的值来说,每一个input或者output的name的值在所有的input和output中是唯一的。当然WSDL也提供了默认的命名规则。此外对于input或者output的属性message的值为Message元素中的属性name的值,前面加上tns:
4. Binding
为porttype中的operation和message指定一个具体的传输协议(SOAP协议)和数据格式
&wsdl:binding&name=&WSDLFileSOAP&&type=&tns:WSDLFile&&
&&&&&soap:binding&style=&document&&transport=&http://schemas.xmlsoap.org/soap/http&/&
&&&&&wsdl:operation&name=&Operation&&
&&&&&&&soap:operation&soapAction=&/WSDLFile/Operation&/&
&&&&&&&wsdl:input&
&&&&&&&&&soap:body&use=&literal&/&
&&&&&&&/wsdl:input&
&&&&&&&wsdl:output&
&&&&&&&&&soap:body&use=&literal&/&
&&&&&&&/wsdl:output&
&&&&&/wsdl:operation&
&&&/wsdl:binding&
同样的binding的属性name的值在所有的binding的name中是唯一的。此时binding是通过type和porttype进行绑定的,type的值为porttype的name的值在前面加上tns:。然后binding中的子元素wsdl:operation&参照&上面的operation,只是对每一个元素进行了SOAP绑定。
除了这些,在上面的示例中我们还看到有&soap:binding,soap:operation,soap:body等,这些的作用就是将soap协议绑定到接口上,因为在传输的过程中是按照soap协议传输的。
首先看soap:binding,其style的值就是operation的type属性的默认值,所以在wsdl:operation中我们可以不指定type属性。接下来是soap:operation,soapAction指定了消息请求的地址,也就是消息发送到哪个接口或者操作方法。还有就是soap:body指定了消息部分在SOAP协议中是以什么方式传输的。其中use属性是必须的,除此之外还有parts,encodingstyle和namespace属性,但是这几个不是必须的。use属性的值有两个literal和encoded,以此判断消息部分是否使用某种编码规则进行编码,或者定义一种具体的模式。
在实际应用中SOAP协议对于开发者来说是透明的,编程语言中都将SOAP协议封装成了具体的函数来供我们开发调用。如果想要详细了解SOAP协议的机制,可以参考
定义了链接web&service的地址,这个地址就是一个HTTP&URL
&wsdl:service&name=&WSDLFile&&
&&&&&wsdl:port&binding=&tns:&WSDLFileSOAP&&name=&WSDLFileSOAP&&
&&&&&&&soap:address&location=&/&/&
&&&&&/wsdl:port&
&/wsdl:service&
Port的name值在所有的Port的name中是唯一的。属性binding的值为上面binding元素中的name的值前面加上tns:
这里需要注意的是一个Port只能指定一个address,并且在port中除了address不能包含其他的元素。
6. Service
可以理解为一组相关的port
&wsdl:service&name=&WSDLFile&&
&&&&&wsdl:port&binding=&tns:&WSDLFileSOAP&&name=&WSDLFileSOAP&&
&&&&&&&soap:address&location=&/&/&
&&&&&/wsdl:port&
&/wsdl:service&
同样其name值在所有的service的name中是唯一的。在一个service下面的一组port是有关系的。一、每个port之间不能相互通信;二、如果一个service中的多个port共享一个porttype,但是每个port又有不同的address和binding,那么这些port需要提供等价的行为,以便WSDL文档可以根据某个标准来选择相应的port进行通信。三、因为这些port提供的信息有一定的关联性,所以可以根据这些port了解一个service的porttype。
以上就是WSDL1.1版本的格式,在WSDL2.0中除了去掉了Message这一项外,而且还替换了port&Type&为Interface。由于我在平时使用的时候,都是用的WSDL1.1,没有使用过2.0版本,所以我对此还不是很了解。待我好好研究研究2.0,之后再为大家奉上WSDL2.0的版本。当然如果大家有什么好的建议,也欢迎在下面留言,大家共同讨论,共同进步。
除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处
本文地址:
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
扫一扫,关注我们哦!
Design By 迹忆

我要回帖

更多关于 php soap wsdl 的文章

 

随机推荐