公司后端使用webservice 做的接口,以前用的http 自己封装的webserviceUtils请求一直没有问题,最近接口地址修改为https 导致了我这边的请求一直无法响应,在网上翻来复去找了一天的也没有找到有效的方法,好在功夫不负有心人,终于在官方问题库中查找到了相关的问题 
原因是因为https证书的问题 
问题链接soap - KSOAP 2 Android with HTTPS - Stack Overflow
我这边使用的是最新版的soap-android jar包这边附上官方jar包  下载第一个 具体项目怎么引用不用我多说了吧
Index of /repositories/ksoap2-android-releases/com/google/code/ksoap2-android/ksoap2-android-assembly/3.6.4

好了废话不多说直接上原码:

package com.example.corlibrmodule.utils.webservice;import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;/*** @author 小訾* @description: 关于webservice 请求https 添加验证* @date :2022/3/10 14:23*/
public class FakeX509TrustManager implements X509TrustManager {private static TrustManager[] trustManagers;private static final X509Certificate[] _AcceptedIssuers = newX509Certificate[] {};@Overridepublic void checkClientTrusted(X509Certificate[] chain, StringauthType) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, StringauthType) throws CertificateException {}public boolean isClientTrusted(X509Certificate[] chain) {return true;}public boolean isServerTrusted(X509Certificate[] chain) {return true;}@Overridepublic X509Certificate[] getAcceptedIssuers() {return _AcceptedIssuers;}public static void allowAllSSL() {HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}});SSLContext context = null;if (trustManagers == null) {trustManagers = new TrustManager[] { new FakeX509TrustManager() };}try {context = SSLContext.getInstance("TLS");context.init(null, trustManagers, new SecureRandom());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyManagementException e) {e.printStackTrace();}HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());}
}

我们重写了https验证 然后请看WebServiceUtils的相关代码

