Android 中利用 ksoap2 调用 WebService的示例代码

 更新时间:2017年09月28日 10:04:17   作者:ayuhani  
这篇文章主要介绍了Android 中利用 ksoap2 调用 WebService的示例代码,非常具有实用价值,需要的朋友可以参考下

GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
如果你想靠AI翻身,你先需要一个靠谱的工具!

去年刚刚工作的时候,第一个项目是要访问 WebService。由于没有接触过,查了很多资料,在别人代码的基础上稍微修改了一下,总算满足了自己的需求。最近整理电脑的时候,发现了这个 WebService 的访问类,怕哪一天需要的时候找不到了,干脆写在博客上吧,也给需要的人提供一个参考。

1.下载 ksoap2 的 jar 文件

下载地址:ksoap2-android-assembly-3.6.1-jar-with-dependencies.jar

下载完成后依赖到自己的项目中即可。

2.封装网络访问工具类

直接贴代码了,注释写的很详细,根据自己的需要加以修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/**
 * 访问 WebService 的工具类
 */
public class WebServiceUtil {
 
 // 命名空间
 private static final String NAMESPACE = "your namespace";
 // WebService 服务器地址
 private static final String ENDPOINT = "your address";
 
 // 一般自己公司开发都是需要身份验证的
 // 身份验证方法名
 private static final String ID_HEADERNAME = "verify method";
 // 身份验证 key
 private static final String ID_NAME_PARAM = "verify key1";
 // 身份验证 value
 private static final String ID_NAME_VALUE = "verify value1";
 // 身份验证 key
 private static final String ID_PASSWORD_PARAM = "verify key2";
 // 身份验证 value
 private static final String ID_PASSWORD_VALUE = "verify value2";
 
 // 访问的服务器是否由 dotNet 开发
 public static boolean isDotNet = true;
 
 // 线程池的大小
 private static int threadSize = 5;
 // 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程
 private static ExecutorService threadPool = Executors.newFixedThreadPool(threadSize);
 
 // 连接响应标示
 public static final int SUCCESS_FLAG = 0;
 public static final int ERROR_FLAG = 1;
 
 /**
  * 调用 WebService 接口
  *
  * @param methodName  WebService 的调用方法名
  * @param mapParams  WebService 的参数集合,可以为 null
  * @param reponseCallBack 服务器响应接口
  */
 public static void call(final String methodName, SimpleArrayMap<String, Object> mapParams, final ResponseCallBack reponseCallBack) {
 
  // 创建 HttpTransportSE 对象,传递 WebService 服务器地址
  final HttpTransportSE transport = new HttpTransportSE(ENDPOINT);
  transport.debug = true;
 
  // 身份验证(如果需要的话)
  Element[] header = new Element[1];
  // 传入命名空间与验证的方法名
  header[0] = new Element().createElement(NAMESPACE, ID_HEADERNAME);
  // 创建参数 1
  Element userName = new Element().createElement(NAMESPACE, ID_NAME_PARAM);
  userName.addChild(Node.TEXT, ID_NAME_VALUE);
  header[0].addChild(Node.ELEMENT, userName);
  // 创建参数 2
  Element password = new Element().createElement(NAMESPACE, ID_PASSWORD_PARAM);
  password.addChild(Node.TEXT, ID_PASSWORD_VALUE);
  header[0].addChild(Node.ELEMENT, password);
 
  // 创建 SoapObject 对象用于传递请求参数
  final SoapObject soapObject = new SoapObject(NAMESPACE, methodName);
  // 添加参数
  if (mapParams != null) {
   for (int index = 0; index < mapParams.size(); index++) {
    String key = mapParams.keyAt(index);
    // 多数情况下,传递的参数都为 String 类型,不过少数情况下会有 boolean 类型,所以用 Object 代替
    Object value = mapParams.get(key);
    soapObject.addProperty(key, value);
   }
  }
 
  // 实例化 SoapSerializationEnvelope,传入 WebService 的 SOAP 协议的版本号
  // 这里有 VER10 VER11 VER12 三种版本,根据自己需要填写
  final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
  envelope.headerOut = header; // 身份验证(如果需要的话)
  envelope.dotNet = isDotNet; // 设置是否调用的是 .Net 开发的 WebService
  envelope.bodyOut = soapObject; // 传递参数
  //envelope.setOutputSoapObject(soapObject);// 与上一句等价
 
  // 用于与主线程通信的 Handler
  final Handler responseHandler = new Handler() {
 
   @Override
   public void handleMessage(Message msg) {
    super.handleMessage(msg);
    // 根据消息的 arg1 值判断调用哪个接口
    if (msg.arg1 == SUCCESS_FLAG) {
     reponseCallBack.onSuccess((String) msg.obj);
    } else {
     reponseCallBack.onError((Exception) msg.obj);
    }
   }
 
  };
 
  // 提交一个子线程到线程池并在此线种内调用 WebService
  if (threadPool == null || threadPool.isShutdown()) {
   threadPool = Executors.newFixedThreadPool(threadSize);
  }
  threadPool.submit(new Runnable() {
 
   @Override
   public void run() {
    String result = null;
    try {
     // 解决 EOFException
     System.setProperty("http.keepAlive", "false");
     // 连接服务器,有的服务可能不需要传递 NAMESPACE + methodName,第一个参数传递 null
     transport.call(null, envelope);
     if (envelope.getResponse() != null) {
      // 获取服务器响应返回的 SoapObject
      SoapObject object = (SoapObject) envelope.bodyIn;
      result = object.getProperty(0).toString();
     }
    } catch (IOException e) {
     // 当 call 方法的第一个参数为 null 时会有一定的概念抛 IO 异常
     // 因此需要需要捕捉此异常后用命名空间加方法名作为参数重新连接
     // e.printStackTrace();
     try {
      transport.call(NAMESPACE + methodName, envelope);
      if (envelope.getResponse() != null) {
       // 获取服务器响应返回的 SoapObject
       SoapObject object = (SoapObject) envelope.bodyIn;
       result = object.getProperty(0).toString();
      }
     } catch (Exception e1) {
      // e1.printStackTrace();
      responseHandler.sendMessage(responseHandler.obtainMessage(0, ERROR_FLAG, 0, e1));
     }
    } catch (XmlPullParserException e) {
     // e.printStackTrace();
     responseHandler.sendMessage(responseHandler.obtainMessage(0, ERROR_FLAG, 0, e));
    } finally {
     // 将获取的消息利用 Handler 发送到主线程
     responseHandler.sendMessage(responseHandler.obtainMessage(0, SUCCESS_FLAG, 0, result));
    }
   }
  });
 }
 
