`
tenn
  • 浏览: 565279 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

[转]一个简单的WSDL文档(下)

阅读更多
虽然发布的服务很简单,Axis帮我们生成的WSDL文档看起来却是比较复杂的,之所以这样的主要原因是WSDL要考虑到兼容各种实现和具有可扩展性,这就像我们使用一些框架做开发会使代码总量增加,而好处是使逻辑更加清晰。这篇帖子的上半部分介绍了WSDL里常用到的名称空间,现在就来说说WSDL里各元素的含义。

一个WSDL文档里一般包含<types>、<message>、<portType>、<binding>和<service>这几个元素,其中<types>、<message>和<portType>可以看作抽象的接口定义,而<binding>和<service>是具体的实现,注:有些时候也把<binding>看作接口的一部分。你也许看过一些WSDL把这两部分分开写在两个xml文件里,并在其中一个文件里引入(import)另一个的情况,这也是为什么要区分接口和实现的原因之一。在现实世界里,接口部分很可能是由某个组织(例如某行业协会)制定好的,该组织的成员在发布自己的Web服务时都要引入它,从而达到统一标准的目的。

<types>标签用来定义Web服务里用到的,XML Schema定义的数据类型以外的自定义数据类型,对于我们自定义的类(Book),会对应到一个<complexType>,其中用<element>元素指定每个参数的类型。JAX-RPC规范中规定了Java语言的数据类型到XML Schema数据类型的映射,例如int<->xsd:int、java.lang.String<->xsd:string等等,还有数组的映射方式。

<message>标签定义Web服务里的消息,最常见的就是请求和响应消息。<message>中可以有<part>元素,它对应Java类中各个方法的参数或返回值,例如addBook()方法有一个Book类型的参数,则在WSDL中会有<part name="book" type="tns1:Book"/>的描述。

<portType>标签表示一个服务的类型,就是接口的意思了。WSDL里有些概念很容易混淆,比如port和service的区别,我把service理解为有一个具体URL的服务,而port代表某一地址,portType是service的抽象,不知道对不对。我们看一个WSDL文档,一般就该先找<portType>元素,看看这个WSDL代表的Web服务里都有哪些方法,它们的参数和返回值是什么。这些方法是在<portType>里用<operation>元素表示的,<operation>可以有<input>和<output>子元素,表示方法的输入和输出。注意,方法可以是只有输入或只有输出的。

<binding>元素将portType与具体的传输协议绑定。现在,绝大多数都是与SOAP绑定的,对每一个方法的输入和输出,都要指定SOAP的表示方法。JAX-RPC规范规定,SOAP绑定可以有rpc和document两种类型,分别表示远程过程调用和基于消息的方式。use属性可以是encoded或literal,对于前者要支持rpc的方式,对于后者要支持rpc和document的方式,它们使得SOAP消息的格式有所区别,但我还没有仔细研究,你可以参考一下JAX-RPC 1.1版本的6.3-6.4节。又想起另外一个问题,SOAP和HTTP的关系是怎样的,绑定到SOAP就等于绑定到HTTP了吗,应该不是,那么在哪里指定Web服务绑定的应用层协议(HTTP、SMTP等等)呢?(Update: 由transport属性指定应用层协议)

最后,<service>元素通过<port>子元素把服务联系到一个具体的URL,更确切点,应该是把一个已绑定的portType联系到某个URL,这样就知道该把SOAP消息发给哪个服务器了。

我觉得之所以应该花比较多的时间理解WSDL,因为WSDL在整个Web服务中扮演了十分核心的角色,它是对Web服务的一个比较完整的语法上的描述,同时,它还与XML、SOAP以及UDDI都有着非常密切的联系,因此对于我们更好的认识Web服务体系结构是很重要的。虽然现在的Web服务开发工具都能自动进行Java<->WSDL的转换,但理解WSDL对于Web服务的不论是设计、开发还是修改调试都是必要的。

分享到:
评论

相关推荐

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

     上面的命令根据制定URL提供的WSDL文档生成一个C++语法结构的头文件。  如果需要生成一个纯C的头文件,需要一下命令:  $ wsdl2h -c -o quote.h  更多关于WSDL解析器及其选项的细节信息,请参见8.2.10节。  ...

    ZendFramework中文文档

    3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 ...

    node-xmlexact:XmlExact简化了从JavaScript对象创建复杂XML文档的过程,而不会产生XML吸收

    为此,XmlExact需要一个简单的文档定义来描述顺序,应该在其中注入属性和名称空间以及是否应该进行简单的类型转换。 该文档定义可以手工编写,从现有XML构造或使用将WSDL / XSD转换为格式的工具。 创建

    超级有影响力霸气的Java面试题大全文档

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    C#XML入门经典 C#编程人员必备的XML技能.part2

    XSLT &lt;br&gt;8.1 何时使用XSLT 8.1.1 格式化 8.1.2 转换 8.2 XSL语言 8.3 使用XSL 8.4 XSL命名空间 8.5 剖析一个简单的XSL示例 8.5.1 添加处理指令 8.5.2 创建样式表 8.6 创建XSLT样式表...

    java基础题 很全面

    比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办? 22 18. 在weblogic中发布ejb需...

    Java面试宝典2010版

    比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办? 12、在weblogic中发布ejb需涉及...

    最新Java面试宝典pdf版

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    Java面试笔试资料大全

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    JAVA面试宝典2010

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    Java面试宝典-经典

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    java面试题大全(2012版)

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    Java面试宝典2012版

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    Programming C#(第4版)(中文版)part2

    创建一个简单的Windows窗体 328 创建Windows Forms程序 332 XML文档型注释 357 第14章 用ADO.NET访问数据 360 关系型数据库与SQL 360 ADO.NET对象模型 364 开始使用ADO.NET 366 使用OLE DB托管提供程序 369 使用数据...

    java面试宝典2012

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 68 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    Java面试宝典2012新版

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    Programming C#(第4版)(中文版)part3

    创建一个简单的Windows窗体 328 创建Windows Forms程序 332 XML文档型注释 357 第14章 用ADO.NET访问数据 360 关系型数据库与SQL 360 ADO.NET对象模型 364 开始使用ADO.NET 366 使用OLE DB托管提供程序 369 使用数据...

Global site tag (gtag.js) - Google Analytics