package com.example.corlibrmodule.utils.webservice;import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.util.SimpleArrayMap;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;import com.example.corlibrmodule.R;import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** webService封装** @author xiaozi*/public class WebServiceUtils {// 访问的服务器是否由dotNet开发private boolean isDotNet = false;// 线程池的大小private int threadSize = 3;// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程private ExecutorService threadPool = Executors.newFixedThreadPool(threadSize);// 连接响应标示private static final int SUCCESS_FLAG = 0;private static final int ERROR_FLAG = 1;private static final int LOADING = 2;private static final int TIME_OUT = 30000;private WebServiceUtils() {}private static WebServiceUtils webServiceUtils;public static WebServiceUtils create() {if (webServiceUtils == null) {synchronized (WebServiceUtils.class) {if (webServiceUtils == null) {webServiceUtils = new WebServiceUtils();}}}return webServiceUtils;}private static Dialog mDialog;/*** 关闭加载框*/public static void dialogDismiss() {if (mDialog != null && mDialog.isShowing()) {mDialog.dismiss();mDialog = null;}}/*** 弹出加载等待框** @param context     上下文* @param hintContent 提示内容*/private void showLoadingDialog(Context context, String hintContent) {if (mDialog != null && mDialog.isShowing()) {mDialog.dismiss();}View view = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null);TextView tv_dialog_loading = view.findViewById(R.id.tv_dialog_loading);tv_dialog_loading.setText(hintContent);mDialog = new Dialog(context, R.style.DialogStyle);mDialog.setCancelable(false);mDialog.setContentView(view);mDialog.show();}/*** 调用WebService接口,此方法只访问过用Java写的服务器** @param url             WebService服务器地址* @param nameSpace       命名空间* @param methodName      WebService的调用方法名* @param mapParams       WebService的参数集合,可以为null* @param reponseCallBack 服务器响应接口*/public void call(final Context activity,final String url,final String nameSpace,final String methodName,SimpleArrayMap<String, String> mapParams,final Response reponseCallBack) {String SOAP_ACTION = nameSpace + methodName;// 1.创建HttpTransportSE对象,传递WebService服务器地址//如果请求是https 请求 绕过证书 必须加此方法否则无法请求https接口地址FakeX509TrustManager.allowAllSSL();final HttpTransportSE transport = new HttpTransportSE(url, TIME_OUT);transport.debug = true;// 2.创建SoapObject对象用于传递请求参数final SoapObject request = new SoapObject(nameSpace, methodName);// 2.1.添加参数也可以不传if (mapParams != null) {for (int index = 0; index < mapParams.size(); index++) {String key = mapParams.keyAt(index);String value = mapParams.get(key);request.addProperty(key, value);}}// 3.实例化SoapSerializationEnvelope,传入WebService的SOAP协议的版本号final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.dotNet = isDotNet; // 设置是否调用的是.Net开发的WebServiceenvelope.setOutputSoapObject(request);// 4.用于子线程与主线程通信的Handler,网络请求成功时会在子线程发送一个消息,然后在主线程上接收@SuppressLint("HandlerLeak") final Handler responseHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);// 根据消息的arg1值判断调用哪个接口if (msg.arg1 == SUCCESS_FLAG) {dialogDismiss();reponseCallBack.onSuccess((SoapObject) msg.obj);} else if (msg.arg1 == ERROR_FLAG) {dialogDismiss();reponseCallBack.onError((Exception) msg.obj);} elseshowLoadingDialog(activity, "加载中");reponseCallBack.Loading();}};// 5.提交一个子线程到线程池并在此线种内调用WebServiceif (threadPool == null || threadPool.isShutdown())threadPool = Executors.newFixedThreadPool(threadSize);threadPool.submit(() -> {responseHandler.sendMessage(responseHandler.obtainMessage(0, LOADING, 0, new Exception()));SoapObject result = null;try {//解决EOFExceptionSystem.setProperty("http.keepAlive", "false");// 连接服务器transport.call(null, envelope);// 获取服务器响应返回的SoapObjectresult = (SoapObject) envelope.bodyIn;if (result == null) {responseHandler.sendMessage(responseHandler.obtainMessage(0, ERROR_FLAG, 0, new Exception()));}} catch (IOException e) {// 当call方法的第一个参数为null时会有一定的概念抛IO异常// 因此需要需要捕捉此异常后用命名空间加方法名作为参数重新连接e.printStackTrace();try {transport.call(SOAP_ACTION, envelope);// 获取服务器响应返回的SoapObjectresult = (SoapObject) envelope.bodyIn;} 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 void setThreadSize(int threadSize) {webServiceUtils.threadSize = threadSize;threadPool.shutdownNow();threadPool = Executors.newFixedThreadPool(webServiceUtils.threadSize);}public void setIsDotNet(Boolean isDotNet) {webServiceUtils.isDotNet = isDotNet;}/*** 服务器响应接口,在响应后需要回调此接口*/public interface Response {void onSuccess(SoapObject result);void onError(Exception e);void Loading();}
}

然后代码到此基本可以解决关于请求https 的webservice接口了 不过本着java 封装集成多态的原则我这边对WebServiceUtils 进行了二次封装方便调用 方便模块化开发可以把这两个请求类放到公共module中就行