 /**
  * 设置线程池的大小
  *
  * @param threadSize
  */
 public static void setThreadSize(int threadSize) {
  WebServiceUtil.threadSize = threadSize;
  threadPool.shutdownNow();
  threadPool = Executors.newFixedThreadPool(WebServiceUtil.threadSize);
 }
 
 /**
  * 服务器响应接口,在响应后需要回调此接口
  */
 public interface ResponseCallBack {
 
  void onSuccess(String result);
 
  void onError(Exception e);
 }
 
}

3.在 Activity 中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void request() {
  SimpleArrayMap<String, Object> map = new SimpleArrayMap<>();
  map.put("key1", "value1");
  map.put("key2", "value2");
  WebServiceUtil.call("method name", map, new WebServiceUtil.ResponseCallBack() {
   @Override
   public void onSuccess(String result) {
    // 请求成功
   }
 
   @Override
   public void onError(Exception e) {
    // 请求失败
   }
  });
 }

至此调用结束,有需要访问 WebService 的同学可以参考一下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:http://blog.csdn.net/qq_24867873/article/details/77282260

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • Android编程实现号码归属地查询的方法

    Android编程实现号码归属地查询的方法

    这篇文章主要介绍了Android编程实现号码归属地查询的方法,涉及Android xml文件的发送及WebService的操作技巧,需要的朋友可以参考下
    2016-01-01
  • Android 裁剪人脸类的实例代码

    Android 裁剪人脸类的实例代码

    这篇文章主要介绍了Android 裁剪人脸类的实例代码,需要的朋友可以参考下
    2018-08-08
  • 利用Android中BitmapShader制作自带边框的圆形头像

    利用Android中BitmapShader制作自带边框的圆形头像

    这篇文章给大家介绍了一下如何利用BitmapShader制作圆形头像,可以自定义要显示的图片,边框颜色和边框宽度等,有需要的朋友们可以参考借鉴。
    2016-09-09
  • Android OpenGL入门之GLSurfaceView

    Android OpenGL入门之GLSurfaceView

    这篇文章主要介绍了OpenGL入门知识,如何在Android中使用GLSurfaceView,如果对OpenGL感兴趣的同学,可以参考下
    2021-04-04
  • Android使用ContentProvider实现查看系统短信功能

    Android使用ContentProvider实现查看系统短信功能

    这篇文章主要为大家详细介绍了Android使用ContentProvider实现查看系统短信功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Android 应用中插入广告的实例

    Android 应用中插入广告的实例

    本文主要介绍Android应用中插入广告,这里提供了详细的资料及实现示例代码,有兴趣的小伙伴可以参考下
    2016-08-08
  • Android开发笔记XML数据解析方法及优缺点

    Android开发笔记XML数据解析方法及优缺点

    XML数据是一种常见的数据格式,Android开发中需要对其进行解析。常用的XML解析方式有DOM、SAX、Pull和Json等,每种方式都有其优缺点。开发者可以根据具体需求选择合适的解析方式,提高数据解析效率和性能
    2023-05-05
  • Android LayoutTransiton实现简单的录制按钮

    Android LayoutTransiton实现简单的录制按钮

    这篇文章主要介绍了Android LayoutTransiton实现简单的录制按钮,主要实现开始,暂停,停止和显示录制时间长度,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Android:“万能”Activity重构篇

    Android:“万能”Activity重构篇

    本文主要介绍了mvp以及每一层,以及使用mvp来重构“万能”Activity,其实每一层需要注意的东西还有很多,比如model层是最难写的一层。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Android开机自启动程序详解

    Android开机自启动程序详解

    本篇文章是对Android开机自启动程序进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论