【发布时间】: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 这取决于。你如何提供你的回应?您可能需要在此处就您的服务器端代码提出不同的问题。