Retrofit 拦截器-基础公共参数拦截器实现

详解Retrofit Interceptor(拦截器) 拦截请求并做相关处理 本篇文章主要介绍了详解Retrofit Interceptor(拦截器) 拦截请求并做相关处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

为了紧跟潮流,之前在公司新开项目中设计使用了MVP+Retrofit+Dagger2模式的开发框架,但由于当时时间紧,任务重。尝试去通过拦截器添加基础参数,但是POST请求一直不成功,最终无奈放弃,使用了最Low的方式,GET,POST请求全部是用@QueryMap注解来添加请求参数,然后将基础参数封装一个公共的方法,每次请求接口时调用。这也成为了我心中一直的一个梗,久久不能释怀。后来曾多次尝试解决,一直不得其法,今天终于解决了!!!并在发现了是一个极其低级的错误,反思还是自己对Retrofit没有去了解,连基本用法也用的马马虎虎。特此记录!

废了这么多话,现在开始重点!

App在与后台交互时,通常会存在一些基础公共的请求参数,比如 "用户Id",“版本号”,“平台号”等等;这些参数是任何接口请求都会添加的请求参数。这种重复代码工作,我们首先想到的肯定就是使用拦截器。而Retrofit这种优秀的网络请求框架就支持众多功能强大拦截器,主要包括请求前操作拦截器(对Request 参数进行处理)和请求后操作拦截器(对Response数据进行处理)。

今天主要介绍一下请求前操作拦截器-添加基础公共参数拦截器实现

/**
 * Retrofit 基本参数拦截器
 */
public class CommonParamInterceptor implements Interceptor {

    /**
     * 请求方法-GET
     */
    private static final String REQUEST_METHOD_GET = "GET";

    /**
     * 请求方法POST
     */
    private static final String REQUEST_METHOD_POST = "POST";

    /**
     * 基础参数-平台号
     */
    private static final String REQUEST_COMMON_PARAM_PLATFORM = "2";

    /**
     * 基础参数-个体户Id
     */
    private static final String REQUEST_COMMON_PARAM_PERSONALID = "0";

    /**
     * 基础参数-未登录 userId
     */
    private static final String REQUEST_COMMON_PARAM_USERID_DEFAULT = "0";

    /**
     * 基础参数-未登录 token
     */
    private static final String REQUEST_COMMON_PARAM_TOKEN_DEFAULT = "";

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

        //获取原先的请求对象
        Request request = chain.request();
        if (REQUEST_METHOD_GET.equals(request.method())) {
            request = addGetBaseParams(request);
        } else if (REQUEST_METHOD_POST.equals(request.method())) {
            request = addPostBaseParams(request);
        }
        return chain.proceed(request);
    }


    /**
     * 添加GET方法基础参数
     *
     * @param request
     * @return
     */
    private Request addGetBaseParams(Request request) {

        HttpUrl httpUrl = request.url()
                .newBuilder()
                .addQueryParameter("platform", REQUEST_COMMON_PARAM_PLATFORM)//平台号
                .addQueryParameter("version", ToolHelper.getVersionName())//版本号
                .addQueryParameter("enterpriseId", FSaveData.Login.getEnterpriseId())//企业Id
                .addQueryParameter("personalId", REQUEST_COMMON_PARAM_PERSONALID)//个体户id
                .build();

        //根据登录状态添加userId&&token
        if (ToolHelper.logined()) {
            httpUrl = httpUrl.newBuilder()
                    .addQueryParameter("userId", FSaveData.Login.getUserId())
                    .addQueryParameter("token", FSaveData.Login.getToken())
                    .build();
        } else {
            httpUrl = httpUrl.newBuilder()
                    .addQueryParameter("userId", REQUEST_COMMON_PARAM_USERID_DEFAULT)
                    .addQueryParameter("token", REQUEST_COMMON_PARAM_TOKEN_DEFAULT)
                    .build();
        }

        //添加签名
        Set<String> nameSet = httpUrl.queryParameterNames();
        ArrayList<String> nameList = new ArrayList<>();
        nameList.addAll(nameSet);
        Map<String, Object> paramMap = new HashMap<>();
        for (int i = 0; i < nameList.size(); i++) {
            paramMap.put(nameList.get(i), httpUrl.queryParameterValue(i));
        }
        httpUrl = httpUrl.newBuilder().addQueryParameter("sign", ToolHelper.dataSignature(paramMap)).build();

        request = request.newBuilder().url(httpUrl).build();
        return request;
    }

    /**
     * 添加POST方法基础参数
     *
     * @param request
     * @return
     */
    private Request addPostBaseParams(Request request) {

        /**
         * request.body() instanceof FormBody 为true的条件为:
         * 在ApiService 中将POST请求中设置
         * 1,请求参数注解为@FieldMap
         * 2,方法注解为@FormUrlEncoded
         */
        if (request.body() instanceof FormBody) {
            FormBody formBody = (FormBody) request.body();
            FormBody.Builder builder = new FormBody.Builder();

            for (int i = 0; i < formBody.size(); i++) {
                //@FieldMap 注解 Map元素中 key 与 value 皆不能为null,否则会出现NullPointerException
                if (formBody.value(i) != null)
                    builder.add(formBody.name(i), formBody.value(i));
            }

            builder
                    .add("platform", REQUEST_COMMON_PARAM_PLATFORM)//平台
                    .add("version", ToolHelper.getVersionName())//版本号
                    .add("enterpriseId", FSaveData.Login.getEnterpriseId())//企业Id
                    .add("personalId", REQUEST_COMMON_PARAM_PERSONALID);//个体户id


            //根据登录状态添加userId&&token
            if (ToolHelper.logined()) {
                builder
                        .add("userId", FSaveData.Login.getUserId())
                        .add("token", FSaveData.Login.getToken());
            } else {
                builder
                        .add("userId", REQUEST_COMMON_PARAM_USERID_DEFAULT)
                        .add("token", REQUEST_COMMON_PARAM_TOKEN_DEFAULT);
            }

            //添加签名
            Map<String, Object> paramMap = new HashMap<>();
            formBody = builder.build();
            for (int i = 0; i < formBody.size(); i++) {
                paramMap.put(formBody.name(i), formBody.value(i));
            }
            formBody = builder
                    .add("sign", ToolHelper.dataSignature(paramMap))
                    .build();

            request = request.newBuilder().post(formBody).build();
        }
        return request;
    }

}



