【问题标题】:Retrofit2 error handlingRetrofit2 错误处理
【发布时间】:2017-01-10 12:28:07
【问题描述】:

我正在使用 Retrofit2+RxJava。当我发出请求时,服务器可以返回两个响应成功和错误之一,但在这两种情况下 HTTP STATUS CODE = 200。当我在响应正文中得到 Erron 而不是调用 onNext 调用 onError 时,如何实现这一点?

 Observable<CreateAuth> createAuthObservable = endApiServiceProvider.createAuth(phone);
        Subscription subscription = createAuthObservable
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(createAuth -> {
                          hideProgress();
                          successAuth(phone);

                        },
                        throwable -> {
                            //todo correct handle error
                            hideProgress();
                            if (throwable instanceof IOException) {
                                showError("Network error. Please check your internet connection");
                            }
                        });

我的端点接口

@GET("/api/new.php")
Observable<CreateAuth> createAuth(@Query("username") String uname);

成功响应(HTTP 代码 200)和 CreateAuth.java POJO 结构如下

{
 "val": true,
 "message": "Success!"
}

错误响应(HTTP 代码 200)和 ErrorResponse.java POJO 结构如下

{
    "error_type": "wrong_c",
    "error_additional": "Illegal char in name!"
}

【问题讨论】:

  • Mann,200 状态码表示响应正常。该问题可能与请求正文有关。
  • 如果成功和错误响应都收到 HTTP 200,那么这不会在 Retrofit 中自动抛出错误。就改造而言,请求是成功的。您需要分析返回的内容并适当地处理它,例如让 CreateAuth 和 ErrorResponse 都扩展同一个基类并拥有一个共同的 isError 标志。或者,重新配置您的端点以在错误时返回 4xx 响应。
  • @MichaelDodd,有没有办法编写可以处理这种情况的拦截器?
  • 我同意@Michael Dodd。问题不在于改造,您的端点应该通过正确的 HTTP 响应。
  • @EugeneStepanov 这取决于。你如何提供你的回应?您可能需要在此处就您的服务器端代码提出不同的问题。

标签: android rx-java retrofit2


【解决方案1】:

我会说这是服务器端问题,而不是客户端代码的问题。你会收到 HTTP 200 的成功和错误响应,那么这不会在 Retrofit 中自动抛出错误。就改造而言,请求是成功的。

如果您想保持服务器配置相同,您需要分析返回的内容并适当地处理它,因此成功和错误响应都必须可以解析到同一个类中。

或者,重新配置您的端点以在出错时返回 4xx 响应。我会推荐这种方法。

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2021-11-11
    • 1970-01-01
    • 2017-05-09
    • 2018-04-01
    相关资源
    最近更新 更多