user456123
user456123

Reputation: 3

Listen to all responses globally?

If a user is banned on my app, my server returns the following response:

return response()->json([
    'banned' => 'You are banned.'
], 403);

So whenever a Retrofit request is made to the server, I need to be able to globally check and read all responses in case the user has been banned.

Here is my ApiClient.java that handles Retrofit:

public class ApiClient {

    public static final String API_URL = "http://www.website.com/api/";

    private static int defaultTimeout = 30;

    private static OkHttpClient.Builder httpClient =
            new OkHttpClient.Builder();

    private static Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(new NullOnEmptyConverterFactory())
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .baseUrl(API_URL);

    private static Retrofit retrofit = builder.build();

    public static Retrofit getRetrofit() {
        return retrofit;
    }

    public static <S> S createService(Class<S> serviceClass, Context context) {
        return createService(serviceClass, context, null);
    }

    public static <S> S createService(Class<S> serviceClass, Context context, final String authToken) {
        return createService(serviceClass, context, authToken, defaultTimeout);
    }

    public static <S> S createService(Class<S> serviceClass, Context context, final String authToken, int timeout) {
        if (authToken != null) {
            TokenInterceptor tokenInterceptor = new TokenInterceptor(authToken);
            if (!httpClient.interceptors().contains(tokenInterceptor)) {
                httpClient.addInterceptor(tokenInterceptor);
            }

            TokenAuthenticator tokenAuthenticator = new TokenAuthenticator(context, authToken);
            httpClient.authenticator(tokenAuthenticator);
        }

        httpClient.connectTimeout(timeout, TimeUnit.SECONDS);
        httpClient.writeTimeout(timeout, TimeUnit.SECONDS);
        httpClient.readTimeout(timeout, TimeUnit.SECONDS);

        builder.client(httpClient.build());
        retrofit = builder.build();

        return retrofit.create(serviceClass);
    }
}

How can I modify this so that it checks every response from my server to check if the user has been banned? Would I create an interceptor in this case? How?

Upvotes: 0

Views: 56

Answers (1)

James McCracken
James McCracken

Reputation: 15776

Yeah just create an interceptor that looks for 403 responses.

public class BannedInterceptor implements Interceptor {

    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        if (response.code() == 403) {
            throw new IOException("user banned!");
        }
        return response;
    }
}

And add it to your OkHttp client.

httpClient.addInterceptor(new BannedInterceptor())

Upvotes: 1

Related Questions