2016-08-25 4 views
7

Also ich bereits ein Token aus dem Json erhalten, wenn die Anmeldung ohne Probleme durchgeführt wird, und erhalten den HashRetrofit 2 + Rxjava Bedienungsfehler

Aber wenn die Antwort vom Server ein Fehler ist, kann ich nicht die Json bekommen (Meldung {Meldung: „Fehler: falsche E-Mail}“, weil in dem onError wir als Argument bekommen nur ein Throwable und kein Modellklasse wie in auf

wie kann ich eine json Nachricht vom Server erhalten onError ??

final Observable<TokenResponse> observable = Service.login(userCredentials); 
    observable.subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<TokenResponse>() { 
       String error=""; 

       @Override 
       public void onCompleted() { 
        mLoginView.whenLoginSucess(); 
       } 

       @Override 
       public void onError(Throwable e) { 

        if (e instanceof HttpException) { 
         HttpException exception = (HttpException) e; 
         Response response = exception.response(); 
         Converter<ResponseBody, ErrorFromServer> converter = new GsonConverterFactory() 
           .responseBodyConverter(ErrorFromServer.class, Annotation[0]); 
         ErrorFromServer error = converter.convert(response.errorBody()); 
        } 

        mLoginView.errorText(error); 

        e.printStackTrace(); 

       } 

       @Override 
       public void onNext(TokenResponse tokenResponse) { 


        SharedPreferences.Editor editor = sharedP.edit(); 
        editor.putString("hash", tokenResponse.getToken()); 
        editor.commit(); 

        //getString return key value "hash" if there is no value, returns null 
        hash = sharedP.getString("hash",null); 




       } 
      }); 

TokenResponse-Code

public class TokenResponse { 
@SerializedName("hash") 
@Expose 
private String token; 

@SerializedName("message") 
@Expose 
private String message; 


public String getMessage() {return message;} 


public String getToken() { 
    return token; 
} 

}

+0

Überprüfen Sie 'response.body()'? –

+0

Siehe meinen neuen Antwort –

Antwort

7

ich eine Lösung gefunden, ich habe eine Anwendungsklasse, die einen Retrofit Erstellt und dann habe ich gerade eine Response und konvertierte mit responseBodyConverter (,)

   @Override 
       public void onError(Throwable e) { 
        if (e instanceof HttpException) { 
         ResponseBody body = ((HttpException) e).response().errorBody(); 

         Converter<ResponseBody, Error> errorConverter = 
          application.getRetrofit().responseBodyConverter(Error.class, new Annotation[0]); 
        // Convert the error body into our Error type. 
         try { 
          Error error = errorConverter.convert(body); 
          Log.i("","ERROR: " + error.message); 
          mLoginView.errorText(error.message); 
         } catch (IOException e1) { 
         e1.printStackTrace(); 
         } 
        } 



       static class Error{ 
       String message; 
       } 

der JSon empfangen wurde {"Fehler": 4041, "Nachricht": "E-Mail nicht gefunden"}, warum die Klasse Fehler, ich habe gerade eine Variable Nachricht erstellt, weil ich möchte nur die Nachricht an den Benutzer

1

Sie einen logischen Fehler Mischen (Login aus irgendeinem Grund nicht) mit einem Anwendungsfehler. Wenn Ihr Server bei fehlgeschlagener Anmeldung eine Antwort mit HTTP 200 und einem gültigen JSON sendet, ruft Ihre Anwendung onError überhaupt nicht auf.

Also im Grunde müssen Sie die (erfolgreiche) Antwort vom Server überprüfen und basierend auf dem bereitgestellten JSON entscheiden, ob die Anmeldung erfolgreich war oder nicht.

onError sollte zum Beispiel aufgerufen werden, wenn der Server nicht erreichbar ist oder keine gültige Antwort liefert.

Edit: Ich weiß nicht, was Ihre TokenResponse enthält, aber im Grunde die Antwort für eine Anmeldung sollte gleich sein, egal ob es erfolgreich war oder nicht. Dann überprüfen Sie einfach die TokenResponse, um herauszufinden, ob das Ergebnis Fehler enthält oder nicht.

prüfen diese Antwort als Beispiel: https://stackoverflow.com/a/31159671/180538

+0

Wurf OnErrorThrowable.from (neu UserAuthenticationException (token.getError())); –

+0

Das macht Sinn, aber ich habe schon etwas ähnliches versucht .. im versuchen, wissen diesen Code senden Sie mir aber ich fest in diesem neuen UserAuthentificationException –

+0

Weitere Informationen –

Verwandte Themen