2016-08-25 5 views
7

Так я уже получаю жетон от Json, когда Логин производится без проблем, и получить хэшдооснащения 2 + Rxjava ошибка обработки

Но когда ответ от сервера является ошибкой, я не могу получить Json сообщение ({сообщение: «Ошибка: неверный адрес электронной почты}», потому что в OnError мы получаем только в качестве аргумента Throwable, а не класс модели как в на

как я могу получить сообщение от сервера JSon 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 код

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

Проверьте 'response.body()'? –

+0

См. Мой новый ответ –

ответ

7

Я нашел решение, у меня есть класс приложения, который создает Дооснащение, а затем я просто создал ResponseBody и преобразуются с помощью 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; 
       } 

Полученный JSon был {"error": 4041, "message": "Email not found"} Почему класс Error, я просто создал переменное сообщение, потому что мне просто нужно показать сообщение пользователю

1

Вы смешиваете логическую ошибку (Войти не удалось по каким-то причинам) с ошибкой приложения. Если ваш сервер отправляет ответ с HTTP 200 и действительным json в случае неудачного входа в систему, ваше приложение не будет вызывать onError вообще.

Таким образом, в основном вам необходимо проверить (успешный) ответ от сервера и решить на основе предоставленного json, если вход был успешным или нет.

onError следует вызывать, например, в случае недоступности сервера или невозможности доставки действительного ответа.

Редактировать: Я не знаю, что ваш TokenResponse содержит, но в основном ответ для входа должен быть таким же, независимо от того, было оно успешным или нет. Затем вы просто проверяете TokenResponse, чтобы узнать, содержит ли результат ошибки или нет.

Проверить этот ответ в качестве примера: https://stackoverflow.com/a/31159671/180538

+0

throw OnErrorThrowable.from (новое свойство UserAuthenticationException (token.getError())); –

+0

Это имеет смысл, но я уже пробовал что-то подобное .. im пытается узнать этот код, который вы мне присылаете, но я застрял в этом новом UserAuthentificationException –

+0

Дополнительная информация –

Смежные вопросы