公司要将开发一个移动端web项目,本人只会Java,因此就有了和.net编写的WebService产生交互的需求,这几天查找了很多资料,经过同学推荐,使用了axis2来调用.net编写的WebService,具体走过的弯路且听我慢慢讲起:
才开始接触接口这个东西,领导说是我负责表现层的内容,数据交互交给一个编写.net的同事,让他给我提供接口,实现数据安全。那我就只有遵命咯,开始查阅资料看看怎么调用,刚开始不了解axis和axis2的具体用法,以为和别的jar包一样,直接引入,然后开始编程,陷入了这样一个误区之后,发现怎么查资料都是在越走越远。
知道后来看到了这个博客http://cqyqing.iteye.com/blog/1668227,说实话,我看过了很多次,都没有仔细看看,知道我自己下载到了axis1.4,然后测试了一下博客里面的方法,才认识到,原来我理解错了方法。
下面贴一下我自己的axis1.4和axis2.1.5实现的调用WebService的实现
1.axis1.4
因为不知道具体包结构,就全部引入了lib下的jar包
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public class Test {
public static void test() throws Exception {
Service service = new Service();
Call call = null;
try {
call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(
"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx"));
call.setOperationName(new QName("http://WebXml.com.cn/",
"getRegionCountry")); // 两个属性,第一个是命名空间,第二个是调用的方法名
call.setReturnType(XMLType.SOAP_VECTOR); // 设置返回的类型
// ,如果返回值是xml类型,别使用XMLType.SOAP_STRING类型,会报错
call.setUseSOAPAction(true);
call.setSOAPActionURI("http://WebXml.com.cn/getRegionCountry");
System.out.println(call.invoke(new Object[] {}));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
test();
}
}
http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx是个公共的webservice接口,getRegionCountry是方法名。
上面的代码成功调用了getRegionCountry方法,并且获取到结果,在call.setReturnType(XMLType.SOAP_VECTOR)中,曾经掉入一个大坑无法自拔,把其中的返回类型写成了XMLType.SOAP_STRING,结果报反序列化失败的问题,查找了半天,还是因为返回类型设置错了,设置成XMLType.SOAP_VECTOR就可以正常使用了。
2.axis2.1.5(如果没有java调用webservice的基础,请跟我来)
官网下载axis2-1.5.6-bin.zip
解压到自己的硬盘目录下
打开cmd,切换到刚才解压的axis2中的bin目录,然后运行命令 wsdl2java.bat -uri http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl ,然后回车(这个命令的意思是将上面的公共webservice生成本地类),axis2就会在bin目录下面,生成src目录,进去看,就会发现将webservice生成了本地类, 将产生的本地类引入自己的工程,然后就可以像是调用本地类一样来调用webservice的接口,具体根据自己的项目来实现
public class ClientYRTWebService {
public static void test1() {
try {
Service1Stub stub = new Service1Stub(); //这个类是由axis2的wsdl2java.bat自动生成的类,将其引入到工程中
stub._getServiceClient()
.getOptions()
.setProperty(
org.apache.axis2.transport.http.HTTPConstants.CHUNKED, //暂时不了解什么意思,等我有空看看axis2的api
Boolean.FALSE);
StaffLogin staffLogin = new StaffLogin(); //这个是staffLogin方法,axis2将方法直接生成一个类,实例化后来使用 staffLogin.setUserName("**");
staffLogin.setPassword("admin"); //设置输入的参数,我这里有两个参数,用户名和密码
try {
String str = stub.staffLogin(staffLogin).getStaffLoginResult(); //这里获取到webservice的返回结果,我的项目为xml格式的返回,因此,要对返回的结
System.out.println(str); // 果进行解析,但是这里就暂时不贴了
} catch (RemoteException e) {
e.printStackTrace();
}
} catch (AxisFault e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
test1();
}
}
运行后返回的结果,就是我想得到的xml格式的结果。
结论:
1.axis1可能更容易理解常规的Java开发的步骤,但是axis2将webservice生成本地的类后,调用起来更容易,比axis1简单太多
2.axis2生成本地类的时候可能会有些麻烦,但是,一旦生成,那开发的速度将是杠杠的
3.多看文档吧,学习英文吧骚年!
写于2015-3-5 合肥