OkHttp的配置

news2024/11/17 11:55:59

一、拦截器

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添加请求头
    @Test
    public void InterceptorTest() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
            @NonNull
            @Override
            public 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 {

    @Test
    public void InterceptorTest() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
            @NonNull
            @Override
            public 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
            @Override
            public 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 {

    @Test
    public void InterceptorTest() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() {
            @NonNull
            @Override
            public Response intercept(@NonNull Chain chain) throws IOException {
                System.out.println("version:"+chain.request().header("version"));
                return chain.proceed(chain.request());
            }
        }).addInterceptor(new Interceptor() {
            @NonNull
            @Override
            public 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 {

    @Test
    public void InterceptorTest() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(new Cache(new File("C:\\Users\\Anglin\\Desktop\1.doc")
                , 1024 * 1024)).addNetworkInterceptor(new Interceptor() {
            @NonNull
            @Override
            public Response intercept(@NonNull Chain chain) throws IOException {
                System.out.println("version:" + chain.request().header("version"));
                return chain.proceed(chain.request());
            }
        }).addInterceptor(new Interceptor() {
            @NonNull
            @Override
            public 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

    @Test
    public void cookieTest() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    @Override
                    public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {
                        //把cookie数据封装成一个集合回调给我们我要做的就是把cookie给保存起来
                        cookies.put(httpUrl.host(),list);
                    }

                    @NonNull
                    @Override
                    public 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.coloradmin.cn/o/1261948.html

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

相关文章

WGS84转CGCS2000操作步骤

1、使用一个转换软件实现不同椭球之间转换七参数的求取。打开坐标转换软件如下&#xff1a; 2、点击设置-地图投影&#xff0c; 如下&#xff1a; 3、设置需要投影到的坐标系&#xff0c;如下&#xff1a; 4、【选择目标坐标系】中选择CGCS2000&#xff0c;如下&#xff1a; 5、…

智能优化算法应用:基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.正余弦算法4.实验参数设定5.算法结果6.参考文献7.…

深入Rust的模式匹配与枚举类型

今天&#xff0c;我们将深入探讨Rust语言中的两个强大特性&#xff1a;模式匹配&#xff08;Pattern Matching&#xff09;和枚举类型&#xff08;Enums&#xff09;。这两个特性是Rust提供的核心工具之一&#xff0c;它们在处理多种类型的数据和复杂的逻辑控制中发挥着关键作用…

灰度发布专题---2、Dubbo灰度发布

通过上面描述&#xff0c;我们理解了什么是灰度发布&#xff0c;接下来我们基于Dubbo实现灰度发布。Dubbo的灰度发布常见的方式有版本控制灰度发布、路由灰度发布、基于Apollo实现灰度发布&#xff0c;我们把这每种灰度发布都实现一次。 在学习Dubbo灰度发布之前&#xff0c;我…

2019年11月7日 Go生态洞察:Go Modules v2及更高版本

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

vue3 setup语法糖,常用的几个:defineProps、defineEmits、defineExpose、

vue3和vue2组件之间传参的不同 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。 <script setup> 中的代码会在每次组件实例被创建的时候执行。 任何在 <script setup> 声明的顶层的绑定 (包括变量&#xff0c;函数声明&#xff0…

食材管家,轻松搞定!商户选择生鲜配送系统的原因

随着消费者对生鲜食品的需求不断增加&#xff0c;生鲜市场逐渐成为了电商领域中的热门行业。而生鲜配送系统&#xff0c;则是生鲜电商发展中不可或缺的一部分。本文将探讨商户选择生鲜配送系统的几个原因。 1. 提高效率 生鲜配送系统通过智能化的订单处理、路线规划和配送优化…

2023.11.27 关于 Mybatis 增删改操作

目录 引言 增加用户操作 删除用户操作 修改用户操作 阅读下述文章之间 建议点击下方链接先了解 MyBatis 的创建与使用 MyBatis 的创建与使用 建议点击下方链接先了解 单元测试 的创建与使用 Spring Boot 单元测试的创建与使用 引言 为了方便下文实现增、删、改操作我们先…

java多线程-扩展知识三:乐观锁与悲观锁

1、悲观锁 悲观锁有点像是一位比较悲观&#xff08;也可以说是未雨绸缪&#xff09;的人&#xff0c;总是会假设最坏的情况&#xff0c;避免出现问题。 悲观锁总是假设最坏的情况&#xff0c;认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改)&#xff0c;所以每次…

Appium 2 和 Appium Inspector 环境部署

前言 自 2022 年 1 月 1 日起&#xff0c;Appium 核心团队不再维护 Appium 1.x。官方支持的平台驱动程序的所有最新版本均不兼容 Appium 1.x&#xff0c;需要 Appium 2 才能运行。 Appium 2是一个自动化移动应用程序的开源工具&#xff0c;它带来了以下重要改进&#xff1a;  …

SpringBootWeb案例_01

Web后端开发_04 SpringBootWeb案例_01 原型展示 成品展示 准备工作 需求&环境搭建 需求说明&#xff1a; 完成tlias智能学习辅助系统的部门管理&#xff0c;员工管理 环境搭建 准备数据库表&#xff08;dept、emp&#xff09;创建springboot工程&#xff0c;引入对应…

神经网络核心组件和流程梳理

文章目录 神经网络核心组件和流程梳理组件流程 神经网络核心组件和流程梳理 组件 层&#xff1a;神经网络的基本结构&#xff0c;将输入张量转换为输出张量。模型&#xff1a;由层构成的网络。损失函数&#xff1a;参数学习的目标函数&#xff0c;通过最小化损失函数来学习各…

HCIP-十一、BGP反射器和联盟

十一、BGP反射器和联盟 实验拓扑实验需求及解法1.配置各设备的接口 IP 地址。2.BGPAS 规划3.BGP 反射器4.BGP 联盟5.ebgp 邻居6.bgp 路由汇总 实验拓扑 实验需求及解法 本实验模拟 BGP 综合网络拓扑&#xff0c;完成以下需求&#xff1a; 1.配置各设备的接口 IP 地址。 所有…

这些汽车托运套路你肯定不知道

这些汽车托运套路你肯定不知道 这些套路你肯定不知道.. 学会这三招 汽车托运不怕吃亏 1 看营业执照 首先确定选择的托运公司是否有保障 要求公司出示营业执照和道路运输经营许可证 如果都没有 那就很有可能是无牌照的小作坊!! 这种出问题就肯定没保障 2 保险跟合同 一车一合同 …

安卓系统修图软件(三)

在之前的推送里面&#xff0c;博主分享过两期关于安卓手机的优质修图软件&#xff0c;今天&#xff0c;博主将带来第三期的分享&#xff0c;这也将是该栏目的最后一期。 之前的8款软件&#xff0c;都是以美化、滤镜的风格为主&#xff0c;今天博主带来的这3款&#xff0c;则是以…

数据结构与算法的精髓是什么?复杂度分析【数据结构与算法】

代码跑一遍存在什么问题&#xff1f;什么是 O 复杂度表示法&#xff1f;如何分析时间复杂度&#xff1f;常见时间复杂度量级有哪些&#xff1f;O(1)O(logn)O(n)O(nlogn)O(mn)O(m*n)O(n^2)O(2^n)O(n!)不同时间复杂度差距有多大&#xff1f;时间复杂度分析总结 如何分析空间复杂度…

2021年06月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共10题,每题2分,共20分) 第1题 执行下列程序,输出的结果为? A:12 B:24 C:8 D:30 答案:B 第2题 执行下列程序,角色说出的内容是? A:2 B:3 C:4 D:5 答案:A 第3题 执行下列程序,输出结果为?

Spring Security 6.x 系列(5)—— Servlet 认证体系结构介绍

一、前言 本章主要学习Spring Security中基于Servlet 的认证体系结构&#xff0c;为后续认证执行流程源码分析打好基础。 二、身份认证机制 Spring Security提供个多种认证方式登录系统&#xff0c;包括&#xff1a; Username and Password&#xff1a;使用用户名/密码 方式…

接口测试:Jmeter和Postman测试方法对比

前阶段做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人…

Leetcode98 验证二叉搜索树

题意理解&#xff1a; 首先明确二叉树的定义&#xff0c;对于所有节点&#xff0c;根节点的值大于左子树所有节点的值&#xff0c;小于右子树所有节点的值。 注意一个误区&#xff1a; 根节点简单和左孩子&#xff0c;右孩子比大小是不够的&#xff0c;要和子树比&#xff0c;…