2017-09-21 4 views
0

Existe-t-il un moyen de mettre en œuvre sur Retrofit un convertisseur pour gérer le corps d'une erreur 40x?retrofit2.Converter pour la gestion des messages d'erreur

J'ai des problèmes avec les réponses du serveur qui ont un code 40x et un message de corps vide, chaque fois qu'il retourne et EOFException.

J'ai implémenté un convertisseur mais quand il a une erreur de 40x, il ne le traverse pas.

Rénovation:

Gson gson = new GsonBuilder().create();  
Retrofit.Builder builder = new Retrofit.Builder() 
        .addConverterFactory(new NullOnEmptyConverterFactory()) 
        .addConverterFactory(GsonConverterFactory.create(gson)) 
       .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
        .baseUrl(url); 
      builder.client(okHttpClientBuilder.build()); 

c'est là je gère l'erreur à partir d'appels serveur:

public static <T> ObservableTransformer<T, T> parseHttpErrors() { 

    return observable -> observable.onErrorResumeNext(
      (Throwable throwable) -> { 


       if (throwable instanceof HttpException) { 

        int errorCode = ((HttpException) throwable).response().code(); 

        return validateHttpExceptions(throwable, errorCode); 

       } else if (throwable instanceof IOException) { 

        return Observable.error(new NetworkException()); 
       } 
       return Observable.error(throwable); 
      }); 
} 

private static <T> ObservableSource<? extends T> validateHttpExceptions(Throwable throwable, int errorCode) { 

    switch (errorCode) { 
     case 401:// Request Unauthorized 
      return Observable.error(new CredentialsException()); 
     case 408:// Request Timeout 
      return Observable.error(new NetworkException()); 
     default: 
      return Observable.error(new UnknownHttpException(errorCode, throwable.getMessage())); 
    } 
} 

Et un seul appel de serveur

service.doAction(params) 
     .subscribeOn(Schedulers.io()) 
     .compose(NetworkErrorHandler.parseHttpErrors()) 
     .map(data -> { 

     //map data 
     return data; 
     }); 
+0

Utilisez-vous RxJava? –

+0

Oui je fais, RxJava 2 –

+0

Se celui-ci: https://stackoverflow.com/questions/46295237/rxjava-retrofit-parse-api-error-for-user/46302070#46302070 –

Répondre

0

Enfin, je trouve ce produisait cette erreur . C'était HttpLoggingInterceptor. Après l'avoir supprimé, il n'y avait plus EOFException.

+0

C'est intéressant. Avez-vous essayé d'utiliser Stetho à la place? –

+0

Bon point, je l'ai utilisé il y a longtemps mais pas pour le réseau. Merci! –