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文件中包含下面七项内容
1. types
可以认为是一个容器,容器里的内容是数据类型的描述,当然需要借助于xml schema 来达到这一目的。那么这个容器的格式如下
2. 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):
对于message这一项在wsdl2.0中已经去掉了。
3. port type
由终端定义的一系列的抽象方法,其格式如下
同样的,port type 的属性name的值不同于整个wsdl文档中其他的prottype的name的值。
wsdl有四种传递方式:
one-way: 终端服务接受消息
request-response:终端服务接受消息,并且发送相关的消息给客户端
solicit-response:终端发送一个消息,并且接受一个相关消息
notification:终端服务发送一个消息
对于input和output的name的值来说,每一个input或者output的name的值在所有的input和output中是唯一的。当然wsdl也提供了默认的命名规则。此外对于input或者output的属性message的值为message元素中的属性name的值,前面加上tns:
4. binding
为porttype中的operation和message指定一个具体的传输协议(soap协议)和数据格式
同样的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协议的机制,可以参考
5. port
定义了链接web service的地址,这个地址就是一个http url
port的name值在所有的port的name中是唯一的。属性binding的值为上面binding元素中的name的值前面加上tns:
这里需要注意的是一个port只能指定一个address,并且在port中除了address不能包含其他的元素。
6. service
可以理解为一组相关的port
同样其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的版本。当然如果大家有什么好的建议,也欢迎在下面留言,大家共同讨论,共同进步。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
powershell 通过网络复制文件
发布时间:2024/02/05 浏览次数:221 分类:编程语言
-
本教程将教你使用 powershell 通过网络共享复制文件。powershell 是一个强大的工具,可让你从其命令行界面执行不同的文件和文件夹操作。
在批处理脚本中映射网络驱动器
发布时间:2023/08/14 浏览次数:607 分类:操作系统
-
本文将讨论如何在批处理脚本中映射网络驱动器。在批处理脚本中映射网络驱动器 为此,我们将看到同一命令的三种格式。 但是,命令的一般格式是:
java 调用 webservice
发布时间:2023/07/17 浏览次数:107 分类:java
-
本文将教我们如何从 java 类进行 soap webservice 调用。soap 网络服务 soap 代表简单对象访问协议。 可以通过这个基于 xml 的接口来访问 webservice。
使用 docker 网络主机命令
发布时间:2023/04/18 浏览次数:140 分类:docker
-
在本文中,我们将学习如何使用 --network 命令将容器添加到主机网络。 如果我们不使用此命令指定网络,我们还将了解如何将容器添加到默认网络。
在 docker compose 中添加网络模式
发布时间:2023/04/17 浏览次数:899 分类:docker
-
默认情况下,单个网络由 docker compose 在我们的应用程序中创建,并将每个容器作为服务添加到那里。 网络上的每个容器都可以被单个网络上的容器访问和找到。
flask 网络套接字
发布时间:2023/03/27 浏览次数:171 分类:python
-
通过这个解释,我们将了解 websocket 是什么以及它是如何在客户端和服务器之间工作的。我们还将学习如何借助 flask 中的 flask_socketio 模块制作一个实时聊天应用程序。