2017-06-19 22 views
0

ユーザーが私のアプリで禁止されている場合は、私のサーバーは、次の応答を返します:レトロフィット要求がサーバーに行われるたび全回答を全世界で聞く?

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

だから、私はケース内のすべての応答をチェックし、読みグローバルできるようにする必要がありますユーザーは禁止されています。ここで

は、レトロフィットを扱う私のApiClient.java次のとおりです。それは、ユーザが禁止されているかどうかを確認するために私のサーバーからのすべての応答をチェックするように

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); 
    } 
} 

は、どのように私はこれを変更することができますか?この場合、インターセプタを作成しますか?どうやって?

答えて

1

ええと、403レスポンスを探すインターセプタを作成してください。

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; 
    } 
} 

あなたのOkHttpクライアントに追加します。

httpClient.addInterceptor(new BannedInterceptor())

+0

はい、これは正しい方法です。 –

+0

'新しいIOExceptionをスローする 'は、私が逃したものです。ありがとう! – user456123

関連する問題