最近在做一项目,用到的通信方式主要是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/*
并新建一个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 ,
最后加上通信: