前言

  此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解

添加Interceptor的简单例子

Android 开发 框架系列 OkHttp使用详解 可以了解到okhttp的基本使用,初始化OkHttpClient的时候我们可以添加拦截器,如下:

// 配置一些信息进入OkHttpClient
mOkHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.readTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.writeTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.addInterceptor(new MyInterceptor())
.build();

如上代码,很简单,只要利用addInterceptor方法就可以添加拦截器,而自定义的拦截器只需要实现Interceptor接口就行了,如下所示:

public class MyInterceptor implements Interceptor {
...
}

在有简单的了解后,我们来讲解拦截器的一些使用情景.

修改header头部信息

在一些接口需要增加头部信息或者修改头部信息的时候,如果我们直接对Request请求里增加头部字段难免会有增加耦合的问题.而在拦截器里修改就可以避免严重的耦合,如下代码增加了Body的类型与token信息.

public class HttpHeaderInterceptor implements Interceptor {
private String token; public HttpHeaderInterceptor(String token) {
this.token = token;
} @Override
public Response intercept(@NonNull Chain chain) throws IOException {
// 配置请求头
String accessToken = "token";
Request.Builder builder = chain.request().newBuilder();
builder.header("Content-Type", "application/json") //增加body类型
.header("Accept", "application/json");
builder.header(accessToken, token); //增加token
Request request = builder.build();
return chain.proceed(request); //继续发送
}
}

拦截取消请求

public class HttpHeaderInterceptor implements Interceptor {
private String token; public HttpHeaderInterceptor(String token) {
this.token = token;
} @Override
public Response intercept(@NonNull Chain chain) throws IOException {
// 配置请求头
if (TextUtils.isEmpty(token)){
chain.call().cancel();
return null;
}
//略......
}
}

网络日志拦截

请注意! 如果你OkHttpClient需要用于下载文件请不要添加网络日志拦截,否则会影响流的回调

使用okhttp网络日志拦截器需添加以下依赖:

implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'

定义拦截器中的网络日志工具:

 HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {

            @Override
public void log(String message) {
Log.d("logInterceptor", message);
}
});
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //设置拦截器,不要忘记设置日志的级别,否则会不回调数据

初始化OkHttpClient,并添加网络日志拦截器:

mOkHttpClient = new OkHttpClient.Builder()
.addInterceptor(logInterceptor) //设置拦截器
.build();

Android 开发 框架系列 OkHttp拦截器的更多相关文章

  1. Android 开发 框架系列 OkHttp使用详解

    简介 okhttp是一个第三方类库,用于android中请求网络.这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) . ...

  2. Android 开发 框架系列 OkHttp文件上传功能实现(含断点续传)

    前言 此篇博客只是上传功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html 代码部 ...

  3. Android 开发 框架系列 OkHttp文件下载功能实现(含断点续传)

    前言 此篇博客只是下载功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html 代码部 ...

  4. Android 开发 框架系列 Google的ORM框架 Room

    目录 简介 导入工程 使用流程概况 一个简单的小Demo 深入学习 @Entity使用 自定义表名 tableName  自定义字段名@ColumnInfo 主键 @PrimaryKey 索引 @In ...

  5. android 开发 框架系列 使用 FileDownloader 实现检查更新的功能class

    首先介绍一下FileDownloader GH :https://github.com/lingochamp/FileDownloader/blob/master/README-zh.md FileD ...

  6. Android 开发 框架系列 百度语音合成

    官方文档:http://ai.baidu.com/docs#/TTS-Android-SDK/6d5d6899 官方百度语音合成控制台:https://cloud.baidu.com/product/ ...

  7. Android 开发 框架系列 EventBus 事件总线

    介绍 GitHub:https://github.com/greenrobot/EventBus 先聊聊EventBus 线程总线是干什么的,使用环境,优点.缺点. 干什么的? 一句话,简单统一数据传 ...

  8. Android 开发 框架系列 glide-transformations 图片处理基本使用

    首先简单的介绍一下Gilde作用范围.Gilde功能十分强大,它可以实现图片处理.图片本地加载.图片网络加载.位图加载.图片内存缓存.图片磁盘缓存.Gif图片加载.使用简单轻松,轻松的后是它强大的心, ...

  9. Android 开发 框架系列 Android-Universal-Image-Loader 图片加载使用demo

    Android-Universal-Image-Loader github地址:https://github.com/nostra13/Android-Universal-Image-Loader 加 ...

随机推荐

  1. 一份完整的 Java 成神路线图,值得收藏!

    Java,是现阶段中国互联网公司中,覆盖度最广的研发语言. 有不少朋友问,如何深入学习Java后端技术栈,今天分享一个,互联网牛人整理出来的完整的Java成神路线图. 一:常见模式与工具 学习Java ...

  2. &与&&,|与||的区别

    今天在做leetcode的时候,遇到了运算符的不同而导致结果不一致的问题.记录一下提醒自己 中文名称与英文名称 &:按位与(Bitwise and) &&:逻辑与(logica ...

  3. 2-Ubuntu命令安装mysql服务器和客户端及安装后的简单验证操作

    转自: https://www.cnblogs.com/zhuyp1015/p/3561470.html 安装完成之后可以使用如下命令来检查是否安装成功:   sudo netstat -tap | ...

  4. vuex-along解决vuex中存储的数据在页面刷新之后失去的问题

    1. 为什么会失去? vuex可以看成是一个"提升变量"的一个工具,它是将state当做全局变量存储.F5刷新页面之后自然随着页面的刷新重新初始化state. 2. 如果解决数据保 ...

  5. 使用jQuery的datetimepicker插件

    因为后台系统要使用年月日时分的设置,又因为使用的Bootstrap框架只有datepicker和timepicker控件.所以在jQuery库中找到轻量级的datetimepicker插件,很好地解决 ...

  6. PS安装失败解决方法

    清除Adobe软件卸载残余文件 ,使用下面的工具,可以清除残余文件,然后再次安装 链接: https://pan.baidu.com/s/1OfIDnjpmqw34dWQ8LH6fIQ 提取码: b7 ...

  7. MaxCompute表设计最佳实践

    MaxCompute表设计最佳实践 产生大量小文件的操作 MaxCompute表的小文件会影响存储和计算性能,因此我们先介绍下什么样的操作会产生大量小文件,从 而在做表设计的时候考虑避开此类操作. 使 ...

  8. 2018-2019-2-20175323 java实验二《Java面向对象程序设计》

    单元测试 1.在IDEA中新建项目并输入单元测试的代码 2.在IDEA中下载Junit,我发现Junit已经存在了 3.新建test文件 遇到的问题 发现Junit红字解析不了 解决办法:查找到jun ...

  9. git相关操作。

    之前只会用图形端的GIT中,命令行的比较陌生,整理下,供自己以后参考 关键的名词: 工作区:工作区 Index / Stage:暂存区 仓库:仓库区(或本地仓库) 远程控制:远程仓库 到项目目录下gi ...

  10. 转:这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的。供大家使用。

    http://www.cnblogs.com/gmh915/archive/2009/09/30/1576995.html 这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的.供 ...