WSDL: 描述你的Web服务

柴晓路

2001-8-13

本文最初由 IBM developerWorks 中国网站发表,其网址是
http://www.ibm.com/developerWorks/cn/

Web Service “Stack”

在我的先前的文章中,我已经介绍过Web服务的整个技术体系Web Service “stack”,如下图:

???

???

Management

Quality of Service

Security

Routing, Reliability and Transaction

???

Workflow

WSFL

Service Discovery, Integration

UDDI

Service Description

WSDL

Messaging

SOAP

Transport

HTTP, FTP, SMTP

Internet

IPv4, IPv6

其中,绿色部分是先前已经定义好的并且广泛使用的传输层和网络层的标准:IP、HTTP、SMTP等。而蓝色部分是目前开发的Web服务的相关标准协议,包括服务调用协议SOAP、服务描述协议WSDL和服务发现/集成协议UDDI,以及服务工作流描述语言WSFL。而橙色部分描述的是更高层的待开发的关于路由、可靠性以及事务等方面的协议。黄色部分是各个协议层的公用机制,这些机制一般由外部的正交机制来完成。

其中,一个可以使用的Web服务应当按照需要选用若干层次的功能,而无需所有的特性。但是无论如何为了实现一个一般意义上的Web服务,具备Web服务的基础特性:跨平台调用和接口可机器识别,那么必需使用WSDL和SOAP。SOAP是用来最终完成Web服务调用的,而WSDL则是用于描述如何使用SOAP来调用Web服务的。

WSDL 是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。

在具体使用中,我们可以对 WSDL 进行扩展(类似SOAP的可扩展性),这样无论通信时使用何种消息格式或网络协议,都可以对服务访问点及其使用的消息格式进行描述。在WSDL的框架中,可以使用任意的消息格式和网络协议,如同SOAP中可以使用任意的网络协议一样。在WSDL规范中,定义了如何使用SOAP消息格式、HTTP GET/POST消息格式以及MIME格式来完成Web服务交互的规范。

WSDL概述

由于通信协议和消息格式在 Web 技术圈子里已经达到了标准化,我们知道在通常的开发过程中,对于对象的Interface一定具备相应的SDK描述文档,Web服务也是一种对象,只不过它是被部署在Web上而已。很自然的,我们也完全需要有对Web服务这个对象的界面的SDK描述文档。然而这两者又不尽相同,一来目前在Web上的应用已经完全接受了XML这个基本的标准,基本上所有新出台的技术都是基于XML标准的,二来Web服务的目标是即时装配,松散耦合以及自动集成的,这意味着SDK描述文档应当是具备被机器识别的能力的。

也就是说,对于使用标准化的消息格式/通信协议的Web服务,它需要以某种结构化的方式(即XML)对Web服务的调用/通信加以描述,而且实现这一点也显得非常重要,这是Web服务即时装配的基本保证。WSDL正是这样一种描述语言,WSDL 定义了一套基于 XML的 语法,将Web服务描述为能够进行消息交换的服务访问点的集合,从而满足了这种需求。WSDL 服务定义为分布式系统提供了可机器识别的SDK文档,并且可用于描述自动执行应用程序通信中所涉及的细节。

WSDL 文档将Web服务定义为服务访问点或端口的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;而端口类型,指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web访问地址与可再次使用的绑定相关联,可以定义一个端口,而端口的集合则定义为服务。因此,WSDL 文档在Web服务的定义中使用下列元素:

Ÿ         Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。

Ÿ         Message – 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。

Ÿ         Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。

Ÿ         Port Type – 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。

Ÿ         Binding - 特定端口类型的具体协议和数据格式规范的绑定。

Ÿ         Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。

Ÿ         Service - 相关服务访问点的集合。

大家可以参考下图,来理解一下WSDL文档的结构组织:

其中,Types是一个数据类型定义的容器,包含了所有在消息定义中需要的XML元素的类型定义,我将在今后的文章中结合XML Schema来详细说明如何进行类型定义。

