改造2 + Rxjava处理错误

Dio*_*osa 11 error-handling android json rx-java retrofit

因此,当登录成功没有问题时,我已经从Json收到一个令牌,并收到哈希

但是当来自服务器的响应是一个错误时,我无法得到Json消息({message:"错误:错误的电子邮件}"因为在onError中我们只得到一个Throwable作为参数而不是像on on那样的模型类

如何从服务器onError获取json消息?

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




                }
            });
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

}

Dio*_*osa 12

我找到了一个解决方案,我有一个创建一个Retrofit的应用程序类,然后我创建了一个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;
                }
Run Code Online (Sandbox Code Playgroud)

收到的JSon是{"error":4041,"message":"找不到电子邮件"}为什么类错误,我只是创建了一个变量消息,因为我只想要向用户显示消息


War*_*ith 5

您将逻辑错误(由于某种原因登录失败)与应用程序错误混合在一起。如果您的服务器在登录失败的情况下发送 HTTP 200 和有效 json 的响应,您的应用程序将根本不会调用 onError。

所以基本上你需要检查服务器的(成功)响应,并根据提供的 json 决定登录是否成功。

例如,如果服务器无法访问或无法提供有效响应,则应调用 onError。

编辑:我不知道你TokenResponse包含什么,但基本上登录的响应应该是相同的,无论登录是否成功。然后,您只需检查 TokenResponse 以查明结果是否包含错误。

检查此答案作为示例:https ://stackoverflow.com/a/31159671/180538

  • 看我的新答案,我找到了方法。感谢您的帮助 :) (2认同)