参考:https://blog.csdn.net/bencheng06/article/details/78520979
https://www.yii666.com/blog/367808.html

AndroidManifest.xml 中 application节点中配置明文,可以用http地址 android:usesCleartextTraffic="true" 否则http请求发不出去,只能用https

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")
发送请求示例:
private static final MediaType JSON = MediaType.get("application/json;charset=utf-8;");

    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的代码。

OKHttp下载文件

import java.io.File;

public interface AppDownloadCallBack {

    void onDownloading(int progress);

    void onDownloadSuccess(File file);

    void onDownloadFailed(Exception e);
}

/**
     * 文件下载
     *
     * @param url          下载路径
     * @param destFileDir  下载的文件储存目录
     * @param timeout      超时时间,单位秒
     * @param destFileName 下载文件名称,后面记得拼接后缀,否则手机没法识别文件类型
     * @return
     */
    public boolean downloadFile(String url, String destFileDir, String destFileName, Integer timeout, AppDownloadCallBack listener) throws IOException {
        Request request = new Request.Builder().url(url).build();
        Response response = null;
        OkHttpClient okHttpClient = getOkHttpClient(timeout);
        response = okHttpClient.newCall(request).execute();
        boolean result;

        InputStream is = null;
        byte[] buf = new byte[2048];
        int len = 0;
        FileOutputStream fos = null;

        //储存下载文件的目录
        File dir = new File(destFileDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File file = new File(dir, destFileName);

        try {
            is = response.body().byteStream();
            long total = response.body().contentLength();
            fos = new FileOutputStream(file);
            long sum = 0;
            while ((len = is.read(buf)) != -1) {
                fos.write(buf, 0, len);
                sum += len;
                int progress = (int) (sum * 1.0f / total * 100);
                //下载中更新进度条
                if (listener != null) {
                    listener.onDownloading(progress);
                }
            }
            fos.flush();
            result = true;
            slog.i("downloadFile", "下载完成");
            //下载完成
            if (listener != null) {
                listener.onDownloadSuccess(file);
            }
        } catch (Exception e) {
            if (listener != null) {
                listener.onDownloadFailed(e);
            }
            result = false;
            slog.e("downloadFile", e);
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {

            }
        }
        return result;
    }

 

posted on 2023-08-08 10:11  邢帅杰  阅读(778)  评论(0编辑  收藏  举报