android通过ksoap来访问web services心得(包含wsdl服务的设计)

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

posted on 2012-05-07 20:23  cmlanche-明  阅读(1434)  评论(0编辑  收藏  举报

导航