2016-08-25 21 views
7

Więc ja już otrzymać token z JSON, gdy logowanie odbywa się bez problemów i otrzymywać hashModernizacja 2 + Rxjava obsługa błędów

Ale gdy odpowiedź z serwera jest błąd, nie mogę dostać JSON wiadomości ({komunikat: „Error: źle email}”, ponieważ w onError mamy tylko jako argument do Throwable a nie jak w modelu klasy na

jak mogę dostać wiadomość json z serwera 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); 




       } 
      }); 

Kod TokenResponse

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

Sprawdź 'response.body()'? –

+0

Zobacz moją nową odpowiedź –

Odpowiedz

7

znalazłem rozwiązanie, mam klasy aplikacji, która tworzy Retrofit, a potem po prostu stworzył ResponseBody i przeliczono przy użyciu 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; 
       } 

Otrzymany JSon to {"błąd": 4041, "wiadomość": "Nie znaleziono wiadomości e-mail"}, dlatego błąd klasy, właśnie utworzyłem wiadomość o zmiennej, ponieważ chcę tylko pokazać komunikat użytkownikowi

1

Jesteś mieszanie logiczny błąd (logowanie nie powiodło się z jakiegoś powodu) z błędem aplikacji. Jeśli twój serwer wyśle ​​odpowiedź z HTTP 200 i prawidłowym jsonem w przypadku nieudanego logowania, twoja aplikacja nie wywoła w ogóle onError.

Więc po prostu musisz sprawdzić (powodzenie) odpowiedź z serwera i zdecydować na podstawie dostarczonego json, jeśli logowanie się powiodło, czy nie.

Funkcja onError powinna zostać wywołana na przykład w przypadku, gdy serwer nie jest osiągalny lub nie może dostarczyć poprawnej odpowiedzi.

Edycja: Nie wiem, co zawiera Twój TokenResponse, ale zasadniczo odpowiedź na logowanie powinna być taka sama, bez względu na to, czy zakończyła się pomyślnie, czy nie. Następnie wystarczy sprawdzić TokenResponse, aby dowiedzieć się, czy wynik zawiera błędy, czy nie.

Sprawdź tę odpowiedź jako przykład: https://stackoverflow.com/a/31159671/180538

+0

throw OnErrorThrowable.from (new UserAuthenticationException (token.getError())); –

+0

To ma sens, ale już wypróbowałem coś podobnego .. próbuję znać ten kod, który mi wysłałeś, ale utknąłem w tym nowym UserAuthentificationException –

+0

Więcej informacji –