如何在 Interceptor Android 中获取 401 状态码时更改活动

Posted

技术标签:

【中文标题】如何在 Interceptor Android 中获取 401 状态码时更改活动【英文标题】:How to change activity while get 401 status code in Interceptor Android 【发布时间】:2017-10-03 19:17:34 【问题描述】:

当我在 API 中获得 401 状态代码时,我必须打开登录活动。我不想将更改活动逻辑放在每个 API 的 onError 方法中。我想要一个用于所有 API 的全局方法。 所以为此,我创建了一个拦截器

public class MyInterceptor extends BaseActivity implements Interceptor 

@Override
public Response intercept(Chain chain) throws IOException 
    Response response = chain.proceed(chain.request());

    if (response.code() == 401) 

        throw new RuntimeException(" Here you got 401 from API !");
    

    return response;


这里我添加了这个拦截器

OkHttpClient.Builder builder=new OkHttpClient.Builder()
            .addNetworkInterceptor(new Interceptor() 
                @Override
                public okhttp3.Response intercept(Chain chain) throws IOException 
                    Request newRequest = chain.request().newBuilder()
                            .addHeader("Content-Type", "application/json")
                            .addHeader("User-Agent", "MyApp-android-App")
                            .build();
                    return chain.proceed(newRequest);
                
            )
            .addNetworkInterceptor(new StethoInterceptor())
            .addNetworkInterceptor(new MyInterceptor())
            .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));

现在,我应该在哪里添加更改活动调用方法。我正在使用 RxRetrofit 调用 API 的另一件事。我想要一个全局方法来处理这个 401 响应。您能否为我提供任何解决方案,我应该将 Activity 更改方法调用放在哪里?

【问题讨论】:

您找到解决方案了吗? 不,我仍然没有找到任何合适的解决方案,但截至目前,我根据我的问题实施了。所以在 MyIntercepter 类中,我扩展了 BaseActivity,我调用了 BaseActivity 的方法来清除用户数据并导航到登录屏幕。为了导航到登录活动,我使用了应用程序级上下文。 @bdevloper我找到了一个解决方案,您可以查看我在回答中提到的要点。很抱歉回复晚了,我很久没活动了。 我做了this 方式。查看我的要点。 【参考方案1】:

创建拦截器类

class HeaderInterceptor implements Interceptor
    
        @Override
        public Response intercept(Chain chain) throws IOException 
            Request orignal = chain.request();
///--------------------------
            String token="your auth token"; //retriving depend upon you
//---------------------------

            Request request =orignal.newBuilder().header("Authorization", "Bearer "+ token)
                    .header("Accept", "application/json")
                    .header("Content-Type", "application/json").
                            method(orignal.method(), orignal.body())
                    .build();

            Response response =  chain.proceed(request);
            Log.d("MyApp", "Code : "+response.code());
            if (response.code() == 401)
                //handle it as per ur need
                return response;
            
            return response;
        
    

现在添加拦截器

.....
                .addInterceptor(logging).addInterceptor(new HeaderInterceptor())
                .build();
    ..

【讨论】:

以上是关于如何在 Interceptor Android 中获取 401 状态码时更改活动的主要内容,如果未能解决你的问题,请参考以下文章

Android:给OHTTP添加Interceptor 拦截器

如何启动postman interceptor

如何拦截 Spring Interceptor 到 Node Service 的请求

如何让OkHttp从Jersey获取参数并在Interceptor中使用?

Struts2系列:(16)Interceptor组成的链是如何进行调用的

如何使用 Angular Http Interceptor 和 RxJS 刷新 JWT 令牌?