您的位置:首页 > 其它

WEB服务动态解析及调用技术的实现(基于WSDL4J及SAAJ)

2007-04-19 16:58 666 查看

基于WSDL4J的Web服务解析

WSDL4J简介
WSDL是用来描述一个异构组件如何被程远程未知平台调用的(描述了SOAP消息的格式),在WEB服务中起到了服务端和服务客户端之间的契约作用。
而WSDL4J是用来解析WSDL文件的技术,很多WEB服务的底层实现都用了该技术。
但在传统的WEB服务实现方案中,该技术作为底层实现被屏蔽。而我们的项目为了能够动态的调用异构平台的未知服务,必须使用该技术。
解析流程
WSDL文档是用来描述异构组件如何被调用的,具体来说就是描述了SOAP消息是什么样的,为了能够动态调用未知服务,必须对此文档进行解析。
具体的解析过程如图5.2所示。

图5.1 WSDL文档解析过程
先从Service标签中取得一些必要信息,再解析其所有Port子元素,再解析Port对应的Binding再解析Binding所绑定的所有Operation元素,解析Operation所对应的输入Message和输出Message。
具体实现
CACTUS系统中与WSDL文档解析相关的J***A类
用com.swc.se.domain.Service类描述WSDL文件中Service元素,即用来装载从Service元素和其子元素中解析出来的数据。同时,com.swc.se.domain.Service类也对应一个远程服务。
用com.swc.se.domain.Operation类描述WSDL文件中Operation元素,即用来装载Operation元素和其子元素中解析出来的数据。同时,com.swc.se.domain.Operation类对应一个远程服务的某个操作,也对应系统中发出去的一条SOAP消息。
用com.swc.se.domain.Parameter类描述WSDL文件中Message元素的子元素,即用来装载从Message元素的子元素中解析出来的数据。同时,com.swc.se.domain.Parameter对应一个操作的参数中的某一个子元素(例如:Message是一个Person,则Parameter可能是Person的一个Name),也对应用户从网页中输入的某一条数据,但多个Parameter对应一个Message,一个Message即是SOAP消息的有效负载。
com.swc.se.domain.Service中含有java.util.List类型属性,List中存放的是多个com.swc.se.domain.Operation类,以表示一个服务有多个操作。
com.swc.se.domain.Operation类中有两个java.util.List类型属性,分别表示输入和输出参数,List中存放的是多个com.swc.se.domain.Parameter类。表示输入和输出参数有多个基本元素构成。
对应关系图如下
图5.2 WSDL文档解析相关类
具体解析过程
解析Service元素
读取出其下面的所有Port元素。
解析Port元素
读取出其address元素,在构建SOAP时,它是SOAP的目标URL,将会把它放在每一个Operation类中(因为Operation类对应一条SOAP消息)。读取出其对应的Binding元素。
解析Binding元素
读取其binding元素的style,将其放入每一个Operation中,它对应的是调用方式是”document”或”rpc”。读取出它所绑定的所有Operations元素。
解析Operation元素
读取其name属性,作为Operation类的targetmethodname,将是SOAP消息中的方法名。读取其soapAction,作为SOAP消息的目标命名空间。读取它的bindinginput和bindingoutput,分别描述了输入SOAP消息和输出SOAP消息。 将每个Operation放入Service对象中。
解析bindinginputbindingoutput
读取其encodingstyle将其放入其对应的Operation中,SAAJ需要据此设置SOAP的编码类型。读取它们各自对应的message元素。将inmessage放入Operation中,用于
调用时构建SOAP消息的有效负载.
解析message元素
message元素,是WSDL中最复杂的部分,它描述了SOAP消息的有效负载。首先,判断其是不是复杂类型,如果是,读出其名字设置入Operation中(因为对于含复杂类型参数的操作的调用需要将其作为参数的父标签,操作名的子标签)。用参数的每一个子元素构建Parameter对象,并将其放入Operation的List中。当调用服务的操作时,只需将用户输入与Parameter相对应,并将用户输入的值设为Parameter的Value属性即可。

基于SAAJ的Web服务动态调用

