最近在做一项目,用到的通信方式主要是webservices,在此分享一下关于webservice的使用。
包括以下几个方面:
自定义webservice。并自动生成wsdl。
通过android访问wsdl。利用ksoap2.(关于ksoap2的更多信息可访问我的另一篇: http://www.eoeandroid.com/thread-162563-1-1.html
系统开发环境:
   myeclipse8.5(自带xfire)
  eclipse   (android环境)
 tomcat6.0
一.服务器的搭建:
新建 webservice 工程:(注意下面要选中xfire),直接点击完成即可。
   

此时:WEB-INF下的web.xml会自动添加webservice的配置文件:

1.  
2.    XFireServlet
3.    org.codehaus.xfire.transport.http.XFireConfigurableServlet
4.    0
5.  
6.  
7.    XFireServlet
8.    /services/*
  1.  


并新建一个webservices文件夹并生成services.xml

2.新建webservice :



选中xfire。并新建bean



名称为AddOper




系统会自动生成services配置文件说明:

1.  
2.                AddOper
3.                com.chengying.webservices.IAddOper
4.               
5.                        com.chengying.webservices.AddOperImpl
6.               
7.               
8.                literal
9.                application
10.


3.测试wsdl生成:在下图的图标的右面点击小三角,选择lanunch soap。。。。


按照下面步骤测试wsdl方法:



直接点击方法即可测试:




可以查看xml源文件:




二.android端:


 采用ksaoap2的方式联通webservice。需要导入包:ksoap2-android-assembly-2.5.5-jar-with-dependencies.jar


主要步骤:


step1 指定WebService的命名空间和调用的方法名


step2 设置调用方法的参数值,这里的参数名称最好和WebService一致


step3 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本


step4 创建HttpTransportSE对象


step5 调用WebService


step6 使用getResponse方法获得WebService方法的返回结果

1.  
2.                public static String getString(String msg){
3.        // step1 指定WebService的命名空间和调用的方法名
4.        SoapObject request = new SoapObject("http://webservices.chengying.com" , "example");
5.        // step2 设置调用方法的参数值,这里的参数名称最好和WebService一致
6.        request.addProperty("message", msg);
7.        
8.        
9.        
10.        // step3 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
11.        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
12.                        SoapEnvelope.VER10);
13.        // 设置是否调用的是dotNet下的WebService
14.        // envelope.dotNet = false;
15.        // 必须,等价于envelope.bodyOut = request;
16.        envelope.bodyOut = request;
17.        envelope.setOutputSoapObject(request);
18.        // step4 创建HttpTransportSE对象
19.        
20.        HttpTransportSE ht = new HttpTransportSE("http://192.168.1.102:8080/webservices/services/AddOper");
21.        // step5 调用WebService
22.        
23.        try {
24.                ht.call(null, envelope);
25.        } catch (IOException e) {
26.                // TODO Auto-generated catch block
27.                e.printStackTrace();
28.        } catch (Exception e) {
29.                // TODO Auto-generated catch block
30.                e.printStackTrace();
31.                return null;
32.        }
33.        // step6 使用getResponse方法获得WebService方法的返回结果
34.        
35.        Object tempresult = null;
36.        try {
37.                tempresult = (Object)envelope.getResponse();
38.        } catch (SoapFault e) {
39.                // TODO Auto-generated catch block
40.                e.printStackTrace();
41.        }
42.        //下面对结果进行解析,结构类似json对象
43.        String reslut=(String) tempresult.toString();
44.        
45.        return reslut;
46.  }
47.                public static  user finduser(){
48.                        user temp=new user();
49.                        // step1 指定WebService的命名空间和调用的方法名
50.                        SoapObject request = new SoapObject("http://webservices.chengying.com", "find");
51.                        // step2 设置调用方法的参数值,这里的参数名称最好和WebService一致
52.                        
53.                        
54.                        
55.                        // step3 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
56.                        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
57.                                        SoapEnvelope.VER11);
58.                        // 设置是否调用的是dotNet下的WebService
59.                        // envelope.dotNet = false;
60.                        // 必须,等价于envelope.bodyOut = request;
61.                        envelope.bodyOut = request;
62.                        envelope.setOutputSoapObject(request);
63.                        // step4 创建HttpTransportSE对象
64.                        
65.                        HttpTransportSE ht = new HttpTransportSE("http://192.168.1.102:8080/webservices/services/AddOper");
66.                        // step5 调用WebService
67.                        
68.                        try {
69.                                ht.call(null, envelope);
70.                        } catch (IOException e) {
71.                                // TODO Auto-generated catch block
72.                                System.out.println(e.toString());
73.                                e.printStackTrace();
74.                        } catch (Exception e) {
75.                                // TODO Auto-generated catch block
76.                                e.printStackTrace();
77.                                return null;
78.                        }
79.                        // step6 使用getResponse方法获得WebService方法的返回结果
80.                        
81.                        SoapObject tempresult = null;
82.                        try {
83.                                tempresult = (SoapObject)envelope.getResponse();
84.                        } catch (SoapFault e) {
85.                                // TODO Auto-generated catch block
86.                                e.printStackTrace();
87.                        }
88.                        //下面对结果进行解析,结构类似json对象
89.                                
90.                        temp.setId((String) tempresult.getProperty(0).toString());
91.                        temp.setName((String) tempresult.getProperty(1).toString());
92.                        
93.                        return temp;
94.                        
95.                        
96.                        
97.                }
98.  }


其中 "http://webservices.chengying.com为webservice的命名空间,具体可以通过请求的xml原文件的 xmlns:q0="“

特别注意:读取string的时候一定要用object ,

最后加上通信: