Je souhaite implémenter un mécanisme de gestion des erreurs à l'aide de Retrofit 2.
Les solutions disponibles utilisent la classe RetrofitError que je ne trouve pas dans le dépôt actuel.
Si vous effectuez une demande synchrone, vous définissez votre méthode de demande dans l'interface comme Call<List<Car>>
.
Une fois que vous avez exécuté la demande, vous recevez une réponse et des données désérialisées enveloppées dans Response<T>
comme Response<List<Car>>
. Cet encapsulé vous donne accès aux en-têtes, aux codes http et au corps de réponse brut.
Vous pouvez accéder au corps d'erreur comme:
Call<List<Car>> carsCall = carInterface.loadCars();
try {
Response<List<Car>> carsResponse = carsCall.execute();
} catch (IOException e) {
e.printStackTrace();
//network Exception is throw here
}
if(carsResponse != null && !carsResponse.isSuccess() && carsReponse.errorBody() != null){
// handle carsResponse.errorBody()
}
Pour les appels asynchrones, vous recevez Throwable
, si une exception d'E/S est levée pendant l'appel réseau:
Call<List<Car>> call = service.loadCars();
call.enqueue(new Callback<List<Car>>() {
@Override
public void onResponse(Response<List<Car>> response) {
// Get result from response.body(), headers, status codes, etc
}
@Override
public void onFailure(Throwable t) {
//handle error
}
});
Call<List<data>> call = MyService.loadData();
call.enqueue(new Callback<List<data>>() {
@Override
public void onResponse(Call<List<data>> call, Response<List<data>> response) {
if (response.isSuccessful()) {
//Response success. Handle data here
}
else{
//For getting error message
Log.d("Error message",response.message());
//For getting error code. Code is integer value like 200,404 etc
Log.d("Error code",String.valueOf(response.code()));
}
}
@Override
public void onFailure(Call<List<data>> call, Throwable t) {
if (t instanceof IOException){
//Add your code for displaying no network connection error
}
});