Android开发之Https网络请求实践
文章目录
前言
最近使用VisualStudio开发APP,涉及的网络请求数据源来自于Https网络,在此进行记录,初研阶段,大神轻喷,谢谢。
一、引入okhttp
网络请求组件我们使用okhttp组件,在Module层的build.gradle中引入
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.7'
并点击gradle上方的Sync进行同步
二、创建MyTrustManager类
2.1 建一个类为MyTrustManager,实现接口X509TrustManager
代码如下(示例):
import android.annotation.SuppressLint;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class MyTrustManager implements X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
// TODO Auto-generated method stub
}
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
三.新建OkHttpUtil类实现Get、Post方法
3.1 类中需定义全局OkHttpClient和MediaType:
private static final OkHttpClient mOkHttpClient;
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
3.2 定义createSSLSocketFactory方法,用于创建SSLSocketFactory
private static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{
new MyTrustManager()}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return ssfFactory;
}
3.3 定义getX509TrustManager方法用于获取X509TrustManager
public static X509TrustManager getX509TrustManager() {
X509TrustManager trustManager = null;
try {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
trustManager = (X509TrustManager) trustManagers[0];
} catch (Exception e) {
e.printStackTrace();
}
return trustManager;
}
3.4 实现静态模块初始化util
static {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.protocols(Collections.singletonList(Protocol.HTTP_1_1));
builder.connectTimeout(30, TimeUnit.SECONDS);
/*
* Modify by liuwz
* builder.sslSocketFactory(createSSLSocketFactory());
* */
builder.sslSocketFactory(createSSLSocketFactory(),getX509TrustManager());
builder.hostnameVerifier((hostname, session) -> true);
mOkHttpClient = builder.build();
}
3.5 新建一个方法实现通过okhttp的excute获取Response
public static Response execute(Request request) throws IOException {
return mOkHttpClient.newCall(request).execute();
}
3.6 创建get请求方法
public static String get(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
Response response = mOkHttpClient.newCall(request).execute(