23.2、Android -- OkHttp3 基础学习 自定义设置
说明
一个项目中的网络请求肯定不止一个。多个的话就涉及到相同的请求信息,或者相同的信息过滤条件。
因此,就需要自定义OkHttp3设置。可以通过拦截器、过滤器实现
测试方法都是在test 测试用例中进行的
拦截器
应用拦截器
使用addInterceptor
new OkHttpClient.Builder().addInterceptor(new Interceptor() {//应用拦截器@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {Request request = chain.request().newBuilder().addHeader("SystemType", "android").addHeader("version", "20220803.001.123").build();System.out.println("version2"+chain.request().headers("version"));Response response = chain.proceed(request);return response;//正常返回,不处理//return chain.proceed(chain.request());}}).build();
网络拦截器
使用addNetworkInterceptor
new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() {//网络拦截器@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {System.out.println("version"+chain.request().headers("version"));Request request = chain.request().newBuilder().addHeader("locDesc", "cwc").addHeader("userName", "lianmei").build();Response response = chain.proceed(request);return response;}}).build();
备注
1、addInterceptor早于addNetworkInterceptor执行
2、addInterceptor是程序增加的,
addNetworkInterceptor是网络增加,可以获取addInterceptor的请求信息
3、addInterceptor不管有误网络都会执行,
addNetworkInterceptor,有网络是才执行,没有网络时不执行
过滤器最终代码
package com.pha.four;import androidx.annotation.NonNull;import org.junit.Test;import java.io.IOException;import okhttp3.Call;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;public class OkHttpSetting {@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("SystemType", "android").addHeader("version", "20220803.001.123").build();System.out.println("version2"+chain.request().headers("version"));Response response = chain.proceed(request);return response;//正常返回,不处理//return chain.proceed(chain.request());}}).addNetworkInterceptor(new Interceptor() {//网络拦截器@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {System.out.println("version"+chain.request().headers("version"));Request request = chain.request().newBuilder().addHeader("locDesc", "cwc").addHeader("userName", "lianmei").build();Response response = chain.proceed(request);return response;}}).build();Request request = new Request.Builder().url("http://www.httpbin.org/get?a=2&b=3").build();Call call = okHttpClient.newCall(request);Response response = null;try {response = call.execute();System.out.println(response.body().string());} catch (IOException e) {e.printStackTrace();}}
}
缓存和cookie
缓存
通过.cache(new Cache(new File(“C:\Users\Cherry”),1024*1024)) 缓存
OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(new Cache(new File("C:\\Users\\Cherry"),1024*1024)).build();
cookie
通过cookieJar(new CookieJar(){})记录到程序内
通过Map<String,List> cookieMap = new HashMap<>(); 记录个网站的cookie 。
package com.pha.four;import androidx.annotation.NonNull;import org.junit.Test;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import okhttp3.Call;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;public class OkHttpCookieTest {Map<String,List<Cookie>> cookieMap = new HashMap<>();@Testpublic void CookieTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {//记录cookies@Overridepublic void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {cookieMap.put(httpUrl.host() ,list);}@NonNull@Overridepublic List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {List<Cookie> cookies = OkHttpCookieTest.this.cookieMap.get(httpUrl.host());return cookies == null ? new ArrayList<>() : cookies;}}).build();FormBody formBody = new FormBody.Builder().add("username","ty082093105").add("password","123123").build();Request request = new Request.Builder().url("https://www.wanandroid.com/user/login").post(formBody).build();Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {e.printStackTrace();}//使用cookiesrequest = new Request.Builder().url("https://www.wanandroid.com/lg/collect/list/0/json").build();call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {e.printStackTrace();}}
}
记忆点
1、应用拦截器addInterceptor
2、网络拦截器addNetworkInterceptor
3、缓存cache
4、cookie记录:cookieJar(new CookieJar(){}).build()
23.2、Android -- OkHttp3 基础学习 自定义设置相关推荐
- Android编译及编译脚本、Android构建基础学习笔记
Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...
- Android零基础学习指南,从入门到精通一战通关
Android程序员想要入门进阶,升职拿高薪,一般需要做出以下努力: 明确的学习进阶规划,系统化掌握更深层次的技术 弄清目标岗位的能力需求,针对性提升技术能力; 增加实战经验,高效率提高解决实际问题的 ...
- Android开发基础学习总结
最近一直在学习安卓开发,主要从安卓的基础组件,布局,Activity学起,也是边学习边整理笔记,希望可以给需要帮助的人解决能解决掉的问题,以后也会慢慢更新的. 一.Android布局 1.Androi ...
- 关于Android零基础学习的思考
看了很多帖子,只发现了一篇给新手指明道路的[[转]学习Android需要的基础].对于已有编程经验的人来说,学习相对轻松.而...今天特此发帖一份,帮助那些观望而不知道学什么的人.本人才疏学浅,仅把自 ...
- Android Studio基础学习(1)——基本布局及属性
此文章是根据b站视频学习整理的笔记,穿插一些延申的内容 原视频标题:手把手教你用Android Studio写一个APP,bv号:BV1MK411p7dp As布局属性 Drawable-xhdpi: ...
- Android 控件学习--自定义SeekBar
从sdk中可以得知,它是ProgressBar的扩展,它比进度条多了一个功能就是可拖动性,这样用户就可以控制进度条,比如播放电影,用户可以通过拖动SeekBar进行快进与快退. 要实现其拖 ...
- Android 零基础学习之路
第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正则表达式. 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化 ...
- Android Kotlin基础学习 - 接口
文章目录 背景 接口定义 接口实现 实例 接口中的属性 实例 函数重写 实例 背景 学习,记录分享,坚持开源! 接口定义 Kotlin 接口与 Java 8 类似,使用 interface 关键字定义 ...
- android通过代码设置铃声_Android基础(5)—自定义View
自定义View 基本认知: 虽然Android已经自带来很多强大的UI控件,但是依旧不能满足所有开发人员的需求.通常开发人员需要实现设计师精心设计的视觉效果,这样情况下可能现有的控件就不能满足需求或者 ...
- Android零基础入门第40节:自定义ArrayAdapter
原文:Android零基础入门第40节:自定义ArrayAdapter ListView用起来还是比较简单的,也是Android应用程序中最重要的一个组件,但其他ListView可以随你所愿,能够完成 ...
最新文章
- Linux 探索之旅 | 第三部分第五课:延时执行,唯慢不破
- 返回txt格式的文本使用编码 js_Node.js学习笔记第一天
- pdo php分页6,php pdo自动分页类代码与例子
- AndroidStudio编译提示Could not find com.android.tools.lintlint-gradle26.1.3问题的解决
- python读取excel,数字都是浮点型,日期格式是数字的解决办法
- PDFMate PDF Converter Pro
- 怎样使用C# 获取WIFI的连接状态?
- POJ1006-Biorhythms【中国剩余定理】
- php拿站,从建站到拿站
- linux-压缩与解压缩
- C#LeetCode刷题之#136-只出现一次的数字(Single Number)
- CCF NOI1025 统计奖牌
- idea导入tomcat源码
- 在mysql存储过程中拼接sql解决in的字段类型不匹配问题
- 精进 Quartz—Quartz大致介绍(一)
- 修改SRVINSTW支持sys文件
- 基于matlab人脸识别论文,基于MATLAB的人脸识别系统的设计
- 计算机考研数学2019,2019计算机考研数学复习:最常遇到的10个问题
- OpenCV C++案例实战三《二维码检测》
- 微信如何实现小程序实时视频直播点播?有哪些难点?