【问题标题】:Retrofit 2 + Rxjava handling errorRetrofit 2 + Rxjava 处理错误
【发布时间】:2017-01-01 20:47:53
【问题描述】:

所以当登录没有问题时,我已经收到了来自 Json 的令牌,并接收了哈希

但是当来自服务器的响应是错误时,我无法收到 Json 消息 ({message:"Error : wrong email}" 因为在 onError 中我们只得到一个 Throwable 参数而不是像 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);




                }
            });

令牌响应码

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

}

【问题讨论】:

  • 检查response.body()?
  • 查看我的新答案

标签: android json error-handling retrofit rx-java


【解决方案1】:

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

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

onError 应该被调用,例如,如果服务器无法访问或无法传递有效的响应。

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

以这个答案为例:https://stackoverflow.com/a/31159671/180538

【讨论】:

  • 抛出 OnErrorThrowable.from(new UserAuthenticationException(token.getError()));
  • 这是有道理的,但我已经尝试过类似的东西..我想知道你发给我的这段代码,但我卡在这个新的 UserAuthentificationException 中
  • 08-25 15:09:17.248 22026-22244/xxxxxx.xxxx D/OkHttp: {"error":4041,"message":"Email not found"} 08-25 15:09 :17.252 22026-22026/xxxxxx.xxxx W/System.err: 在 retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onNext(OperatorMapResponseToBodyOrError.java:43) 08-25 15:09:17.252 22026-22026/xxxxxx.xxxx W/ System.err:在 retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onNext(OperatorMapResponseToBodyOrError.java:38)
  • 我已添加到帖子中
  • 查看我的新答案,我找到了方法。谢谢你的帮助:)
【解决方案2】:

我找到了一个解决方案,我有一个创建 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;
                }

收到的 JSon 是 {"error":4041,"message":"Email not found"} 这就是错误类的原因,我刚刚创建了一个变量消息,因为我只想向用户显示消息

【讨论】:

  • 我认为我们可以使用更短的形式:String s = ((HttpException) e).getMessage();
  • 什么是application.getRetroift()?
  • 我想我每次打开应用程序时都会在类扩展应用程序中初始化改造。这是几年前的事了
【解决方案3】:

 override fun onError(e: Throwable?) {
                    if (e is HttpException) {
                        Log.i("", "Status code: " + e.code())
                        Log.i("", "Response: " + e.response()?.errorBody()?.string())
                    }
                }

它对我有用!

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 2016-02-17
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2021-05-11
    • 2016-03-03
    相关资源
    最近更新 更多