webservice客户端调用(Axis2)

最近涉及到一个功能需要调用其他公司开发的Webservice接口,初出茅庐,也是第一次接触,记下自己的心路历程。通了的时候真是感动尿了~
1.第一次接触Webservice。查了下java可以使用哪些方法进行调用,大致分为了3种(有人说4种),众说纷纭,反正也是各种都有,眼花缭乱。
2.其实提供接口的公司已经做好了wsdl文件,我就选了种将wsdl文件转成本地类,然后调用本地类的方式。
对于第一次使用来说,我觉得这种方式还是挺好的。第一,方便,第二,简单
但是,过程中也出现了诸多问题,我会一一列上,给大家做参考。

(1)首先将接口转成本地类
需要去apache的官网下载最新的axis2,地址: http://axis.apache.org/axis2/java/core/download.cgi
下载下来解压,在bin路径下会有个转换的bat文件:wsdl2java.bat,同样也有Linux环境下的wsdl2java.sh。然后在bin路径下打开cmd(在bin文件夹下可以使用shift+鼠标右键,然后选择在此处打开命令窗口),linux的自己用终端,就不一一说了。

如上图,执行wsdl2java.bat带上
-uri(param1替换为调用的webservice接口地址,注意接口地址带有?的在Linux下需要换成".",不然无法识别)
-o (生成的java文件本机位置)
还有其他参数详见: http://rabby.iteye.com/blog/814892
(利用参数生成的单元测试没什么意义)
生成的文件,如下所示:

我们需要的其实就只有下方stu结尾的java文件,将文件包括包整个考入工程下,(如果只使用文件,而更改包路径可能出现命名空间问题,我没去试过,到底会不会我也不清楚,知道的可以给我留言)

(2)本地类调用
新建java测试类对接口调用进行测试

	public void query() {
		CertQueryImplServiceStub caquery = null;
		try {
			//1.new生成的本地类对象
			caquery = new CertQueryImplServiceStub();
			
			//2.这涉及到出现的一个问题,下面会说
			caquery._getServiceClient().getOptions().
				setProperty(org.apache.axis2.Constants.Configuration.DISABLE_SOAP_ACTION, true);
			//3.new内部类的参数集合
			CertQueryImplServiceStub.QueryCertByNameAndMultiNumber
			 	query = new CertQueryImplServiceStub.QueryCertByNameAndMultiNumber();
			//设置参数
			query.setUserName("1");
			query.setPassWord("2");
			query.setOrganizationName("3");
			query.setUserNumber("4");
			//发请求需要的类
			CertQueryImplServiceStub.QueryCertByNameAndMultiNumberE
		 	queryE = new CertQueryImplServiceStub.QueryCertByNameAndMultiNumberE();
			//设置请求参数
			queryE.setQueryCertByNameAndMultiNumber(query);
			//发送请求,获取请求结果
			CertQueryImplServiceStub.QueryCertByNameAndMultiNumberResponseE
			resE = caquery.queryCertByNameAndMultiNumber(queryE);
			//将结果请求提取出来
			CertQueryImplServiceStub.QueryCertByNameAndMultiNumberResponse 
			res = resE.getQueryCertByNameAndMultiNumberResponse();
			//取出我们需要的结果集
			CertQueryImplServiceStub.CertQueryResult
			result = res.get_return();
			//打印结果集中任意一值,看看是否正确
			System.out.println(result.getErrMsg());
		} catch (AxisFault e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}


对方提供的接口以及参数和结果都比较多,有些代码需要根据情况而定,大体复杂的也就这样了,如果只是sayHello的话就简单多了。。。

(3)遇到的问题

第一个就是jar包问题,需要的jar包基本上都在下载的axis2/lib下能找到,没有的就百度下载一个,然后注意neethi这个jar包在很多项目里已经用到了,所以不用导入,我测试的时候还是导入了,但是发现方法not match,然后发现自己的工程下有这么个jar包,但是呢,版本较低,所以只能删了低版本的,然后通过!

第二个问题就是出现了
org.apache.axis2.AxisFault: The given SOAPAction这样的报错,对于第一次使用的我来说真是莫名其妙啊,好在百度强大,查了很多,终于查出来了,有人说是需要改动服务端,具体就不清楚了,对方只提供了接口,所以我只能改自己的,然后翻到需要在代码中添加如下所示的代码:
caquery._getServiceClient().getOptions().
				setProperty(org.apache.axis2.Constants.Configuration.DISABLE_SOAP_ACTION, true);
,我不知道为什么,反正我的能用了,以后再去深究。
还有其他一些有点白痴的问题就不列上来了,羞~

(4)其实代码上还有些许不足,没有超时判断之类的,以后再改进吧!

猜你喜欢

转载自equals.iteye.com/blog/2183848