2016-07-11 11 views
6

Ich möchte Fehler in Retrofit 2.0So behandeln Sie Fehler in Retrofit 2.0

behandeln z. code=404 und body=null, aber errorBody() enthält Daten in ErrorModel (Boolean status und String info).

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

Wie kann ich diese Daten bekommen?

Vielen Dank für Ihre Hilfe!

Dies ist mein Code für Anfrage 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

können Sie einen Code eingeben – Raghunandan

+0

Dieser Code meinen Sie? – y07k2

Antwort

8

Wenn Sie Daten erhalten möchten, wenn Fehlerreaktion kommt (typischerweise ein Antwortcode außer 200) Sie können es in Ihrem onResponse() Verfahren wie das tun:

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) { } 
} 

Bei der Generierung YourErrorPojo.class tun folgende Schritte:

  1. zum Json Schema 2 Pojo

  2. Paste Ihr Beispiel Json, und wählen Sie Quelltyp Json, Anmerkung Gson

  3. Ihr Beispiel Json ist: {"status":false,"info":"Provided email doesn't exist."}

  4. Click Vorschau und es wird für Sie Ihre Pojo Klasse generieren.

Fügen Sie diese auf Ihre build.gradle: compile 'com.google.code.gson:gson:2.7'

I Gson in dieser Lösung verwendet, aber Sie können Ihre Json wie bekommen: response.errorBody().string() und damit umgehen, was auch immer Sie tun, etw wollen.

+0

Ich habe versucht, diesen Code: 'Gson gson = neue GsonBuilder(). Create();' 'StatusInfoModel Fehler = neue StatusInfoModel();' 'versuchen {Fehler = gson.fromJson (response.errorBody(). String (), StatusInfoModel.class); ' ' showToast (getApplicationContext(), error.getInfo()); ' '} catch (IOException e) {// handle Fehler beim Lesefehler} ', aber es gibt einen Fehler:' Die Klasse muss entweder abstrakt sein oder eine abstrakte Methode implementieren. – y07k2

+0

@ y07k2 Können Sie einen Screenshot erstellen und ich werde es sehen? –

+0

https://s32.postimg.org/eww0vfotx/error.png. Wenn ich den "else" -Anweisungsfehler entferne, verschwindet er. – y07k2

2

Retrofit nicht als Versager sieht 404, so wird es die onSuccess eingeben.

response.isSuccessful() ist wahr, wenn der Antwortcode im Bereich von 200-300 liegt, so wird es dort in den anderen eingeben.

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)); 
} 

Da jedoch Ihre Antwort nicht erfolgreich war, erhalten Sie nicht die Antwort Körper mit .body(), aber mit errorBody() wird errorBody gefüllt, wenn die Anforderung erfolgreich war, aber response.isSuccessful() false zurück (so im Falle eines Status Code, der nicht 200-300 ist).

+0

Ja, ich weiß, dass es so gemacht werden kann, aber ich möchte 'String errorMsg' nicht jedes Mal eingeben, wenn ich (zumindest ich glaube, dass ich es kann) von 'errorBody()' bekomme. – y07k2

+0

'ErrorBody' ist für den Fall, dass ein Fehler auftritt, was nicht im Fall von 404 gilt.404 wird als Erfolg gesehen –

+0

Also das ist komisch. Warum erhalte ich diese Daten in 'errorBody()', nicht in 'body()'? – y07k2