web-dev-qa-db-fra.com

Traitement ultérieur des erreurs d’appel synchrone 2 pour les erreurs 4xx

J'utilise une file de tâches prioritaire Android et j'utilise retrofit pour passer des appels synchrones vers mon api restante, mais je ne sais pas comment gérer des erreurs telles que les erreurs 401 non autorisées que je renvoie JSON en indiquant l'erreur. Simple en faisant des appels asynchrones mais j'adapte mon application pour le gestionnaire de travaux. Vous trouverez ci-dessous une capture simple pour les exceptions IO, mais 401, etc. de 401? Comment faire ça?

try {
    PostService postService = ServiceGenerator.createService(PostService.class);
    final Call<Post> call = postService.addPost(post);
    Post newPost = call.execute().body();

    // omitted code here

} catch (IOException e) {
    // handle error
}

MODIFIER

L’utilisation de l’objet de réponse de rénovation a été décisive pour moi, le renvoi de l’objet de réponse de rénovation m'a permis de

Response<Post> response = call.execute();

if (response.isSuccessful()) {
    // request successful (status code 200, 201)
    Post result = response.body();

    // publish the post added event
    EventBus.getDefault().post(new PostAddedEvent(result));
} else {
    // request not successful (like 400,401,403 etc and 5xx)
    renderApiError(response);
}
9
CaptRisky

Vérifiez le code de réponse et affichez le message approprié.

Essaye ça:

 PostService postService = ServiceGenerator.createService(PostService.class);
 final Call<Post> call = postService.addPost(post);

Response<Post> newPostResponse = call.execute();

// Here call newPostResponse.code() to get response code
int statusCode = newPostResponse.code();
if(statusCode == 200)
    Post newPost = newPostResponse.body();
else if(statusCode == 401)
    // Do some thing... 
6
FAЯAƸ

Mettre des vérifications pour 401 sur chaque réponse n'est pas une très bonne approche. Au lieu de cela, on peut appliquer cette vérification au niveau de la base, c’est-à-dire tout en créant un objet pour la modernisation, par le biais des intercepteurs. Regarde:

public synchronized static Retrofit getClientWithRetry(final Context ctx) {
    if (clientWithRetry == null) {
        Interceptor responseCodeInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                Response response = chain.proceed(request);
                if (response.code() == 401) {
                    Log.d(LOG_TAG, "Intercepted Req: " + response.toString());
                    Response r = retryWithFreshToken(request, chain);
                    return r;
                }
                return response;
            }
        };

        int cacheSize = 10 * 1024 * 1024; // 10 MB
        Cache cache = new Cache(ctx.getCacheDir(), cacheSize);

        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(logging)
                .addInterceptor(responseCodeInterceptor)
                .cache(cache)
                .build();

        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl(API_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client);
        clientWithRetry = builder.build();
    }
    return clientWithRetry;
}

Ici en interne, si un 401 est observé, une nouvelle requête chaînée peut être faite et un jeton peut être récupéré. Poste auquel la demande initiale peut être complétée. Tiré de ce tutoriel Réessayer ultérieurement .

0
KnowIT