webservice客户端调用(Axis2)

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

(1)首先将接口转成本地类
需要去apache的官网下载最新的axis2,地址:[color=blue]http://axis.apache.org/axis2/java/core/download.cgi[/color]
下载下来解压,在bin路径下会有个转换的bat文件:wsdl2java.bat,同样也有Linux环境下的wsdl2java.sh。然后在bin路径下打开cmd(在bin文件夹下可以使用shift+鼠标右键,然后选择在此处打开命令窗口),linux的自己用终端,就不一一说了。
[img]http://dl2.iteye.com/upload/attachment/0105/8813/472ccc3f-6339-36fb-ae75-a11debaedd33.jpg[/img]
如上图,执行wsdl2java.bat带上
-uri(param1替换为调用的webservice接口地址,注意接口地址带有?的在Linux下需要换成".",不然无法识别)
-o (生成的java文件本机位置)
还有其他参数详见:[color=blue]http://rabby.iteye.com/blog/814892[/color]
(利用参数生成的单元测试没什么意义)
生成的文件,如下所示:
[img]http://dl2.iteye.com/upload/attachment/0105/8815/d7b320a7-92ae-3fb4-8204-ce7587b75b7e.jpg[/img]
我们需要的其实就只有下方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)其实代码上还有些许不足,没有超时判断之类的,以后再改进吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值