Retrofit网络类实现(拼接token在请求头)

/*

  • 网络请求封装

  • */
    public class RetrofitManager {
    private static final String TAG = “test—”;
    private static RetrofitManager retrofitManager;

    public static RetrofitManager getInstance() {
    if (retrofitManager==null){
    retrofitManager=new RetrofitManager();
    }
    return retrofitManager;
    }

    private Retrofit retrofit;

    public Retrofit getRetrofit() {
    if (retrofit==null){
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

          OkHttpClient.Builder okbuilder = new OkHttpClient.Builder();
          okbuilder.addInterceptor(interceptor);
          okbuilder.addInterceptor(interceptorTag);
          okbuilder.retryOnConnectionFailure(true);
          okbuilder.connectTimeout(60, TimeUnit.MINUTES);
          okbuilder.readTimeout(60,TimeUnit.MINUTES
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个可能的代码实现,供您参考: 首先,我们需要定义一个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再去请求接口的代码实现,仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值