如代码注释所言,我所犯下的低级错误就是,无论GET,还是POST请求,全部都是用了@QueryMap参数注解,而@Query,@QueryMap仅仅是Retrofit中对@GET注解提供的请求参数注解。@POST注解合适的是@Field 和 @FieldMap注解,否则POST方式下 

request.body() instanceof FormBody

永远都为fasle!!!


正确使用@GET,@POST:

    @GET("mobileVerify")
    Observable<CheckPhoneBean> checkPhone(@QueryMap Map<String, Object> stringObject);

    @POST("register")
    @FormUrlEncoded
    Observable<RegisterResponse> register(@FieldMap Map<String, Object> map);


Retrofit2 注解相关请参考:Retrofit2 ,Dagger2等常用框架注解功能介绍


最后为Retrofit添加拦截器

/**
 * 获取全局Retrofit实例对象
 * 用于非集成公共基类BaseActivity && BaseFragment情况下进行网络请求使用
 * 采用Double Check Lock 单例模式
 * 添加超时时间&&基础公共参数拦截器&&网络请求返回信息打印拦截器
 */
public class RetrofitHelpter {

    private static final int TOME_OUT = 100; //超时时间

    private static Retrofit mInstance = null;

    private RetrofitHelpter() {
    }

    /**
     * 提供Retrofit实例对象
     * DCL单例模式
     *
     * @return
     */
    public static Retrofit getInstance() {
        if (mInstance == null) {
            synchronized (Retrofit.class) {
                if (mInstance == null) {
                    mInstance = new Retrofit.Builder()
                            .baseUrl(API.BASE_URL)
                            .client(providerOkHttpClient())
                            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//使用rxjava
                            .addConverterFactory(GsonConverterFactory.create())//使用Gson
                            .build();
                }
            }
        }
        return mInstance;
    }

    /**
     * 提供OkhttpClient实例对象
     *
     * @return
     */
    private static OkHttpClient providerOkHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .connectTimeout(TOME_OUT, TimeUnit.SECONDS)
                .readTimeout(TOME_OUT, TimeUnit.SECONDS)
                .addNetworkInterceptor(providerNetworkInterceptor())
                .addInterceptor(providerInterceptor());

        return builder.build();
    }

    /**
     * 提供网络请求返回信息打印拦截器
     *
     * @return
     */
    private static Interceptor providerNetworkInterceptor() {
        return new RequestIntercept(null);
    }

    /**
     * 基础公共参数拦截器
     *
     * @return
     */
    private static Interceptor providerInterceptor() {
        return new CommonParamInterceptor();
    }
}

银行一表通监管报送系统详解 国家金融监管总局对于“一表通”的总体描述为:通过建立一套明细级、标准化的数据体系和汇总计算规则,将银行机构传送至监管可信区的业务明细数据汇总生成财务指标、监管指标和监管报表,大幅提升监管数据时效性,统一数据标准,实现数据间的穿透和整合,同时改变机构多头报送数据模式,减轻机构报送负担。 阅读详情

相关推荐

重构工业交互体验:响应式数据可视化大屏解决方案