Message具体定义了在通信中使用的消息的数据结构,Message元素包含了一组Part元素,每个Part元素都是最终消息的一个组成部分,每个Part都会引用一个DataType来表示它的结构。Part元素不支持嵌套(可以使用DataType来完成这方面的需要),都是并列出现。

PortType具体定义了一种服务访问入口的类型,何谓访问入口的类型呢?就是传入/传出消息的模式及其格式。一个PortType可以包含若干个Operation,而一个Operation则是指访问入口支持的一种类型的调用。在WSDL里面支持四种访问入口调用的模式:1) 单请求; 2) 单响应; 3) 请求/响应; 4) 响应/请求。在这里请求指的是从客户端到Web服务端,而响应指的是从Web服务端到客户端。PortType的定义中会引用消息定义部分的一个到两个消息,作为请求或响应消息的格式。比如,一个股票查询的访问入口可能就会支持两种请求消息,一种请求消息中指明股票代码,而另一种请求消息中则会指明股票的名称,响应消息可能都是股票的价格等等。

以上三种结构描述了调用Web服务的抽象定义,这三部分与具体Web服务部署细节无关,是可复用的描述(每个层次都可以复用)。如果与一般的对象语言做比较的话,这部分可以堪称是IDL描述的对象,描述了对象的接口标准,但是到底对象是用哪种语言实现,遵从哪种平台的细节规范,被部署在哪台机器上则是后面的元素所描述的。

Service描述的是一个具体的被部署的Web服务所提供的所有访问入口的部署细节,一个Service往往会包含多个服务访问入口,而每个访问入口都会使用一个Port元素来描述。

Port描述的是一个服务访问入口的部署细节,包括通过哪个Web地址(URL)来访问,应当使用怎样的消息调用模式来访问等。其中消息调用模式则是使用Binding结构来表示。

Binding结构定义了某个PortType与某一种具体的网络传输协议或消息传输协议相绑定,从这一层次开始,描述的内容就与具体服务的部署相关了。比如可以将PortType与SOAP/HTTP绑定,也可以将PortType与MIME/SMTP相绑定等。

在介绍了WSDL的主要元素之后,大家会发现,WSDL的设计理念完全继承了以XML为基础的当代Web技术标准的一贯设计理念:开放。WSDL允许通过扩展使用其他的类型定义语言(不光是XML Schema),允许使用多种网络传输协议和消息格式(不光是在规范中定义的这些:SOAP/HTTP,HTTP-GET/POST以及MIME等)。同时WSDL也应用了当代软件工程中的复用理念,分离了抽象定义层和具体部署层,使得抽象定义层的复用性大大增加。比如我们可以先使用抽象定义层为一类Web服务进行抽象定义(比如UDDI Registry,抽象定义肯定是完全一致的遵循了UDDI规范),而不同的运营公司可以采用不同的具体部署层的描述结合抽象定义完成其自身的Web服务的描述。

WSDL 文档示例

下例是一个提供股票报价的简单Web服务的 WSDL 定义。该服务支持名为 GetLastTradePrice 的单一操作,这个操作是通过在 HTTP 上运行 SOAP 1.1 协议来实现的。该请求接受一个类型为字符串的 tickerSymbol,并返回类型为浮点数的价格。

<?xml version="1.0"?>

<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote.wsdl"

xmlns:tns="http://example.com/stockquote.wsdl"

xmlns:xsd1="http://example.com/stockquote.xsd"

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns="http://schemas.xmlsoap.org/wsdl/">

<types>

<schema targetNamespace="http://example.com/stockquote.xsd"

xmlns="http://www.w3.org/1999/XMLSchema">

<element name="TradePriceRequest">

<complexType>

<all>

<element name="tickerSymbol" type="string"/>

</all>

</complexType>

</element>

<element name="TradePriceResult">

<complexType>

<all>

<element name="price" type="float"/>

</all>

</complexType>

</element>

</schema>

</types>

上面这部分是数据类型的定义,其中为定义了两个元素的结构:

Ÿ         TradePriceRequest(交易价格请求): 将该元素定义为包含一个字符串元素(tickerSymbol)的复合类型元素。

