OkHttp的配置

一、拦截器

1.添加拦截器的作用:

每次在请求过程中就会回调一次intercept方法

2.拦截器的回调方法里我们可以做那些事情:

当前的请求还没有发给服务器,比如我们在与服务器通信的时候,一个应用中很多地方都会跟服务器发起通信。不同的接口请求都希望你带上你的应用版本号,那么我们就需要给每个request对象添加请求参数带给服务器。因为我们在每个请求都以添加请求头的方式添加请求参数带给服务器就会很麻烦。因此我们可以对添加请求头进行统一的处理,只要我们用同一个 okHttpClient发起的request请求,我们就能在这个拦截器里面拿到这个request对象。拿到对象之后我们就可以在拦截器里面给request添加请求头

OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new XXX).build();
OkHttpClicent okHttpClient = new OkHttpClient.Builder().addNetworkInterceptor(new XXX)bulider();

二、使用拦截器.addInterrceptor的代码展示

public class InterceptorUnitTest {//使用添加了拦截器的okhttpClicent实例对象的话,在请求的过程中就会回调一次intercept方法//拦截方法里面我们可以做那些事情呢:当前的请求还没有发给服务器//在上面情况下需要用到拦截器呢?比如说我们在与服务器通信的时候,这个应用中很多地方都会跟服务器发起通信。不同接口请求我都希望你带上你应用的版本号。//那么我们就需要要给每个request对象添加请求参数带给服务器。//如果我们在每个请求都以添加请求头的方式添加数据就很麻烦//因此我们可以对添加请求头进行统一的处理,只要我们用同一个okHttpClicent发起的request请求,我们就能在这个拦截器里面拿到这个request对象。拿到对象之后我们就可以在拦截器里面给request添加请求头@Testpublic void InterceptorTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {
//                return chain.proceed(chain.request());//现在拦截器没有做任何处理//进行自定义的处理//可以在调用process之前进行请求之前的处理
//                Response response = chain.proceed(chain.request());//在调用process之后进行请求之后的处理//测试Request request = chain.request().newBuilder().addHeader("os", "android").addHeader("version", "1.0").build();Response response = chain.proceed(request);return response;}}).build();Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//一个准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {throw new RuntimeException(e);}}
}

三、.addInterrceptor运行效果展示

四、拦截器可以添加无数个

其中添加的拦截器执行顺序是按照我们添加的顺序一次执行

五、除了上诉所说的拦截器还有.addNetworkInterceptor(),那么两者谁先执行呢?

public class InterceptorUnitTest {@Testpublic void InterceptorTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {//测试Request request = chain.request().newBuilder().addHeader("os", "android").addHeader("version", "1.0").build();Response response = chain.proceed(request);return response;}}).addNetworkInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {System.out.println("version:"+chain.request().header("version"));return chain.proceed(chain.request());}}).build();Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//一个准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {throw new RuntimeException(e);}}
}

运行结果

发现之前在前一个拦截器里面设置的版本号在.addNetworkIntercepter里面可以获取到,由此证明.addIntercepter()先执行,而.addNetworkIntercepter后执行。那么他们换一个位置会是什么样子呢!

六、将两者调换位置判断两个拦截器的执行顺序

1.调换代码位置

public class InterceptorUnitTest {@Testpublic void InterceptorTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {System.out.println("version:"+chain.request().header("version"));return chain.proceed(chain.request());}}).addInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {//测试Request request = chain.request().newBuilder().addHeader("os", "android").addHeader("version", "1.0").build();Response response = chain.proceed(request);return response;}}).build();Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//一个准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {throw new RuntimeException(e);}}
}

2.运行结果

运行结果还是这样,说明这两个拦截器.addIntercepter先于.addNetworkIntercepter.

七、OkHttp的另外两个配置"缓存和Cookie"

1.缓存是什么:

OkHttp按照Http协议规则实现了缓存处理,缓存是比如:当前我们发起第一次请求之后,如果后续还要进行同样的请求,此时如果如何缓存规则,则可以减少与服务器的通信,直接从本地文件缓存中读取响应返回给请求者,但是默认情况下,Okhttp的缓存时关闭状态,需要我们开启。

我们只需要加入如下代码

public class InterceptorUnitTest {@Testpublic void InterceptorTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(new Cache(new File("C:\\Users\\Anglin\\Desktop\1.doc"), 1024 * 1024)).addNetworkInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {System.out.println("version:" + chain.request().header("version"));return chain.proceed(chain.request());}}).addInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {//测试Request request = chain.request().newBuilder().addHeader("os", "android").addHeader("version", "1.0").build();Response response = chain.proceed(request);return response;}}).build();Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//一个准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {throw new RuntimeException(e);}}
}

