web-dev-qa-db-fra.com

Comment faire en sorte que le corps d'intervention réponde à l'exception?

J'essaie de me connecter au service de repos via une modification dans Android. J'obtiens des réponses. Mais quand il y a une réponse d'erreur du service, une exception de conversion se produit et maintenant je veux faire quelques actions basé sur le corps de la réponse. Mais je reçois le corps de la réponse en tant que NULL. Mais le journal de modification a un message d'erreur. Pourquoi cela se produit-il?.

D/Reftofit log(24856): OkHttp-Received-Millis: 1397527055676
D/Reftofit log(24856): OkHttp-Response-Source: NETWORK 200
D/Reftofit log(24856): OkHttp-Sent-Millis: 1397527055492
D/Reftofit log(24856): Server: Apache/2.2.22 (Ubuntu)
D/Reftofit log(24856): X-Powered-By: PHP/5.3.10-1ubuntu3.10
D/Reftofit log(24856): {"result":"Invalid Token ID"}

Code:

public void failure(RetrofitError retrofitError) {
    String response = null;
    TokenError tokenError = (TokenError) retrofitError.getBodyAs(TokenError.class);
    response = tokenError.getErrorDetails();
    Log.e(TAG, response);
    if (response != null && response.contains("Invalid Token ID")) {
        GroupDataProvider.getInstance().onFailure();
    }

}

Ici, je reçois tokenError en tant que null. Je ne sais pas pourquoi? Dois-je définir quelque chose avec l'adaptateur de repos afin que la réponse soit transmise à l'objet d'erreur de modification.

36

Essayez ce code:

@Override
public void failure(RetrofitError error) {
    String json =  new String(((TypedByteArray)error.getResponse().getBody()).getBytes());
    Log.v("failure", json.toString());
}

avec Retrofit 2.

@Override
public void onFailure(Call<Example> call, Throwable t) {
    String message = t.getMessage();
    Log.d("failure", message);
}
73
Cabezas

si erreur au format String:

public Sring getErrorBodyAsString(RetrofitError error) {    
      return (String) error.getBodyAs(String.class)
}

si vous avez besoin d'un objet personnalisé:

class ErrorResponse {
   @SerializedName("error")
   int errorCode;

   @SerializedName("msg")
   String msg;
}

public T getErrorBody(RetrofitError error, Class<T> clazz) {    
      return (T) error.getBodyAs(clazz);
}
5
Victor Ponomarenko

Votre serveur doit renvoyer le code d'erreur HTTP 4xx pour que cela fonctionne.

Lorsque votre serveur renvoie HTTP 200, cela signifie une réponse réussie et il sera traité avec la branche onSuccess. Probablement votre objet que vous passez à Callback<Object> devrait être prêt à gérer à la fois le succès et le résultat de l'erreur.

Pour vous assurer que c'est le cas, vous pouvez vérifier si RetrofitError est bien un JsonParseException en ajoutant l'extrait suivant:

public void failure(RetrofitError error) {
    Log.v(TAG, error.getMessage());
};
3
Sergii Pechenizkyi

vous devez utiliser getErrorStream () pour cela.

Si la réponse HTTP indique qu'une erreur s'est produite, getInputStream () lèvera une IOException. Utilisez getErrorStream () pour lire la réponse d'erreur. Les en-têtes peuvent être lus de manière normale à l'aide de getHeaderFields ().

Ref: problème github

0
LOG_TAG