2016-07-11 56 views
6

Voglio gestire l'errore in Retrofit 2.0Come gestire l'errore in Retrofit 2.0

Ottenuto per es. code=404 e body=null, ma errorBody() contiene dati in ErrorModel (Boolean status e String info).

Questo è errorBody().content: [text=\n{"status":false,"info":"Provided email doesn't exist."}].

Come posso ottenere questi dati?

Grazie per l'aiuto!

Questo è il mio codice per la richiesta Retrofit:

ResetPasswordApi.Factory.getInstance().resetPassword(loginEditText.getText().toString()) 
    .enqueue(new Callback<StatusInfoModel>() { 
     @Override 
     public void onResponse(Call<StatusInfoModel> call, Response<StatusInfoModel> response) { 
      if (response.isSuccessful()) { 
       showToast(getApplicationContext(), getString(R.string.new_password_sent)); 
      } else { 
       showToast(getApplicationContext(), getString(R.string.email_not_exist)); 
      } 
     } 

     @Override 
     public void onFailure(Call<StatusInfoModel> call, Throwable t) { 
      showToast(getApplicationContext(), "Something went wrong..."); 
     } 
    }); 
+0

puoi inserire del codice – Raghunandan

+0

Questo codice vuoi dire? – y07k2

risposta

8

Se si desidera ottenere i dati quando risposta di errore viene (tipicamente un codice di risposta, tranne 200) si può fare così nel metodo onResponse():

if (response.code() == 404) { 
    Gson gson = new GsonBuilder().create(); 
    YourErrorPojo pojo = new YourErrorPojo(); 
    try { 
     pojo = gson.fromJson(response.errorBody().string(), YourErrorPojo.class); 
     Toast.makeText(getApplicationContext(), pojo.getInfo(), Toast.LENGTH_LONG).show(); 
    } catch (IOException e) { } 
} 

Quando si genera YourErrorPojo.class fare seguenti fasi:

  1. Vai Json Schema 2 Pojo

  2. Incolla il vostro esempio Json, e selezionare il tipo di fonte JSON, l'annotazione GSON

  3. Il vostro esempio è Json: {"status":false,"info":"Provided email doesn't exist."}

  4. Clicca Anteprima e genererà la classe Pojo per voi.

Aggiungi questo al vostro build.gradle: compile 'com.google.code.gson:gson:2.7'

Ho usato Gson in questa soluzione, ma si può ottenere il vostro Json come: response.errorBody().string() e gestirlo, fare qc quello che vuoi.

+0

Ho provato questo codice: 'Gson gson = new GsonBuilder(). Create();' 'StatusInfoModel error = new StatusInfoModel();' 'try {error = gson.fromJson (response.errorBody(). Stringa (), StatusInfoModel.class); ' ' showToast (getApplicationContext(), error.getInfo()); ' '} catch (IOException e) {// gestisce errore di lettura errore} ', ma c'è un errore:' La classe deve essere dichiarata astratta o implementare il metodo astratto ». – y07k2

+0

@ y07k2 Puoi fornire screenshot e lo guarderò? –

+0

https://s32.postimg.org/eww0vfotx/error.png. Quando rimuovo l'errore di istruzione 'else' scompare. – y07k2

2

Retrofit non vede 404 come un fallimento, in modo che entrerà nel onSuccess.

response.isSuccessful() è vero se il codice di risposta è nell'intervallo di 200-300, quindi entrerà nel resto.

if (response.isSuccessful()) { 
    showToast(getApplicationContext(), getString(R.string.new_password_sent)); 
} else { 
    // A 404 will go here 

    showToast(getApplicationContext(), getString(R.string.email_not_exist)); 
} 

Tuttavia dal momento che la sua risposta non ha avuto successo, non si ottiene il corpo di risposta con .body(), ma con errorBody(), errorBody sarà riempito quando la richiesta è stata un successo, ma response.isSuccessful() restituisce false (quindi in caso di uno status codice che non è 200-300).

+0

Sì, so che può essere fatto in questo modo ma non voglio digitare 'String errorMsg' ogni volta, quando posso (almeno credo di poterlo fare) ottenere da' errorBody() '. – y07k2

+0

'errorBody' è per quando si verifica un errore, che non si applica in caso di 404.404 è considerato un successo –

+0

Quindi è strano. Perché ricevo questi dati in 'errorBody()', non in 'body()'? – y07k2