从智慧园区到数据中心,从水务监控到风力发电场景,HT 通过 2D/3D 组态技术与响应式布局机制,让数据以更灵活、更精准的方式呈现场景动态 —— 这正是 HT 技术在工业可视化领域的核心价值。例如,在智慧楼宇监控系统中,HT 引擎可实时渲染建筑结构、设备状态与数据流,同时确保画面在不同尺寸屏幕上的一致性。以某工业数据中心大屏为例,HT 通过暗红色主调搭配工业元素,结合粉色与黄色点缀,打破传统深蓝色大屏的视觉定式,同时通过矢量图形确保色彩在不同亮度下的辨识度 —— 这正是 HT 技术在视觉设计上的独特优势。

Hightopo的博客 889

retrofit/okhttp如何拦截请求参数(包含get,post请求)

okhttp拦截请求参数

qq_36162336的博客 2634

保姆级QFIL线刷教程:从驱动安装到成功刷机的完整避坑指南(Win10/11实测)

本文提供了一份详细的QFIL线刷教程,涵盖从驱动安装到成功刷机的完整流程,特别针对Win10/11系统进行了实测。文章重点解决了EDL模式下的常见问题,如Download Fail和COM Port识别错误,并提供了实用的避坑技巧和故障排除方案,帮助用户实现零失误操作。

weixin_29245767的博客 765

Android Retrofit OkHttp添加Interceptor拦截器设置POST请求公共参数

private HttpServiceImpl() { OkHttpClient httpClient = new OkHttpClient.Builder() .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) // 对请求进行拦截处理,添加统一的请求头及打印请求报文和返回报文 ...

野猿新一 4127

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 434

万物皆可GAN ---普通GAN, pix2pix, CycleGAN和pix2pixHD的比较以及演变过程

普通GAN, pix2pix, CycleGAN和pix2pixHD的原理、比较以及演变过程

m0_61985580的博客 3724

Retrofit2自定义接口转发拦截器

通过拦截器,统一实现(根据原有的接口路径,指向服务总线的新接口地址.)

唐诺 1026

EtherCAT丢包问题深度解析:从原理到实战排查指南

在工业自动化与运动控制领域,实时通讯网络的稳定性是系统可靠运行的基石。EtherCAT(以太网控制自动化技术)作为一种高性能工业以太网协议,其核心在于独特的“飞读飞写”机制和纳秒级的分布时钟同步,以实现多设备间的精准协同。然而,物理链路干扰、配置不当或硬件性能瓶颈都可能导致数据帧丢失,破坏时钟同步,进而引发伺服抖动、定位精度下降乃至生产线停机。本文聚焦于EtherCAT丢包这一典型故障,结合SSC(Slave Stack Code Tool)从站协议栈开发与实时系统调优等工程实践,系统阐述其成因、影响及一套

weixin_32050773的博客 341

OkHttp + Retrofit 拦截器 拼装参数拦截器 日志输出拦截器

OkHttp + Retrofit 拦截器 拼装参数拦截器 日志输出拦截器 //手动创建一个OkHttpClient并设置超时时间缓存等设置 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.addInterceptor(new LoggingInterceptor(user_toke

他晓 1097

狂神说docker(最全笔记)

一.Docker入门 1. Docker 为什么会出现 2. Docker的历史 3.Docker最新超详细版教程通俗易懂 Docker是基于Go语言开发的!开源项目 官网 官方文档Docker文档是超详细的 仓库地址 4. 虚拟化技术和容器化技术对比 4.1. 虚拟化技术的缺点 资源占用十分多 冗余步骤多 启动很慢 2.2. 容器化技术 比较Docker和虚拟化技术的不同 传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软.

qq_21197507的博客 5万+

YOLO26 正式发布源代码!极致速度优化方案, 面向工业级落地的目标检测模型!

YOLO26 作为 Ultralytics 公司于 2025 年 9 月发布的最新一代目标检测模型,在架构设计和技术实现上展现了显著的创新。本文深入分析了 YOLO26 的核心架构改进和技术原理,重点探讨了其在边界框回归、推理流程、损失函数设计和优化算法方面的突破性进展。

魔改工程师的博客 1244

retrofit interceptor body 加密_Kotlin+Retrofit+Recyclerview的使用以及示例代码

大家好,我是小黑,一个还没秃头的程序员~~~你必须特别努力,才能显得毫不费力。今天的文章是为了前段时间学习kotlin所进行的接口对接,使用的网络数据传输框架为Retrofit,使用的接口为玩Android的开放接口,项目地址:https://gitee.com/fjjxxy/kotlin_retrofit.git知识体系下的文章https://www.wanandroid.com/ar...

weixin_30348133的博客 380

# YOLOv11-seg改进系列 | 引入CVPR MetaFormer的C3k2_PoolingFormerCGLU模块,池化Token混合+CGLU门控MLP