加入以上代码就能实现缓存了

2.cookie是什么:

Cookie是某网站为了辨别用户身份,进行会话跟踪(比如确定登录状态)而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

代码展示

代码中的网址使用的是”玩安卓“中的开放接口玩Android - wanandroid.com - 每日推荐优质文章

我测试的是登录接口,登录成功拿到cookie

还有一个测试获取登录后的数据

public class CookieUnitTest {Map<String,List<Cookie>> cookies = new HashMap<>();//全局变量接收cookie@Testpublic void cookieTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {@Overridepublic void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {//把cookie数据封装成一个集合回调给我们我要做的就是把cookie给保存起来cookies.put(httpUrl.host(),list);}@NonNull@Overridepublic List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {List<Cookie> cookies = CookieUnitTest.this.cookies.get(httpUrl.host());return cookies == null ? new ArrayList<>() : cookies;}}).build();//设置请求体FormBody formBody = new FormBody.Builder().add("username", "Anglin").add("password", "rssqzqyp").build();Request request = new Request.Builder().url("https://www.wanandroid.com/user/login").post(formBody).build();//准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {throw new RuntimeException(e);}request = new Request.Builder().url("https://www.wanandroid.com/lg/collect/1165/json").build();//准备好请求的call对象call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {throw new RuntimeException(e);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/176036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

办公软件PDF转换工具 - pdftool

办公软件PDF转换工具 - pdftool&#xff0c;支持&#xff1a; 1、图片转PDF&#xff0c;支持图片自动压缩&#xff0c;可预览图片 2、合并PDF&#xff0c;支持多个PDF合并成一个PDF 3、PDF转图片&#xff0c;PDF的每页转成一张图片 4、OFD转PDF&#xff0c;OFD办公常用于国内的…

假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,可共享相同的后缀存储空间,例如,“loading”,“being”的存储映像如下图所示。

假定采用带头结点的单链表保存单词&#xff0c;当两个单词有相同的后缀时&#xff0c;可共享相同的后缀存储空间&#xff0c;例如&#xff0c;“loading”,“being”的存储映像如下图所示。 设str1和str2分别指向两个单词所在单链表的头结点&#xff0c;链表结点结构为 data ne…

修复debain/ Ubuntu 中的“密钥存储在旧版 trust.gpg 密钥环中”问题

如果您在 Ubuntu 22.04 及更高版本中使用 PPA 或添加外部存储库&#xff0c;您很可能会看到如下消息&#xff1a; W: https://packagecloud.io/slacktechnologies/slack/debian/dists/jessie/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg),…

Python3 Linux 安装教程

1. windows安装 去Python官网下载windows安装包&#xff0c;按照安装向导一直点击下一步即可&#xff0c;安装向导最好勾选Add Python3.x to PATH&#xff0c;这样就不用手动添加环境变量了。 2. linux安装 linux安装比较复杂&#xff0c;需要安装一些系统依赖&#xff0c;再…

winfrom 插件 ICSharpCode.SharpDevelop 使用 修改图标配置

1.需要安装 SharpDevelop 这个IDE对应的开发小工具 &#xff0c; 下载地址 SharpDevelop download | SourceForge.net 2.安装以及设置中文等其他的条件对应操作步骤&#xff0c;参考 SharpDevelop安装与配置 3.修改 图标配置 找到对应的 BitmapResources.resources 文件…

【C++】什么是模板?怎样使用模板?

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.函数模板 1.1函数模板概念 1.2函数…

神奇的世界(高斯核是唯一可以产生多尺度空间的线性核研究总结,两个高斯公式的联系,和推导)

放大缩小其实在现实世界中不存在。 也就是说尺度是不存在的。 比如树的长大&#xff0c;人的长大&#xff0c;从来就不是放大能解释的。 但你发现&#xff0c;这种事情存在于人的眼睛当中&#xff0c;光线真是神奇的东西。 但现实的东西是不存在放大缩小的&#xff0c;只有…

共筑关基安全防线,开源网安加入中关村华安关键信息基础设施安全保护联盟

近日&#xff0c;开源网安正式加入“中关村华安关键信息基础设施安全保护联盟”&#xff08;以下简称&#xff1a;关保联盟&#xff09;成为会员单位&#xff0c;进一步加强与行业内重要机构、企业的协同合作&#xff0c;推动关键信息基础设施安全保护领域的生态建设。 未来&am…

主机怎么通过命令行方式向虚拟机传输文件

这是几个月前遇到的问题了&#xff0c;那时候想着要记录下来&#xff0c;但后来忙忘了&#xff0c;这次想起来了&#xff0c;于是记录一下。 之前打靶场的时候需要将netcat-win32-1.12放入虚拟机的/var/www/html下&#xff0c;但是我虚拟机无法上网&#xff0c;也就是说无法直…

[每周一更]-(第74期):Docker-compose 部署Jenkins容器-英文版及错误纠错

1、前文概要 通过物理机部署Jenkins前文已经讲过&#xff08;地址&#xff1a;[Jenkins] 物理机 安装 Jenkins&#xff09;&#xff0c;也已经公司内部平稳运行若干年&#xff0c;考虑到容器化的使用场景&#xff0c;部分项目都采用容器运行&#xff0c;开始考虑部署容器化的J…

RK3568 android11 实现双路I2C触摸 --GT9xx

一&#xff0c;GT911 触摸屏简介 它的接口类型为 I2C &#xff0c;供电电压和通讯电压均为 3.3V 。这款电容触摸屏内置了上拉电阻&#xff0c;这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。关于线序&#xff0c;同样是 GT911 &#xff0c;不同批次的器件都有…

U-Net及其变体在医学图像分割中的应用研究综述

U-Net及其变体在医学图像分割中的应用研究综述 论文来自&#xff1a;中国生物医学工程学报 2022 摘 要&#xff1a; 医学图像分割可以为临床诊疗和病理学研究提供可靠的依据&#xff0c;并能辅助医生对病人的病情做出准确的判断。 基于深度学习的分割网络的出现解决了传统自动分…

数据结构与算法(三)贪心算法(Java)

目录 一、简介1.1 定义1.2 基本步骤1.3 优缺点 二、经典示例2.1 选择排序2.2 背包问题 三、经典反例&#xff1a;找零钱3.1 题目3.2 解答3.3 记忆化搜索实现3.4 动态规划实现 一、简介 1.1 定义 贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff0c;又名贪婪法&…

串口波形延时问题再次故障测试分析

先放电路图吧 这个延时问题测试了很多天&#xff0c;怎么感觉总是有没有想到的问题可以测试&#xff0c;总是有原件可以替换改善问题&#xff0c;再次测试了三极管的C脚波形&#xff1a; 从上到下的3个波形分别是MCU出来的波形&#xff0c;经过三极管反向的波形&#xff0c;…

2.ORB-SLAM3中如何从二进制文件中加载多地图、关键帧、地图点等数据结构

目录 1 为什么保存&加载(视觉)地图 1.1 加载多地图的主函数 1.2 加载各个地图 Atlas::PostLoad 1.3 加载关键帧及地图点Map::PostLoad 1.4 恢复地图点信息 MapPoint::PostLoad 1.5 恢复关键帧信息KeyFrame::PostLoad 1 为什么保存&加载(视觉)地图 因为我们要去做导…

抽象类的使用—模板设计模式 Java

模板设计模式 一、引入二、改进 一、引入 需求 ① 有多个类&#xff0c;完成不同的任务 job ② 要求统计得到各自完成任务的时间 ③ 请编程实现 >最容易想到的方法&#xff0c;写类&#xff0c;统计时间 AA BB中的 job 方法中是有重复的。 >改进1&#xff1a;每个类中&…

SpringBoot整合EasyExcel实现复杂Excel表格的导入导出功能

文章目录 &#x1f389;SpringBoot整合EasyExcel实现复杂Excel表格的导入&导出功能 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;架构设计&#x1f4dc;其他专栏&#xff1a;Java学习路线 Jav…

集成IDE开发环境,Java开发工具IntelliJ IDEA 2023中文

IntelliJ IDEA 2023是一款功能强大的软件&#xff0c;其为程序员提供了一款先进的集成开发环境。它以智能、高效和人性化为主要特点&#xff0c;致力于提高开发人员的生产力&#xff0c;帮助程序员更快、更好地编写代码。IntelliJ IDEA 2023支持多种语言和框架&#xff0c;包括…

继承JsonSerializer+注解实现自定义数据脱敏方案

1、数据脱敏 数据脱敏是一种保护隐私数据的技术&#xff0c;通过将敏感信息转化为非敏感信息来实现对数据的保护&#xff0c;以保护敏感隐私数据的可靠性和安全性。 数据脱敏可以分为可恢复和不可恢复两类: 可恢复类可以通过一定的方式恢复成原来的敏感数据。不可恢复类则无…

【Shell】Shell基础学习

一、shell脚本 (1)第一个shell脚本 #!/bin/bash #this is a comment echo "hello world"一个shell脚本永远以“#!”开头,这是一个脚本开始的标记,它是告诉系统执行这个文件需要用某个解释器,后面的/bin/bash就是指明解释器的具体位置。 “#”开头是注释 …