用java实现webservice客户端调用

 目前基于java实现webservice客户端调,用的比较多的提供高级接口的封装soap的开源软件有axis,xifre,jaxws,cxf,既提供webservice的发布,又提供webservice的调用的stub生成。使用高层接口,不需要知道SOAP和XML的任何信息,就可以生成和使用一个WebService。对于已经给定的webservice服务端,来完成调用。

 

  如何调用Web Services
  
  客户端:取得服务端的服务描述文件WSDL,解析该文件的内容,了解服务端的服务信息,以及调用方式。根据需要,生成恰当的SOAP请求消息(指定调用的方法,已经调用的参数),发往服务端。等待服务端返回的SOAP回应消息,解析得到返回值。


  服务端:生成服务描述文件,以供客户端获取。接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。根据WSDL和WSML的描述,调用相应的对象来完成指定功能,并把返回值放入SOAP回应消息返回给用户。

 

 

 

客户端stub的生成有以下几种方式

1 axis2
E:/opensource/axis/axis2-1.4.1-bin/axis2-1.4.1/bin/
目录下  wsdl2java.bat -uri http://../../iLON100.WSDL -p packagename -d (xmlbeans adb)  -o client


     ADB:最简单的生成Axis客户端的方法。大部分情况下,这些主要的类都会以内部类的形式创建在stub类中。It is not meant to be a full schema binding application, and has difficulty with structures such as XML Schema element extensions and restrictions。
     XMLBeans:与ADB不同,他是一个全功能的schema编译器。他没有ADB的限制。然而,他也比ADB用起来更复杂。他会产成大量的文件,编程模型不如ADB直观。
     JiBX:他是一个数据绑定框架。他不仅提供了WSDL-JAVA的转换,而且提供了JAVA-XML的转换。JiBX相当灵活,允许你选择类来代表你的实体,但是这个却不好做,但还句话说,如果这些都能建好,那么使用JiBX就更使用ADB一样容易。

    对于简单应用来说ADB已经够用了,如果想用更加强大更加灵活的功能,那么你可能需要使用其他两种方式。但是ADB生成的是一个大类stub,然后所有message以内部类的方式存在,如果webservice服务提供接口非常多的话,导致这个类非常之大,我一个案例中居然该类有40万行代码,根本无法在eclipse中进行操作,CPU占用100%, eclipse无法响应。
axis1
set Axis_Lib=./lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=./src
set Package=packagename
set wsdl_path=iLON100.WSDL
%Java_Cmd% org.apache.axis2.wsdl.WSDL2Java  -o%Output_Path% -p%Package% -ss -sd -d xmlbeans

2 jaxws
wsimport -p packagename -s src -d bin http://../../iLON100.WSDL

3 xfire
java -Djava.ext.dirs=./lib org.codehaus.xfire.gen.WsGen -wsdl http://../../iLON100.WSDL -o client  -p packagename  -overwrite true

4 cxf
wsdl2java.bat -p packagename -ant -cliient -d outputdir wsdlurl

 

 

由于各开源软件对soap协议解析方式不同,生成的的客户端也不同。另外对soap版本可能不匹配,尤其是对于异构的系统来说,兼容性有可能不太好。

 


如果用这些工具生成的工具无法实现通讯,只能在客户端,首先要创建一个Http Connector对象,负责HTTP连接。设定Connector的一些头部信息,比如EndPoinURL和SoapAction等。如果网络连接需要使用代理服务器,那也要在这里设定相关的信息。接着创建SoapSerializer对象,用于生成Soap消息。按照WSDL里定义,把所有参数按顺序序列化,得到一个完整的SOAP请求消息。该Soap消息,作为Payload通过HttpConnector被发送到服务端。最后,生成一个SoapReader对象,负责读取服务端返回的SOAP消息,取得其中的返回值。

 

你可能感兴趣的:(用java实现webservice客户端调用)