用好okhttp拦截器 自动添加Token

摘要:
使用okhttp,自然会想到拦截器。改装和okhttp拦截器功能强大,可以到达天堂和地球。这篇文章只给出了一个简单的解释,而且这篇文章也是相当初级和介绍性的。我希望你能给我更多的建议。在本文中,我们将了解Okhttp拦截器。实际的mvp请求场景解释了每个应用程序中都有大量的api。从登录到获取令牌,所有API请求都可能需要在标头中添加令牌,并将其放入请求标头中以标识客户端身份。一旦获得Token,它将自动添加到请求头中,因此无需在未来或代码头中手动将Token添加到数十个接口中!

环境和项目情况

大部分APP应用都用Retrofit + mvp +Rxjava来实现。其中Retrofit实际上用了Okhttp。有了okhttp自然而然想到了拦截器。说到拦截器,就是对每一个访问(Request)的拦截,打个比方,就好比请求发出去之前,先让我过滤(加工)一下,比如Header里面我统一处理一下啥的(比如每个请求都加个Token啥的)。
图片.png

Retrofit 和okhttp拦截器功能强大,能上天入地,本文仅做简单解释,并且此文也相当处级和入门,还望各位多多指教。本文简单和大家一起学学习一下Okhttp拦截器。

实际mvp 请求场景解释

每个app中都有大量的api(访问服务器接口),从登陆获取Token,到接下来所有的api请求可能都需在header中添加Token放入请求头,来标识客户端身份。
如下:

模拟代码(实际业务场景的ApiService代码)

public interface APIService {
    @Multipart
    @POST("auth/oauth/token")
    Observable<TokenResponse> login(@Header("Authorization") String authorization,
                                    @Part("grant_type") RequestBody grant_type,
                                    @Part("username") RequestBody username,
                                    @Part("password") RequestBody password);
    
    @POST("/app/user/update")
    Observable<UpdateUserResponse> updateUser(@Header("access_token") String accesToken,
                                              @Body RequestBody registIdRequestBody);
    
    
    @GET("/app/user/getUsers")
    Observable<JsonObject> getUserInfo(@Header("access_token") String accesToken);
    

若几十个 api接口都需要添加Token呢?这里就需要拦截器的概念。一旦获取到Token就自动添加到请求头里,这样以后几十个接口不需要在手动,或者代码Header里添加Token了!

拦截器隆重登场

/*
    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ 
       Author   :  lixiaodaoaaa
       Date     :  2018/9/4
       Time     :  17:45
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
 */
public class TokenHeaderInterceptor implements Interceptor {
    
    @Override
    public Response intercept(Chain chain) throws IOException{
        String token = MainDataManager.getInstance().getToken();
        if (StringUtils.isEmpty(token)) {
            Request originalRequest = chain.request();
            return chain.proceed(originalRequest);
        }else {
            Request originalRequest = chain.request();
            Request updateRequest = originalRequest.newBuilder().header("access_token", token).build();
            return chain.proceed(updateRequest);
        }
    }
    
}

Token 一般我存在本地或者内存中,通过判断有Token就代表登录过,没有Token就表示没有登录过,有Token就将它存在了本地,这个拦截器判断有Token自动往请求头中增加Token. header("access_token",token)

将拦截器设置给OKhttpClient.

图片.png

  Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").serializeNulls().create();
        if (okHttpClient == null) {
            okHttpClient = new OkHttpClient.Builder()
                    .readTimeout(10, TimeUnit.SECONDS)
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .addNetworkInterceptor(new HttpCacheInterceptor())
                    .addNetworkInterceptor(new TokenHeaderInterceptor())
                    .build();
        }
        
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .client(okHttpClient)
                    .build();
            apiService = retrofit.create(APIService.class);

关键点

     .addNetworkInterceptor(new TokenHeaderInterceptor())

图片.png
networkInterceptors 是个list,也就是说 okhttpClicent支持多个拦截器 (也够强大 )

自动刷新Token

有机会我再详细展开讲。这节简单入门的分享到此结束。感谢阅读。

免责声明:文章转载自《用好okhttp拦截器 自动添加Token》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HBase2版本的修复工具HBCK2TinyMCE粘贴word图片且图片文件自动上传功能下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

提升权限令牌

提权相关函数: GetCurrentProcess() 介绍: 功能:检索当前进程的伪句柄。 函数原型:HANDLE GetCurrentProcess(); 返回值:返回值是当前进程的伪句柄。 OpenProcessToken() 介绍:功能:打开与进程相关联的访问令牌。 函数原型:BOOL WINAPI OpenProcessToken(      ...

微信定时获取token

为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证。 access_token的有效期是7200秒(两小时),在有效期内,可以一直...

linux高编信号-------令牌桶实现

main.c /********************************* *功能:每秒从文件读N个字节(N可控) *使用信号机制实现令牌桶:解决数据流不均匀传输 * *****************************/ #include <stdio.h> #include <stdlib.h>...

.NET 搭建简单的通知服务

搭建简单的通知服务 Intro 很多情况下,我们都会遇到一些需要进行通知报警的场景,比如说服务器资源监控报警,抢到火车票后通知用户进行付款。 原来主要是用的钉钉群里的机器人来做的通知,周末看到原来做 【Server 酱】的大佬写了一个简单的基于企业微信的微信推送,代码是 PHP 的非常简单,可以参考:https://github.com/easychen/...

如何生成token(JWT的Token)

主要代码 1 //JWT 默认过期时间,3600L,单位秒 2 Long expireSecond = 3600L; 3 //盐值 4 String newSalt = 666; 5 String token = JwtUtil.generateToken(user.getU...

JS反混淆——构造可知DeviceToken、nouce与token

清空所有cookies后打开任意一本书的详情页,打开控制台中的Network。如下图所示,浏览器发出的第一个XHR请求为/bind,其中DeviceToken,nonce,Token均为POST中提交的数据。 找到访问网页的请求,如下图所示,返回头中没有出现set-cookie字段,可以判断DeviceToken,nonce,Token均为js生成的。...