android - 如何在 Interceptor Android 中获取 401 状态代码时更改 Activity

标签 android retrofit2 okhttp

当我在 API 中收到 401 状态代码 时,我必须打开登录 Activity 。我不想将更改 Activity 逻辑放在每个 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));

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

最佳答案

创建拦截器类

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();
    ..

关于android - 如何在 Interceptor Android 中获取 401 状态代码时更改 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43802715/

相关文章:

android - 如何去除 Dagger Hilt 依赖注入(inject)周期

android - 无法导入 com.squareup.okhttp.OkHttpClient;

android - 检测 TextView 是否跨越 2 行

java - 加密和解密两个系统之间的消息

java - Retrofit通过POST方法从服务器获取响应消息

android - 如何阻止 Okhttp Authenticator 被多次调用?

java - 响应http响应体的编码

android - 在创建/渲染 scene2d 舞台后重置视口(viewport)

android - Intent 对象未触发 Intent 过滤器

android - RxJava1 到 Rxjava2 迁移错误