zoukankan      html  css  js  c++  java
  • 用好okhttp拦截器 自动添加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

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

  • 相关阅读:
    LeetCode 79
    LeetCode 437
    LeetCode 783
    LeetCode 59
    LeetCode 每日一题 04/24
    LeetCode 5
    LeetCode 43
    简易多线程任务 往数据库插数据
    定时任务--查数据库--注解实现
    redis 简易 实现
  • 原文地址:https://www.cnblogs.com/lixiaodaoaaa/p/9588667.html
Copyright © 2011-2022 走看看