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 的同学可以参考一下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 在Android中访问WebService接口的方法
- Android开发调用WebService的方法示例
- Android ksoap调用webservice批量上传多张图片详解
- Android 通过webservice上传多张图片到指定服务器详解
- Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍
- 在Android中调用WebService实例
- Android通过Webservice操作sqlserver数据库实例代码
- android调用WebService实例分析
- android中soap协议使用(ksoap调用webservice)
- android调用webservice接口获取信息
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
利用Android中BitmapShader制作自带边框的圆形头像
这篇文章给大家介绍了一下如何利用BitmapShader制作圆形头像,可以自定义要显示的图片,边框颜色和边框宽度等,有需要的朋友们可以参考借鉴。2016-09-09Android OpenGL入门之GLSurfaceView
这篇文章主要介绍了OpenGL入门知识,如何在Android中使用GLSurfaceView,如果对OpenGL感兴趣的同学,可以参考下2021-04-04Android使用ContentProvider实现查看系统短信功能
这篇文章主要为大家详细介绍了Android使用ContentProvider实现查看系统短信功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-11-11Android LayoutTransiton实现简单的录制按钮
这篇文章主要介绍了Android LayoutTransiton实现简单的录制按钮,主要实现开始,暂停,停止和显示录制时间长度,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-06-06
最新评论