package com.example.corlibrmodule.utils.webservice;import android.content.Context;
import android.support.v4.util.SimpleArrayMap;
import android.util.Log;import com.example.corlibrmodule.CorLibUtils;
import com.example.corlibrmodule.utils.JSONParser;import org.ksoap2.serialization.SoapObject;/*** web service 请求及返回封装** @author 小訾  2020/3/4*/public class XWebService {public interface OnResultListener<T> {void onSuccess(T bean);void onError();}public interface OnKotlinResultListener {void onSuccess(String bean);void onError();}/*** 获取web service 数据 for java** @param methodName       方法名* @param arrayMap         传值 map* @param onResultListener web service 请求返回监听* @param <T>              返回数据泛型*/public static <T> void getIntentData(Context activity, Class<T> clazz, final String methodName,final SimpleArrayMap<String, String> arrayMap,final OnResultListener<T> onResultListener) {WebServiceUtils.create().call(activity, CorLibUtils.getBaseUrl(), CorLibUtils.getBaseNameSpace(), methodName, arrayMap, new WebServiceUtils.Response() {@Overridepublic void onSuccess(SoapObject result) {if (result != null) {String mJson = result.getProperty(0).toString();Log.i("xiaozi", "服务端获取的JSON---->" + methodName + "---->" + mJson);T data = JSONParser.fromJson(mJson, clazz);onResultListener.onSuccess(data);}}@Overridepublic void onError(Exception e) {onResultListener.onError();}@Overridepublic void Loading() {}});}/*** 获取web service 数据 for kotlin** @param methodName       方法名* @param arrayMap         传值 map* @param onResultListener web service 请求返回监听*/public static void getIntentData(Context activity, final String methodName,final SimpleArrayMap<String, String> arrayMap,final OnKotlinResultListener onResultListener) {WebServiceUtils.create().call(activity, CorLibUtils.getBaseUrl(), CorLibUtils.getBaseNameSpace(), methodName, arrayMap, new WebServiceUtils.Response() {@Overridepublic void onSuccess(SoapObject result) {if (result != null) {int propertyCount = result.getPropertyCount();if (propertyCount == 0) {onResultListener.onError();} else {String mJson = result.getProperty(0).toString();Log.i("xiaozi", "服务端获取的JSON---->" + methodName + "---->" + mJson);onResultListener.onSuccess(mJson);}}}@Overridepublic void onError(Exception e) {onResultListener.onError();}@Overridepublic void Loading() {}});}}

下面是调用方法代码 项目的接口工具类只需继承 XWebService就可以了

package com.example.zzrmyy.http;import android.app.Activity;
import android.support.v4.util.SimpleArrayMap;
import android.text.TextUtils;
import android.util.Log;import com.example.corlibrmodule.CorLibUtils;
import com.example.corlibrmodule.bean.BaseEntity;
import com.example.corlibrmodule.utils.webservice.XWebService;
import com.example.zzrmyy.CustomApplication;
import com.example.zzrmyy.bean.OrderInOutEntity;
import com.example.zzrmyy.bean.PharmacyDrugDetails;
import com.example.zzrmyy.bean.UserInfoEntity;
import com.example.zzrmyy.ui.yaofang.bean.ResultEntity;
import com.example.zzrmyy.ui.yaoku.bean.SearchDrugEntity;
import com.example.zzrmyy.utils.ZDYSharedPreferences;/*** * 项目webservice 请求工具类* @author 小訾  2020/3/4*/public class ZDYWebService extends XWebService {/*** 登陆** @param name             用户名* @param psw              密码* @param onResultListener*/public static void login(Activity activity, Class clazz, String name, String psw, OnResultListener<UserInfoEntity> onResultListener) {SimpleArrayMap<String, String> arrayMap = new SimpleArrayMap<>();arrayMap.put("userName", name);arrayMap.put("passWord", psw);Log.i("xiaozi",  CorLibUtils.getBaseUrl() + UrlConfig.methods_login + "\n map=" + arrayMap.toString());getIntentData(activity, clazz, UrlConfig.methods_login,  arrayMap, onResultListener);}}

希望这个方法可以帮大家解决到问题。

