Rx java 即使http状态代码不是200,如何继续从RESTAPI获取响应数据?

Rx java 即使http状态代码不是200,如何继续从RESTAPI获取响应数据?,rx-java,retrofit2,rx-android,Rx Java,Retrofit2,Rx Android,我正在使用改型2.0.2和okhttp3来构建我的应用程序。如果服务器代码有任何逻辑错误,我的服务器将http状态代码设置为418。好像密码不匹配。响应数据为{“statuscode”:500}。500表示密码不匹配。当okhttp3获得非200 http状态代码时,我不知道如何读取响应数据。翻新在得到418时抛出异常 我的问题是,即使http状态代码不是200,如何读取响应数据 有什么建议吗?我想您将通话定义为: Observable<YourModel> doStuff();

我正在使用改型2.0.2和okhttp3来构建我的应用程序。如果服务器代码有任何逻辑错误,我的服务器将http状态代码设置为418。好像密码不匹配。响应数据为{“statuscode”:500}。500表示密码不匹配。当okhttp3获得非200 http状态代码时,我不知道如何读取响应数据。翻新在得到418时抛出异常

我的问题是,即使http状态代码不是200,如何读取响应数据


有什么建议吗?

我想您将通话定义为:

Observable<YourModel> doStuff();
Observable<Response<YourModel>> doStuff();
当出现HTTP错误时,您将得到一个调用
onSuccess

onSuccess
中,您需要检查
response.issucess()
。对于200-300个状态代码,它返回true,您可以使用
response.body()

如果
response.issucess()
返回false,则可以使用以下方法将错误主体转换为模型类:

if(throwable instanceof HttpException) {
    //we have a HTTP exception (HTTP status code is not 200-300)
    Converter<ResponseBody, Error> errorConverter =
        retrofit.responseBodyConverter(Error.class, new Annotation[0]);
    //maybe check if ((HttpException) throwable).code() == 400 ??
    Error error = errorConverter.convert(((HttpException) throwable).response().errorBody());
}
if(HttpException的可丢弃实例){
//我们有一个HTTP异常(HTTP状态代码不是200-300)
转换器错误转换器=
改装.responseBodyConverter(Error.class,新注释[0]);
//可能会检查((HttpException)throwable.code()==400??
Error Error=errorConverter.convert(((HttpException)throwable.response().errorBody());
}

我可以使用以下方法获取响应数据:拦截器networkInterceptor=new Interceptor(){@Override public okhttp3.response intercept(Chain-Chain)抛出IOException{Request-Request=Chain.Request();response-response=Chain.Procedure(Request);String-str=response.body().String();if(str==null){}int statusCode=response.code();if(statusCode>418){}返回响应;};okBuilder.addNetworkInterceptor(networkInterceptor);我的问题变为如何在onError()方法中通知我的侦听器,因为onError(Throwable e)方法中只有一个参数。请查看此答案,谢谢LordRaydenMK,这是一个很好的解决方法。您从哪里获得改装实例?我使用RxJava+改型来使用其余部分,OneError回调只返回一个Throwable@PopAlex-Cristian
改装
是用于创建服务的改装实例。我通常用匕首注射。你将如何传递它取决于你。有没有一种方法可以传递自定义错误类,而不是在每个回调中丢弃,而不是手动编写它?@PopAlex Cristian看一看:这看起来相当复杂。没有别的办法吗?OkHttp主体日志向我显示来自服务器的json错误响应。