Ÿ         TradePriceResult(交易价格): 将该元素定义为一个包含一个浮点数元素(price)的复合类型元素。

<message name="GetLastTradePriceInput">

<part name="body" element="xsd1:TradePriceRequest"/>

</message>

<message name="GetLastTradePriceOutput">

<part name="body" element="xsd1:TradePriceResult"/>

</message>

这部分是消息格式的抽象定义,其中定义了两个消息格式:

Ÿ         GetlastTradePriceInput(获取最后交易价格的请求消息格式): 由一个消息片断组成,该消息片断的名字是body,包含的具体元素类型是TradePriceRequest。(前面已经定义过了)

Ÿ         GetLastTradePriceOutput(获取最后交易价格的响应消息格式) : 由一个消息片断组成,该消息片断的名字是body,包含的具体元素类型是TradePriceResult。(前面已经定义过了)

<portType name="StockQuotePortType">

<operation name="GetLastTradePrice">

<input message="tns:GetLastTradePriceInput"/>

<output message="tns:GetLastTradePriceOutput"/>

</operation>

</portType>

这部分定义了服务访问点的调用模式的类型,表明StockQuoteService的某个入口类型是请求/响应模式,请求消息是GetlastTradePriceInput,而响应消息是GetLastTradePriceOutput。

<binding name="StockQuoteSoapBinding"

type="tns:StockQuotePortType">

<soap:binding style="document"

transport="http://schemas.xmlsoap.org/soap/http"/>

<operation name="GetLastTradePrice">

<soap:operation

soapAction="http://example.com/GetLastTradePrice"/>

<input>

<soap:body use="literal"

namespace="http://example.com/stockquote.xsd"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</input>

<output>

<soap:body use="literal"

namespace="http://example.com/stockquote.xsd"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</output>

</soap:operation>

</operation>

</soap:binding>

</binding>

这部分将服务访问点的抽象定义与SOAP HTTP绑定,描述如何通过SOAP/HTTP来访问按照前面描述的访问入口点类型部署的访问入口。其中规定了在具体SOAP调用时,应当使用的soapAction是”http://example.com/GetLastTradePrice”,而请求/响应消息的编码风格都应当采用SOAP规范默认定义的编码风格” http://schemas.xmlsoap.org/soap/encoding/”。

<service name="StockQuoteService">

<documentation>股票查询服务</documentation>

<port name="StockQuotePort" binding="tns:StockQuoteBinding">

<soap:address location="http://example.com/stockquote"/>

</port>

</service>

</definitions>

这部分是具体的Web服务的定义,在这个名为StockQuoteService的Web服务中,提供了一个服务访问入口,访问地址是”http://example.com/stockquote”,使用的消息模式是由前面的binding所定义的。

按照这个WSDL文档的描述,在具体Web服务的使用中,具体发生的SOAP交互可能如下面所示:

SOAP消息请求

POST /StockQuote HTTP/1.1

Host: example.com

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

SOAPAction: " http://example.com/GetLastTradePrice "

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>

<m:TradePriceRequest

xmlns:m="http://example.com/stockquote.xsd">

<tickerSymbol>MSFT</tickerSymbol >

</m:TradePriceRequest>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

SOAP消息响应

HTTP/1.1 200 OK

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

<SOAP-ENV:Body>

<m:TradePriceResult

xmlns:m=" http://example.com/stockquote.xsd ">

<price>74.5</price>

</m:TradePriceResult >

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

小结

在本文中,我简单介绍了WSDL规范的用途,基本结构和使用方法,在之后,我将就WSDL的元素结构细节进行展开,同时就如何在UDDI Registry中应用WSDL展开讨论。

