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;
    }
目录
相关文章
|
3月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
196 0
|
19天前
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
31 0
|
8天前
|
JavaScript 前端开发 Java
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
|
2月前
|
安全 Java 网络安全
RestTemplate进行https请求时适配信任证书
RestTemplate进行https请求时适配信任证书
29 3
|
3月前
|
安全 网络协议 算法
Android网络基础面试题之HTTPS的工作流程和原理
HTTPS简述 HTTPS基于TCP 443端口,通过CA证书确保服务器身份,使用DH算法协商对称密钥进行加密通信。流程包括TCP握手、证书验证(公钥解密,哈希对比)和数据加密传输(随机数加密,预主密钥,对称加密)。特点是安全但慢,易受特定攻击,且依赖可信的CA。每次请求可能复用Session ID以减少握手。
41 2
|
3月前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
143 5
|
3月前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
3月前
|
Web App开发 存储 网络安全
Charles抓包神器的使用,完美解决抓取HTTPS请求unknown问题
本文介绍了在 Mac 上使用的 HTTP 和 HTTPS 抓包工具 Charles 的配置方法。首先,强调了安装证书对于抓取 HTTPS 请求的重要性,涉及 PC 和手机端。在 PC 端,需通过 Charles 软件安装证书,然后在钥匙串访问中设置为始终信任。对于 iOS 设备,需设置 HTTP 代理,通过电脑上的 IP 和端口访问特定网址下载并安装证书,同时在设置中信任该证书。配置 Charles 包括设置代理端口和启用 SSL 代理。完成这些步骤后,即可开始抓包。文章还提及 Android 7.0 以上版本可能存在不信任用户添加 CA 证书的问题,但未提供解决办法。
552 0
Charles抓包神器的使用,完美解决抓取HTTPS请求unknown问题
|
3月前
|
网络协议 前端开发 Java
网络原理 - HTTP / HTTPS(4)——构造http请求
网络原理 - HTTP / HTTPS(4)——构造http请求
33 1
|
3月前
|
存储 JSON 安全
网络原理 - HTTP / HTTPS(2)——http请求
网络原理 - HTTP / HTTPS(2)——http请求
38 1
下一篇
云函数