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

简介: Android之OKHttp基本使用和OKHttp发送https请求安全认证

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;
    }
目录
相关文章
|
7月前
|
Java Android开发
Android使用okhttp加载图片
本教程介绍了如何使用 OkHttp 和 Handler 在 Android 应用中加载并显示网络图片。首先确保添加了网络权限和 OkHttp、Okio 的依赖包。通过定义全局 Handler 处理消息,实例化 OkHttpClient 请求图片数据,并在 onResponse 方法中将图片数据传递给主线程,最终利用 Bitmap 加载到 ImageView 中。
144 4
|
7月前
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
686 20
|
9月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
307 15
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
279 0
|
安全 API 网络安全
使用OkHttp进行HTTPS请求的Kotlin实现
使用OkHttp进行HTTPS请求的Kotlin实现
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
291 2
|
安全 网络安全 数据安全/隐私保护
HTTPS 请求中的证书验证详解(Python版)
HTTPS 请求中的证书验证详解(Python版)
786 0
|
安全 Java 网络安全
RestTemplate进行https请求时适配信任证书
RestTemplate进行https请求时适配信任证书
742 3
|
安全 网络协议 算法
Android网络基础面试题之HTTPS的工作流程和原理
HTTPS简述 HTTPS基于TCP 443端口,通过CA证书确保服务器身份,使用DH算法协商对称密钥进行加密通信。流程包括TCP握手、证书验证(公钥解密,哈希对比)和数据加密传输(随机数加密,预主密钥,对称加密)。特点是安全但慢,易受特定攻击,且依赖可信的CA。每次请求可能复用Session ID以减少握手。
245 2
|
JavaScript 前端开发 Java
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
127 0