WSDL: 描述你的Web服务相关推荐

  1. 描述 Web 服务:WSDL

    Web 服务描述语言(Web Services Description Language,WSDL)是一种基于 XML 的格式,它正在成为一种业界标准,用于以与实现无关的方式描述 Web 服务.将创建 ...

  2. 使用 UDDI 的 Web 服务描述和发现(第一部分)

    UDDI - Web 服务的全球注册表 UDDI 是一个公共的注册表,旨在以一种结构化的方式来保存有关各公司及其服务的信息.通过 UDDI,人们可以发布和发现有关某个公司及其 Web 服务的信息.这些 ...

  3. Web服务和WSDL简介

    在"使用 WSDL 部署 Web 服务"系列中,Bilal 将研究创建.部署和发布 Web 服务的所有主要技术方面 - 从 Web 服务描述语言(WSDL),到简单对象访问协议(S ...

  4. 以 OSGi 包的形式开发和部署 Web 服务

    简介 OSGi 是一个面向 Java 的动态模块系统.OSGi Alliance(请参见 参考资料)发布了模块系统的规范.一些受欢迎的 OSGi 容器包括 Eclipse Equinox(请参见 参考 ...

  5. JAVA与.NET的相互调用——通过Web服务实现相互调用

    JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候 ...

  6. ssis 计划任务_SSIS Web服务任务

    ssis 计划任务 SQL server Integration services provides us with SSIS Web Service Tasks which assist us to ...

  7. 第三十五 ASP.NET和Web服务(二)

    *摘要 .异步Web服务 .Web服务中的事务处理 .Web服务中的缓存技术 .WSE技术 * Web服务 .Web Service是在Internet上进行分布式计算的基本构造块. .WebServ ...

  8. 六、Web服务体系结构

    一.Web服务概述 什么是Web服务? Web服务作为一种新兴的Web应用模式,是一种崭新的分布式计算模型,是Web上数据和信息集成的有效机制. Web服务就像Web_上的构件编程,开发人员通过调用W ...

  9. 新发现的Web服务-----免费服务

    [新] 中文<->英文双向翻译WEB服务获得标准数据 Endpoint:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx Di ...

最新文章

  1. 怎么获得combobox的valueField值
  2. 中国饲用微生态制剂行业十四五研发方向与专项应用调研报告2022年
  3. 面向对象编程(第四篇)
  4. Oracle一致性读(Consistent Read)的原理
  5. 【Tiny4412】烧写最小文件系统到SD卡
  6. Android之gravity=“center_vertical“和layout_gravity=“center“的效果
  7. 两个指针变量可以相减
  8. 三星出售比亚迪1.6%股份,价值约1.5万亿韩元
  9. 软件工程习题2第三小题
  10. marshaller java 乱码_Marshaller根据对象生成xml文件
  11. 【语音采集】基于matlab GUI语音信号采集【含Matlab源码 291期】
  12. java中utilities类_Java SwingUtilities类
  13. python手写lfw数据集转pair.txt形式
  14. python查看微信撤回消息_python轻松实现查看微信撤回消息代码实例
  15. BZOJ4567[Scoi2016]背单词
  16. 你值得拥有!-阿里P8架构师荣耀典藏:Java多线程与Socket实战微服务框架笔记
  17. 太阳直射点纬度计算公式_高中地理——每日讲1题(太阳直射点、太阳高度角、二十四节气)...
  18. 还敢随便抄?Stack Overflow上最火这段代码有Bug!
  19. 预排版标记pre/pre在网页中原封不动地都显示出来,实体符号
  20. Foxtable编程

热门文章

  1. MySQL高性能及性能优化技巧---更适合开发人员
  2. Error getting authority: Error initializing authority: Could not connect: No such file or directory
  3. 分销系统开发|分销模式玩法机制详解
  4. php widgets,Yii框架小部件(Widgets)用法实例详解
  5. 提高 Banner 广告点击率的 14 个设计建议
  6. iwatch可以用计算机吗,Apple Watch能接电脑么?连接方法教程
  7. 两个iwatch互动心跳_iWatch检测到男子心跳出现异常!没想到救了他一命!
  8. 两个月复习一鼓作气拿下CISM
  9. 谈一谈独立成分分析(ICA)降噪应用时存在的问题
  10. 贴吧评论敏感词识别及情感分析初级实现之评论获取