Android之okhttp基本使用和okhttp发送https请求安全认证

邢帅杰 / 2023-08-08 / 原文

参考:https://blog.csdn.net/bencheng06/article/details/78520979
1、新TrustAllcert类实现X509TrustManager接口:

import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;

public class TrustAllCerts implements X509TrustManager {  
    @Override    
    public void checkClientTrusted(X509Certificate[] chain, String authType) {}  

    @Override    
    public void checkServerTrusted(X509Certificate[] chain, String authType) {}  

    @Override    
    public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}    
}

2、初始化OKHttpClient配置

OkHttpClient okHttpClient = null;
OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.connectTimeout(timeout, TimeUnit.SECONDS);//响应时间
            builder.readTimeout(timeout, TimeUnit.SECONDS);//读取时间
            // 信任https证书
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            //创建管理器
            TrustAllCerts trustAllCerts = new TrustAllCerts();
            try {
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, new TrustManager[]{trustAllCerts}, new SecureRandom());

                //为OkHttpClient设置sslSocketFactory
                builder.sslSocketFactory(sslContext.getSocketFactory(), trustAllCerts);
                okHttpClient = builder.build();
            } catch (Exception e) {
                e.printStackTrace();
            }

得到的okHttpClient,信任所有的https。

使用,build.gradle中配置 implementation("com.squareup.okhttp3:okhttp:3.12.1")
发送请求示例:

    public String postJsonSync(String url, String json, Map<String,String> requestHeaderMap, Integer timeout) throws Exception {
        try {
            String data = json;
            Headers headers = null;
            okhttp3.Headers.Builder headersbuilder = new okhttp3.Headers.Builder();
            if(requestHeaderMap != null && requestHeaderMap.size() >0){
                for (String key:requestHeaderMap.keySet()){
                    headersbuilder.add(key, requestHeaderMap.get(key));
                }
            }
            headers = headersbuilder.build();
            RequestBody body = RequestBody.create(JSON, data);
            Request request;
            request = new Request.Builder()
                    .url(url)
                    .headers(headers)
                    .post(body)
                    .build();
            OkHttpClient okHttpClient = getOkHttpClient(timeout);
            Response response = okHttpClient.newCall(request).execute();
            String rets = response.body().string();return rets;
        }catch (Exception ex){throw ex;
        }
    }

getOkHttpClient(timeOut)就是最上面获取okHttpClient的代码。