使用retrofit2时,接口需要登录后请求头里放token解决方案

需求:

没有登陆时接口照常使用,登陆后请求数据需要在请求头里带token过去。

问题:

这个header的声明方式有几种,常见的是在创建单例接口类时就给声明了header,而这个单例在第一次请求数据的时候就创建了,那时候如果没有登陆,那登陆后依然是用的同一个header,就带不过去这个token。另一种就是在声明接口的时候添加@Header()注解,但是这样的话需要每个接口上面都写这个,就比较麻烦。

解决思路:

用OKHttp做请求拦截,如果没有登陆(SharedPreferences中没有获取到token)就用原来的请求,如果登陆了,就添加一个请求头,请求头里面添加一个key-value给token。

具体代码实现: 

1、自定义拦截器:

//在请求头里添加token的拦截器处理
public class TokenHeaderInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        String token = SpUtils.getToken(); //SpUtils是SharedPreferences的工具类,自行实现
        if (token.isEmpty()) {
            Request originalRequest = chain.request();
            return chain.proceed(originalRequest);
        }else {
            Request originalRequest = chain.request();
            //key的话以后台给的为准,我这边是叫token
            Request updateRequest = originalRequest.newBuilder().header("token", token).build();
            return chain.proceed(updateRequest);
        }
    }
}

2、给okhttp添加拦截器:

private OkHttpClient.Builder getClient(){
    OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
    httpClientBuilder.connectTimeout(15, TimeUnit.SECONDS);
    httpClientBuilder.addNetworkInterceptor(new TokenHeaderInterceptor());
    return httpClientBuilder;
}

3、Retrofit创建的时候添加这个OkHttpClient:

Retrofit build = new Retrofit.Builder()
        .baseUrl(BaseConstant.API_URL)
        .client(getClient().build())
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build();

 

完。

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是一个可能的代码实现,供您参考: 首先,我们需要定义一个TokenInterceptor拦截器类,用于在每次请求接口检查Token是否过期: ```java public class TokenInterceptor implements Interceptor { private static final String TOKEN_KEY = "token"; private static final String AUTHORIZATION_HEADER = "Authorization"; private SharedPreferences mSharedPreferences; public TokenInterceptor(Context context) { mSharedPreferences = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE); } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); String token = mSharedPreferences.getString(TOKEN_KEY, ""); if (!TextUtils.isEmpty(token)) { request = request.newBuilder() .addHeader(AUTHORIZATION_HEADER, "Bearer " + token) .build(); } Response response = chain.proceed(request); if (response.code() == 401) { // Token过期,重新请求Token并重试请求 String newToken = getNewToken(); if (!TextUtils.isEmpty(newToken)) { // 更新Token并重试请求 mSharedPreferences.edit().putString(TOKEN_KEY, newToken).apply(); Request newRequest = request.newBuilder() .addHeader(AUTHORIZATION_HEADER, "Bearer " + newToken) .build(); response = chain.proceed(newRequest); } } return response; } private String getNewToken() { // 发送获取新Token的请求,返回新Token // 这只是一个示例,具体实现可以根据实际情况来定 return null; } } ``` 然后,在创建Retrofit实例,添加上述拦截器: ```java OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new TokenInterceptor(context)) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); ``` 最后,在请求接口,如果遇到Token过期的情况,TokenInterceptor会自动发送请求获取新Token,并重新发送接口请求: ```java Call<MyResponse> call = apiService.getMyData(); call.enqueue(new Callback<MyResponse>() { @Override public void onResponse(Call<MyResponse> call, Response<MyResponse> response) { if (response.isSuccessful()) { // 请求成功 MyResponse myResponse = response.body(); // 处理返回的数据 } else { // 请求失败 // 这需要处理401 Unauthorized错误,TokenInterceptor已经处理过了 } } @Override public void onFailure(Call<MyResponse> call, Throwable t) { // 请求失败 } }); ``` 以上就是一个简单的Retrofit Token过期后重新请求Token再去请求接口的代码实现,仅供参考。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值