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的自己用终端,就不一一说了。
![](http://dl2.iteye.com/upload/attachment/0105/8813/472ccc3f-6339-36fb-ae75-a11debaedd33.jpg)
如上图,执行wsdl2java.bat带上
-uri(param1替换为调用的webservice接口地址,注意接口地址带有?的在Linux下需要换成".",不然无法识别)
-o (生成的java文件本机位置)
还有其他参数详见: http://rabby.iteye.com/blog/814892
(利用参数生成的单元测试没什么意义)
生成的文件,如下所示:
![](http://dl2.iteye.com/upload/attachment/0105/8815/d7b320a7-92ae-3fb4-8204-ce7587b75b7e.jpg)
我们需要的其实就只有下方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)其实代码上还有些许不足,没有超时判断之类的,以后再改进吧!