SAAJ简介
SAAJ是WEB服务API,正如JDOM处理XML文件一样,SAAJ是从底层处理SOAP消息的,它可以以树的形式构建SOAP消息。和WSDL4J一样,它常用于做底层实现,传统的WEB服务客户端构建时很少使用。
使用SAAJ的必要性
针对需求,我们需要实现的功能是:只知道异构平台服务的WSDL位置,但需要动态匹配用户输入数据和SOAP消息的有效负载,并构建SOAP发送到并不了解的服务。传统的客户端构建方式(JAX-RPC)难以实现以上功能,而SAAJ恰恰可以。
传统WEB服务客户端的构建
1.构建占位程序
通过IDE或命令行调用WSDL与J***A之间的映射来构建客户端,此时,调用客户端即可调用WEB服务。
优点:实现WEB服务应用比较简单,是传统的WEB服务应用最常用的方式之一。
缺点:不能实现动态调用,需要先构建客户端,才能利用客户端来调用远程服务。
2动态调用
之所以叫做动态调用,是因为它不需要先构建占位程序,但调用过程中需要知道远程服务的细节。
优点:不必构建占位程序,实现了一定的动态性。
缺点:与远程服务的关联太紧密,耦合度太高。
3动态接口
优点:实现了对于服务的动态调用,通过一些字符串参数数据即可实现对于服务的调用。
缺点:对于复杂类型参数的支持不是很好,需要先构建参数的J***A类描述(WSDL2J***A)至调用端,对于服务的调用需要这个类的支持。这在一定程度上不符合 它的名字“动态调用”,因为无法实现含复杂类型参数操作的服务的动态调用。
以上是WEB服务供应商支持的最常用的三种构建客户端方式。但它们公用的缺点:耦合度太高,您可以在具体某一个应用整合过程中用得很好。但是,以上调用过程只能在调用方对于远程服务从人为的角度特别了解的情况下才能实现,不能实现我们想要的功能。
利用SAAJ技术,根据WSDL4J解析出来的结果和用户输入自行构建SOAP消息恰恰可以解决此问题。
SOAP消息构建和调用的实现
简述
SOAP文档结构简单,利用SAAJ构建起来也比较方便。但我们需要将用户从网页中输入的数据作为SOAP的有效负载发送至异构平台的服务,如何来构建这个有效负载呢?按照什么样的格式将用户输入的数据放入SOAP的有效负载中呢?格式可以从解析WSDL文档过程中知道,但怎么来匹配用户的输入数据呢?这时就需要以WSDL中解析出来的参数名称作为用户从网页中输入的文本框的名字,从而匹配了每一个子参数的值,然后即可构建SOAP消息的有效负载。然后将SOAP消息发送至远程平台。
调用后,将返回一个SOAP消息返回值,我们需要解析,并将结果在网页中呈现给客户,我们利用了JDOM技术,根据从WSDL中解析出的返回信息来提取SOAP中的返回值,最终呈现给用户。
详细过程
发送SOAP消息

图2.4发送SOAP消息页面
这是用户进入某一个具体服务的页面,用户输入一些值后,即可执行某个操作。我们将用户的输入文本框名字设为WSDL中某个参数的名字,这样,我们可按此名字读取用户输入值,将每一个值都构建成com..swc.se.domain.Parameter对象,然后放入此操作所对应的com.swc.se.domain.Operation的输入参数List中。此时,List与WSDL中的Message已完全对应,而且List中的Parameter的name与Message中的对应的复杂类型的子元素的name相同,这样,将Parameter的value,即用户的输入值放入Message的子元素的文本值中,并将Message构建成含子Element的Element元素中。此时,SOAP消息的有效负载已以DOM的形式构建完毕,并且代表了用户的愿望。利用SAAJ技术将此DOM构建入SOAP的BODY元素下作为消息的有效负载,发送至远程,触发了远程异构平台的组件的运行。
解析SOAP消息
远程组件运行完毕会返回一个SOAP消息,用户恰恰需要查看此数据,我们需要呈现在页面上。

图2.5 SOAP响应消息页面
这是服务的执行结果,我们如何将SOAP消息的返回信息以一定的格式呈现给用户呢?在解析WSDL时,我们已将服务的所有操作的返回值信息都进行了保存。com.swc.se.domain.Operatio中的一个List即存放了此信息,即com.swc.se.domain.Parameter,而SOAP返回值信息的有效负载的元素名恰恰与每一个Parameter的name属性相对应,利用JDOM根据name在返回SOAP中取信息,并且以一定的格式呈现给用户即可。
这样,即实现了动态的根据用户输入调用远程的异构的未知服务。屏蔽了底层的复杂性,这样用户通过网页操作,非常方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: