问题描述:
由于iOS官方强制使用https
,所以后台最近把所有接口切换到https
,据说就是在把协议换了一下。然后Android这边也就把接口路径由http
换成了https
.问题来了,就是偶尔会出现 网络超时
的情况,而且一出现超时则后面的请求都会超时,然后过一会又可以连接上。出现超时的时候在后台查下日志,发现请求都没到服务器去,好像直接在客户端断开了。不知道有木有人遇到过这种情况。
网络框架用的 OKHttp
,设置了下面的代码:
mOkHttpClient = new OkHttpClient.Builder()
.cache(cache)
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.sslSocketFactory(createSSLSocketFactory(),mMyTrustManager)
.hostnameVerifier(new TrustAllHostnameVerifier())
.build();
private MyTrustManager mMyTrustManager;
private SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
mMyTrustManager = new MyTrustManager();
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{mMyTrustManager}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception ignored) {
ignored.printStackTrace();
}
return ssfFactory;
}
//实现X509TrustManager接口
public class MyTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
//实现HostnameVerifier接口
private class TrustAllHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
让httpclient信任所有的服务器证书,这种方法安全性则差一些,但实现相对简单