Android 访问 https的webservice接口相关推荐

  1. Android访问https链接

    引子 在Android开发过程中我们常常需要访问https链接,如果直接进行访问有时候会抛出异常,因为有些证书无法通过检测,为了能够访问我们需要信任所有的证书,其实这是不安全的,但是一般我们都是访问自 ...

  2. android 访问https服务器

    之前,我讲了如何让tomcat支持https访问,当时浏览器通过https:localhost:8443即可访问tomcat.可是android此时如何访问已经搭建好的tomcat的https了?我在 ...

  3. java使用axis实现webservice接口调用

    看了很多博客,发现都是cp出来说明也不清楚.不是缺包就是少代码,一贴就不负责任.自己最后找到了方法,写一个比较完整的方法给大家提供. 确保webservice接口可以在网页进行访问,调用webserv ...

  4. Android HttpClient访问https接口

    由于之前项目的接口需要安全测评,从HTTP变成了https,搞得Android这边也要变,原本以为和移动端没关系.事实错了...我用的是HttpClient来进行访问,没有进行证书验证则会报错.And ...

  5. 利用json+webservice实现android访问远程数据库,利用JSON+WebService实现Android访问远程数据库...

    2013年第9期SCIENCE&TECHNOLOGYINFORMATION ○IT论坛○科技信息 利用JSON+WebService实现Android访问远程数据库 黄淑静1杨红梅2 (1.山 ...

  6. Python3 访问 webservice 接口(WSDL+suds 方式)

    Python3 访问 webservice 接口(WSDL+suds 方式) suds 安装 参考 suds 使用说明 WSDL文件解读 学习 python 学习 上一篇文章整理了 通过request ...

  7. 如何访问webService接口

    在上篇的文章中我们接触到如何来编写webService接口,这篇文章我们将讲述的是如何来访问webService接口 首先比如这样的一个接口:http://127.0.0.1:11111/weathe ...

  8. android调用web接口,Android调用webservice 接口

    以查询手机号码归属地的Web service为例,它的wsdl为 1 在Android项目中导入??Ksoap2-android jar第三方jar包?? 2 Activity代码 public cl ...

  9. webservice xml java_java访问WebService接口返回xml

    [      今天为了java webservice 为了调用NET,真是累死了,搞了整整一天.最后才搞定.唉,在网上搜了半天的资料,没有一个提供了正确的答案,都是抄来抄去的,或者高手们都太低调 pa ...

  10. Android开发中调用Spring CXF整合发布的WebService接口为什么抛出异常错误?

    摘要:最近在协助同事搞Android调用WebService接口,再测试的过程中发现老师报错,经过baidu,google,终于解决了,现在记录一下: 一:错误信息: 2015-10-28 18:50 ...

最新文章

  1. ICML2020 | 神经网络的图结构如何影响其预测性能?
  2. 信息系统项目管理师-论文写作基本介绍笔记
  3. 95-138-010-源码-Function-AggregateFunction
  4. vtk 实现mimics软件中的Split/Merge算法
  5. Word批量打印证书(证书套打)
  6. 机械祭天法力无边:练习3.5:编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。
  7. 计划的主体部分应有哪些内容_计划的正文主体一般有哪三个部分构成
  8. 领英工程VP:如何用 AI 消除 AI 偏见,打造高级人才推荐系统
  9. el-checkbox 自定义 复选框【多选框】
  10. Office-31等一系列数据集
  11. MDX查询基础(一)
  12. 找一份Java工作面试需要具备的知识点框架(学会百战百胜!)
  13. 小程序常用的页面布局
  14. linux下管理显卡,Linux中显卡用户管理相关应用及命令行
  15. int在matlab中的作用,int函数表达的是什么意思
  16. SVN设置ignore文件或文件夹,配置log文案模板
  17. springboot+jpa 实现不同数据库的多数据源配置
  18. python 3.8.0安卓_Python3.8.0(32/64位)官方正式版_Python下载-PC9软件园
  19. android.view.WindowLeaked: Activity com.xty.activity.ActivityMainPage has leaked window com.android.
  20. 制做网页播放器代码全集

热门文章

  1. 链表 java 实现
  2. CDGA|数据治理如何做?找准目标是关键
  3. R语言结构方程模型(SEM)在生态学领域中的实践应用
  4. spring boot启动报错: The APR based Apache Tomcat Native library which allows optimal performance
  5. Linux Kernel Security全景图系列之开篇
  6. [Linux 驱动] -- 电源管理芯片之 Regulator 用法 与具体使用实例
  7. HTML粘性定位,CSS:position——绝对、相对、固定、粘性定位的简单记录
  8. 毛笔书法艺术作品,能不能写简化字?
  9. 计算机之魂计算机软件系统教学设计,大连理工版信息技术八上《计算机之魂——计算机软件系统》教案1.doc...
  10. 计算机如何与光猫连接网络,路由器怎么连接猫和电脑 路由器连接详解【图文】...