`
aosifer
  • 浏览: 1786 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Axis1.4和Axis2.1.5实现调用.net编写的WebService方法

阅读更多

       公司要将开发一个移动端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   合肥

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics