OkHttp3深入了解之Interceptors

基本使用——OkHttp3详细使用教程 概述 OkHttp现在应该算是最火的Http第三方库,Retrofit底层也是使用OkHttp,网上很多教程都写的不错,但是有些我认为重要的知识,大多一笔带过,所以我决定写一篇入门文章 OkHttp官网地址:http://square.github.io/okhttp/ OkHttp GitHub地址:https://github.com/square/okhttp 出现背景 网络... 阅读详情

OKHttp官网上面介绍:拦截器是一种强大的机制,可以监视,重写和重试调用。这里我们主要对拦截器的网络请求头和数据请求的封装。

  • 网络请求头拦截器
    在Android应用中,我们通常需要获取用户手机的IMEI值和其他一些常用的参数,如果把他们封装到请求头里面的话会非常的方便。
    既然是自定义拦截器,我们首先肯定要继承OKHttp的拦截器,把这个自定义类设置成final类型的防止其他类继承。
    这里需要在父类的intercept(Chain chain)方法中进行操作。在方法里面得
    Request.Builder对象然后添加请求头。
    创建一个BaseParam 对象,对请求头的参数进行封装。
public final class HeaderInterceptorTest implements Interceptor {

    /**
     * 请求头参数基础参数
     */
    private static final String HEADER_BASE_PARAM = "baseParam";
    private static String BASE_PARAM;

    @Override
    public Response intercept(Chain chain) throws IOException {

        Request.Builder builder = chain.request().newBuilder();

        builder.addHeader(HEADER_BASE_PARAM, BASE_PARAM);
        return chain.proceed(builder.build());
    }

    public static void initBaseParam(Context context) {
        BaseParam baseParam = new BaseParam();
        String imei;
        String imsi;
        try {
            imei = DeviceInfoUtil.getIMEI(context);
        } catch (Exception e) {
            imei = null;
        }
        if (null == imei || imei.equals("")) {
            imei = DeviceInfoUtil.getDeviceID(context);
            imsi = DeviceInfoUtil.getDeviceID(context);
        } else {
            imei = DeviceInfoUtil.getIMEI(context);
            imsi = DeviceInfoUtil.getIMSI(context);
        }
        baseParam.setImei(imei);
        baseParam.setImsi(imsi);
        baseParam.setMac(DeviceInfoUtil.getWifiMAC(context));
        baseParam.setVersion(DeviceInfoUtil.getVersion(context));
        baseParam.setModel(DeviceInfoUtil.getModel());
        baseParam.setBrand(DeviceInfoUtil.getBrand());
        BASE_PARAM = new Gson().toJson(baseParam).toString();
    }

    private static class BaseParam {
        /**
         * imei :
         * imsi :
         * mac :
         * version :
         * model :
         * brand :
         * city :
         */
        private String imei;
        private String imsi;
        private String mac;
        private String version;
        private String model;
        private String brand;
        private String city;

        public String getImei() {
            return imei;
        }

        public void setImei(String imei) {
            this.imei = imei;
        }

        public String getImsi() {
            return imsi;
        }

        public void setImsi(String imsi) {
            this.imsi = imsi;
        }

        public String getMac() {
            return mac;
        }

        public void setMac(String mac) {
            this.mac = mac;
        }

        public String getVersion() {
            return version;
        }

        public void setVersion(String version) {
            this.version = version;
        }

        public String getModel() {
            return model;
        }

        public void setModel(String model) {
            this.model = model;
        }

        public String getBrand() {
            return brand;
        }

        public void setBrand(String brand) {
            this.brand = brand;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }
    }
}
  • 数据请求拦截器
    在进行数据请求的时候,一般都会定义一种固定的请求格式。在这里我们直接通过拦截器,将这个固定的格式定义好,这样使用起来可以统一管理。具体的使用方法其实和上面一样。
    主要注意的是先得到,请求时设置的请求体,然后让请求的数据封装到和后端设置的请求格式里面。
public class HttpDataPackInterceptorTest implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        Request.Builder requestBuilder = chain.request().newBuilder();
        //请求数据处理
        if (request.url().toString().contains("uploads")) {
            //特殊接口的参数不需要处理的
        } else {
            //需要处理请求参数的
            if (request.body() instanceof FormBody) {
                FormBody.Builder newFormBody = new FormBody.Builder();
                //得到请求时设置的请求体
                FormBody oldFormBody = (FormBody) request.body();
                Buffer buffer = new Buffer();
                oldFormBody.writeTo(buffer);
                String postParams = JsonUtils.getJsonStrFromPostParams(buffer.readString(Charset.forName("UTF-8")));
                String data = URLDecoder.decode(postParams, "UTF-8");
                if (TextUtils.isEmpty(data)) {
                    newFormBody.add("data", "");
                } else {
                    //将请求的数据封装
                    newFormBody.add("data", data);
                }
                requestBuilder.method(request.method(), newFormBody.build());
            }
        }
        return chain.proceed(requestBuilder.build());
    }
}
  • 代码中调用
    在创建OkHttpClient 对象的时候,调用addInterceptor()方法添加俩个拦截器。
private OkHttpClient client;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp);
        HeaderInterceptorTest.initBaseParam(this);
        client= new OkHttpClient()
                .newBuilder()
                .addInterceptor(new HeaderInterceptorTest())
                .addInterceptor(new HttpDataPackInterceptorTest())
                .connectTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS).build();
        okhttpAsyncPost();
    }

    private void okhttpAsyncPost(){
        RequestBody formBody = new FormBody.Builder()
                .add("page", "1")
                .add("count", "2")
                .add("type","video")
                .build();
        Request request = new Request.Builder()
                .url("https://api.apiopen.top/getJoke")
                .post(formBody)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("error","结果"+response.body().string());
                Log.e("error","方法"+response.request().toString());
                Log.e("error","请求头"+response.request().headers().toString());
            }
        });
    }

打印的日志

结果{"status":200,"msg":"OK","data":"{\"count\":\"2\",\"page\":\"1\",\"type\":\"video\"}"}
方法Request{method=POST, url=https://www.26uuun.com/list, tags={}}
请求头baseParam: {"brand":"Xiaomi","city":"\u4e1c\u4eac","imei":"9fc70b16bf169075f556e6d67be9ef1a","imsi":"9fc70b16bf169075f556e6d67be9ef1a","mac":"02:00:00:00:00:00","model":"Mi Note 2","version":"1.0"}

OK,OKHttp3中Interceptors配置完成,小伙伴们,可以设置自己不同需求的其他的拦截器添加到请求中。
最近我会写很多关于Android常用控件的使用,里面都是一些很有用的知识,如果你感觉有用,请给我一个star,谢谢。代码实例

不是吧!做了3年Android还没看过OkHttp源码?好吧,带你彻底理解一波! 前言 现在Android界的网络请求已经是OkHttp和Retrofit的天下了,Retrofit本质上也是将请求委托给了OkHttp,所以我们如果想要能够更加全面的使用和掌握OkHttp,了解其源码是必不可少的。 如果对Http还有不了解的小伙伴,可以一下这篇文章,带你全面掌握Http协议 面试官的这份HTTP灵魂追问你Hold住吗? 作者:Mlx 链接:https://juejin.im/post/6881436122950402056 OK,出发~ 简单使用 同步方式和异步方式殊途同归,而且异步 阅读详情

相关推荐

OkHttp 3.x 源码解析之Interceptor 拦截器

Tamic / http://blog.youkuaiyun.com/sk719887916/article/details/74308343 OkHttp拦截器原理解析拦截器Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。 在

Tamic (大白) 1万+

深入理解OkHttp3:(五)拦截器(Interceptors)

拦截器是一种强大的机制,可以监视、重写和重试调用(Call)。下面是一个简单的拦截器,它记录发出的请求和传入的响应。 class LoggingInterceptor implements Interceptor { @Override public Response intercept(Interceptor.Chain chain) throws IOException { R...

challenge51all的专栏 980

深入了解OkHttp3之Interceptors

主要介绍了深入了解OkHttp3之Interceptors,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

OkHttp3.0(四)-Interceptor拦截器(1)-拦截器链Chain

1.引言 我们在前面几个章节的学习过程中,已经可以明白OkHttp的基本使用,OkHttp在使用的过程中几个常用的类的分析,OkHttp的分配器Dispatcher。其中在RealCall中,不管是同步请求还是异步请求,最终都会调用的一个方法,得到网络请求响应结果Response,就是getResponseWithInterceptorChain()方法。因为这个方法用的是拦截器链调用拦截器执行...

Lone_Star斌 的博客 5136

构建高可用CephFS NFS网关:NFS-Ganesha与RADOS集群的深度整合

本文详细介绍了如何构建高可用的CephFS NFS网关,通过NFS-Ganesha与RADOS集群的深度整合,实现高效文件共享。文章涵盖核心架构、部署实战、性能调优及避坑指南,帮助用户解决Ceph客户端兼容性问题,提升存储访问效率。特别强调高可用设计,确保服务稳定性,适用于金融、电商等高要求场景。

weixin_26976635的博客 254

快手商业化风控内容审核场景下的大模型早期探索与应用

在处理大量的自动语音识别(ASR)输出时,面临的主要挑战之一是文本的冗长和格式混乱,这严重影响了审核人员的阅读效率。为了解决这一问题,我们利用大模型的理解能力对文本进行智能总结,可以显著优化文本内容,使其更加清晰并且具有可读性。该方式极大地提高了审核过程的效率,审核人员可以更快地处理信息,减少了处理时间和劳动强度。

kuaishoutech的博客 2740

OKHttp3--拦截器链RealInterceptorChain源码解析【五】

其实听这个名字我们也大概直到拦截器的意思,在OKHttp中,我们发出的HTTP请求并不是直接就连接到服务器然后获取结果,而是由OKHttp中的拦截器截获我们发出的请求,它可以观察,修改并可能使请求中断,然后返回结果,通常情况下,拦截器会对request或者response的头部headers进行添加,删除,转换操作 总而言之,拦截器是OKHttp提供的一种强大机制,它可以实现网络监听,请求以及响应重写,失败重连等功能

Mango先生的博客 3668

陀螺仪选型避坑指南:为什么IMU660RA是智能车竞赛的性价比之选?

本文针对智能车竞赛场景,提供陀螺仪选型避坑指南,并深度解析为何IMU660RA成为性价比之选。文章指出,竞赛选型应避免盲目追求高性能“黑盒”模块,而应注重原始数据获取与算法开发。IMU660RA以其良好的常温稳定性、适中的噪声水平、极致的性价比和丰富的生态支持,成为帮助参赛者深入理解姿态解算原理、进行“白盒开发”的理想教学与实践平台。

tech5的博客 882

Interceptors拦截器——OkHttp3详细使用教程

这篇文章是从官网https://github.com/square/okhttp/wiki/Interceptors翻译来的,但是我发现官网的演示代码有一个问题(见第一段代码注释),所以写转载这么一篇,便于复习,也顺便改正代码在OkHttp中Interceptors拦截器是一种强大的机制,可以监视,重写和重试Call请求。下面是一个简单的拦截器,它记录发出的请求和返回的响应。class Loggin

薛瑄的博客 1万+

跟着团子学SAP CO:基于成本的完工百分比结算:Cost-based POC(以项目为例)

本文以英国及北美会计准则下的基于成本的POC的销售型项目结算对PS模块中的完工百分比进行介绍

Lucas1211的博客 2万+

MAVLink协议详解

MAVLink是为微型飞行器MAV(Micro Air Vehicle)设计的(LGPL)开源的通讯协议。是无人飞行器和地面站(Ground Control Station ,GCS)之间,以及无人飞行器之间通讯常用的协议。APM、PIXHAWK飞控,Mission Planner、QGroundControl地面站均使用了MAVLink协议进行通讯。 MAVLink源码下载地址(现已更新至v2.0):https://github.com/mavlink/qgroundcontrol   用户手册:ht

程序猿老樊的博客 7708

OkHttp3使用(三)-Interceptor

在上一篇文章中,我们介绍了OkHttp的基本用法。本篇文章,我们继续介绍其Interceptor的用法。在OkHttp框架中,Interceptor算是其强大的原因所在。我们平时很多功能(如下载进度监听、缓存策略设置、日志打印等)都需要通过Interceptor来实现。 Interceptor介绍 我们先看下下Interceptor这个类的源码: public interface Intercep...

VictorCatFish的博客 4452

游戏“中台”的故事——架构演进、团队协同与产品创新的深度剖析

什么是中台?在游戏行业里,中台并不是把所有技术都归口管理、统一“圈养”。更不是简单的工具集合。它代表的,是一种“模块化底座”——把业务的通用能力、基础支撑和数据结合,变成可复用、可扩展、可创新的技术体系。让“前台”专注于创新玩法、极致体验;让“后台”稳健保障数据、安全、性能;让“中台”统合各种资源、流程、工具,形成平台型生产力。游戏中台是团队协同、技术创新、业务增长并行的产物。它让开发从重复劳动解脱,带着创新冲锋;让运营靠数据说话,精准制胜;让产品实现高效迭代,生态爆发。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1950

深入理解OkHttp3(1):Interceptors

Version : okhttp:3.6.0 Interceptors是OkHttp3整个框架的核心,包含了请求监控、请求重写、调用重试等机制。它主要使用责任链模式,解决请求与请求处理之间的耦合。 1.1 责任链模式 将接收对象放入链中,按照链中顺序让多个对象处理请求。请求...

chuqian9789的博客 233

AI穿透式智慧粮仓

本报告基于 2025-2026 年全国多地智慧粮储实践案例,系统分析了 "AI + 穿透式" 智慧粮储体系的技术架构、AI 算法应用、提质增效成效、区域差异化特点及未来发展趋势。该体系通过多模态感知、智能算法与管控平台的深度融合,实现粮食存储全流程精准感知、智能预警与科学调控,显著降低储粮损耗与运营成本,大幅提升储粮安全水平与管理效率。报告梳理了各地差异化实践路径,提出针对性发展建议,为推动我国粮食仓储高质量发展、筑牢国家粮食安全防线提供参考。

reset2021的博客 231

让 OData V4 界面更聪明:SAP UI5 中的 Side Effects 全解析

摘要:在OData V4应用中,字段修改常触发联动更新(Side Effects)。SAP UI5支持通过后端PATCH响应隐式返回或前端显式请求(requestSideEffects)两种方式处理。最佳实践包括:在validateFieldGroup事件中触发同批次请求,使用$$patchWithoutSideEffects避免重复刷新,并在草稿场景优化响应体。注解定义触发规则,而前端负责执行时机,二者配合可减少网络开销并保证数据一致性。Fiori elements进一步扩展了Side Effects在批

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 179

java拦截器sha_OkHttp3 之 Interceptors 拦截器(二)

拦截器是一种强大的机制,可以监视、重写和重试调用,拦截器可以是链式的,假设你有一个压缩拦截器和一个校验拦截器,那么需要决定数据是否被压缩后进行校验,或者是先校验后压缩。OkHttp采用列表的形式追踪拦截器,拦截器会被有序调用。在注册拦截器时,可以注册成两类拦截器,分别为应用拦截器(Application Interceptors)和网络拦截器(Network Interceptors),如下图:1...

weixin_34863212的博客 536

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OkHttp中interceptors拦截器

OkHttp拦截器是一种强大的机制,可以监视、重写和重试调用 1、LogInterceptor 示例代码 class LogInterceptor:Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val mRequest=chain.request() // startTime val startTime=System.currentTimeMi.

VipPetergee的博客 817

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

okhttp 应用之 Interceptors 拦截器,「实践 + 原理」一样都不少

okhttp 是什么?一款封装 HTTP 协议的 HTTP 客户端。 拦截器是 okhttp 提供的一个强有力的工具,我们可以在请求前后做监控、请求/响应进行重写、失败重试等操作。

持之以恒 3005

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OkHttp3.9拦截器原理与区别

接上回传送门 上回我们讲到,OkHttp的请求过程中有个非常重要的东西-“拦截器”,而且拦截器又分为interceptors和networkInterceptors两种,那它们具体有何区别呢?又要怎么来使用?现在来一探究竟 拦截器工作原理 在弄清楚区别之前,要先知道他们工作的原理,还是来到RealCall.execute方法里面的getResponseWithInterceptorChain...

梦里梦到醒不来的梦 1055

OkHttp3框架的使用(一)

OkHttp3框架的使用(一) 1 简介 OkHttp是一个用于Android网络请求的第三方开源的轻量级框架。它支持同步和异步请求还封装了线程池,自动处理GZip压缩节省响应数据大小;支持缓存响应请求数据避免重复请求等。 OkHttp的4.0.x版本已经全部由java替换到了Kotlin,目前我们采用3.X版本。可到OkHttp官网查看最新版本:https://square.github.io/okhttp 2 接入 OkHttp在3.13.x以上的版本需要在Android 5.0+ (API level

下午吃早餐同学 704

Retrofit2 + OkHttp3下统一设置Http请求的Headers

在Retrofit和OkHttp3的环境下为请求设置通用的Headers

u011734444的专栏 2万+

Okhttp 源码解析 二 之 OkHttpClient

一 成员变量 介绍 1 dispatcher 线程 调度器 2 @get:JvmName("connectionPool") val connectionPool: ConnectionPool = builder.connectionPool 连接池 作用: 同类对象的批量管理,连接池 可以存储 一批的链接 ,当需要一个连接的时候 不是去创建的,而是连接池里 有没有一个链接可用的,有的话就直接拿走,没有的话 自己创建 或者让连接池 创建,当有一个连接 用完了,不直接 ...

xuwb123xuwb的博客 855
上一篇: 初探OkHttp3
下一篇: Git从1到7-了解Git常用命令
Code_legend
博客等级 码龄10年 33粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值