android通过ksoap来访问web services心得(包含wsdl服务的设计)
在这里只写出一个大概的配置过程,并不提供各种文件的下载,日后整理将所有配置文件都提供给广大
网友,希望和任何有兴趣的人成为朋友!
第一部分:设计接口程序,并制作wsdl发布接口
1,安装myeclipse(我安装的版本是8.5)
2,安装tomcat和axis2(我安装的版本是tomcat-6.0.30绿色版的,axis好像是1.4.1)
注意,安装axis2是将axis2.war文件放在在tomcat的webapps下的,当重启tomcat服务的时候自动解压
axis2.war文件,生成axis2文件夹,这样在浏览器中输入http://localhost:8080/axis2/
当出现axis2的欢迎页面的时候就证明axis2安装成功了。
3,安装axis2的插件,安装好之后在新建工程中有Axis2 Code Generator和Axis Service Archiver,
前一个工具的作用是根据设计好的接口设计wsdl文件,后一个工具用于将wsdl文件制作成.aar的
接口发布文件,这个.aar文件只需要放在axis2\WEB-INF\services\目录下即可。重新启动tomcat
服务,之前所写的接口程序就发布成功了。
第二部分:编写android测试程序
1,测试例子
1 public static boolean addItem(int id, String name){ 2 // 定义SoapObject请求对象,并进行封装 3 SoapObject request = new SoapObject(NAMESPACE, method_name); 4 request.addProperty("id",id); 5 request.addProperty("data",name); 6 7 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11 ); 8 envelope.dotNet = true; 9 // 发出请求 10 envelope.setOutputSoapObject( request ); 11 12 @SuppressWarnings("deprecation") //带有这个标注的是什么意思? 13 AndroidHttpTransport ht = new AndroidHttpTransport( WSDL_URL ); 14 ht.debug = true; 15 boolean blReturn = false; 16 try { 17 ht.call( soap_action, envelope ); 18 // 定义SoapObject对象来接收获得的结果 19 Object ret = envelope.getResponse(); 20 //SoapObject result = (SoapObject)envelope.bodyIn; 21 // 对于返回值为boolean类型的,可以做如下一个转换,通过它的名称判断它是true还是false 22 //Object ret = result.getProperty("return"); 23 /* 24 * Object ret = envelope.getResponse(); 25 * 上面一句和下面的两句的作用是一样的 26 * SoapObject result = (SoapObject)envelope.bodyIn; 27 * Object ret = result.getProperty("return"); 28 * */ 29 if( ret.toString().equals("true") ){ 30 blReturn = true; 31 } 32 } catch (IOException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } catch (XmlPullParserException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 return blReturn; 40 }
特别强调1:接口描述文件中的ip地址不能用localhost,采用控制变量法,ip为这两种情况下时,是localhost的情况在程序
运行到ht.call的时候出现异常,后来我想到,在android中访问本地ip地址是不能访问localhost的,或者说在android手机
上根本不存在该地址,只在PC中存在,改成我的电脑的实际IP即可。
特别强调2:Object ret = result.getProperty("return");这里我在服务器端的接口写的返回值类型是boolean类型,但在客
户端处强制类型转换不行,即boolean ret = (Boolean)result.getProperty("return");×
特别强调3:如果需要传递自定义的类型,就是说接口那边传过来的是一个自定义的类对象,在客户端这边是不存在的,此时要
接收这个对象怎么做呢?需要在客户端这边自定义一个类,让它实现KvmSerializable接口,实现里边的各种方法。
就说到这吧 写于:21:38 2012-5-4