本文引入 CVPR 2022 论文(MetaFormer/PoolFormer)提出的 MetaFormer 元架构设计,以Pooling Token 混合器 + ConvolutionalGLU(CGLU)MLP构成,将其封装为,用于替换 YOLOv11-seg 的 C3k2 块。对比维度C3k2(基线)C3k2_PoolingFormerCGLU(本文)参数量(n scale)2.46M≈2.49M9.6≈9.69.7(+1.0%)架构范式单阶段卷积MetaFormer 双阶段。

qq_44224801的博客 845

Retrofit2.0 添加log拦截、公共参数

创建retrofit 进行网络请求 Retrofit retrofit = new Retrofit.Builder().client(getOkHttpClient())//使用自己创建的OkHttp .baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url .addConverterFactory(GsonConverte...

xiaoqiang_0719的博客 6413

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android Retrofit通过OkHttp添加Interceptor拦截器设置Get请求公共参数

pubic Retrofit getRetrofit() { OkHttpClient httpClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response inter...

野猿新一 2402

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Okhttp+Retrofit封装

单例模式加上封装调取的方法 public static OkHttpClient okHttpClient; public static SerViceAPI serViceAPI; /** * 优先执行 */ static { getOkHttpClient(); } public static OkHttpC

Mrzhaoplus的博客 548

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

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

retrofit和公共参数拦截器封装

public class RetrofitUtil {    private static RetrofitUtil retrofitUtil = null;    private Retrofit retrofit;    private RetrofitUtil() {    }    private RetrofitUtil(String baseUrl) {        OkHttpCl...

wei844067872的博客 847

Retrofit2.0 公共参数(固定参数)

请先阅读: Retrofit 动态参数(非固定参数、非必须参数)(Get、Post请求) 在实际项目中,对于有需要统一进行公共参数添加的网络请求,可以使用下面的代码来实现: RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(ctx).setRequestIntercepto

liuye066的专栏 630

retrofit+okhttp+rxjava添加公共参数的记录

相信我们在使用retrofit+okhttp+rxjava请求的时候,被这种模式真的惊呆了,好用的一批,但是某些情况下我们又无从下手,比如今天我自己记录的添加公共参数和加密请求,因为添加公共参数和加密不像使用okhttp那样在请求的时候添加参数或者加密(解密的话在CallBack回调返回解密即可)。 但是但是。。。retrofit在构建的时候开放给我们一个东西,没错,就是拦截器Interc

小伙人不错的博客 2279

Retrofit工具类

package com.xinzhengwei.ganhuo.util; import android.util.Log; import java.io.IOException; import java.util.HashMap; import java.util.Map; import okhttp3.FormBody; import okhttp3.Intercepto

xzw521的博客 221

Retrofit对OKhttp的封装

compile 'com.squareup.okhttp3:okhttp:3.4.1' //Okhttp compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包 compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//Convert...

SXS120730的博客 821

拦截器的简单代码使用

//工具类拦截器 public class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { //创建一个FormBody.Builder对象,用于添加公共参数 FormBody.Bu...

xiaoniba987的博客 1635

retrofit工具类

public class RetyofitUitl { private static RetyofitUitl retyofitUitl; private RetyofitUitl(){ } public static RetyofitUitl getRetyofitUitl (){ if (retyofitUitl==

mm_name_zhang的博客 322

RxJava和Retrofit的结合封装使用

依赖: //*5.0新控件的依赖*//* compile 'com.android.support:design:26.0.0-alpha1' compile 'com.facebook.fresco:fresco:0.12.0' //*RxJava与RxAndroid的依赖*//* compile 'io.reactivex:rxandroid:1.0.1' //

yukaihuaboke的博客 438

Android Retrofit和RxJava的网络请求封装

依赖: //gson -- compile 'com.google.code.gson:gson:2.6.2' //ok -- compile 'com.squareup.okhttp3:okhttp:3.6.0' compile 'com.squareup.okio:okio:1.11.0' ...

baipenggui_bo 299

java拦截器封装成框架,Rxjava+Retrofit+Rxlifecycle搭建的联网框架,包含对请求异常封装,自定义拦截器添加公共参数...

前言一直以来想自己封装一套合适的联网请求框架,所以查询各种资料踩过各种坑之后鼓捣出这一套框架,贴出来希望大家多多指点,共同进步1,依赖compile 'com.squareup.retrofit2:retrofit:2.2.0'compile 'com.squareup.retrofit2:converter-gson:2.2.0'compile 'com.squareup.retrofit2:a...

weixin_36272416的博客 287
上一篇: 设计模式之单例模式
下一篇: Retrofit2 ,Dagger2等常用框架注解功能介绍
Henson_Ding
博客等级 码龄11年 22粉丝 36原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值