A.B*_*.B. 101 android android-networking rx-java retrofit rx-android
我正在尝试升级到Retrofit 2.0并在我的android项目中添加RxJava.我正在进行api调用,并希望在服务器发出错误响应的情况下检索错误代码.
Observable<MyResponseObject> apiCall(@Body body);
Run Code Online (Sandbox Code Playgroud)
并在RxJava调用中:
myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MyResponseObject myResponseObject) {
//On response from server
}
});
Run Code Online (Sandbox Code Playgroud)
在Retrofit 1.9中,RetrofitError仍然存在,我们可以通过以下方式获得状态:
error.getResponse().getStatus()
Run Code Online (Sandbox Code Playgroud)
如何使用RxJava进行Retrofit 2.0?
dav*_*ola 179
而不是像你一样声明API调用:
Observable<MyResponseObject> apiCall(@Body body);
Run Code Online (Sandbox Code Playgroud)
您也可以这样声明:
Observable<Response<MyResponseObject>> apiCall(@Body body);
Run Code Online (Sandbox Code Playgroud)
然后,您将拥有如下所示的订阅者:
new Subscriber<Response<StartupResponse>>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {
Timber.e(e, "onError: %", e.toString());
// network errors, e. g. UnknownHostException, will end up here
}
@Override
public void onNext(Response<StartupResponse> startupResponseResponse) {
Timber.d("onNext: %s", startupResponseResponse.code());
// HTTP errors, e. g. 404, will end up here!
}
}
Run Code Online (Sandbox Code Playgroud)
因此,带有错误代码的服务器响应也将被传递给onNext您,您可以通过调用获取代码reponse.code().
http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html
编辑:好的,我终于开始研究e-nouri在他们的评论中所说的内容,即只有2xx代码onNext.事实证明我们都是对的:
如果调用声明如下:
Observable<Response<MyResponseObject>> apiCall(@Body body);
Run Code Online (Sandbox Code Playgroud)
甚至这个
Observable<Response<ResponseBody>> apiCall(@Body body);
Run Code Online (Sandbox Code Playgroud)
onNext无论错误代码如何,所有回复都将结束.这是可能的,因为ResponseRetrofit将所有东西都包裹在一个对象中.
另一方面,如果调用声明如下:
Observable<MyResponseObject> apiCall(@Body body);
Run Code Online (Sandbox Code Playgroud)
或这个
Observable<ResponseBody> apiCall(@Body body);
Run Code Online (Sandbox Code Playgroud)
事实上只有2xx的回复才会发生onNext.其他所有东西都将包裹在一起HttpException并发送给onError.哪个也有意义,因为没有Response包装器,应该发出onNext什么?鉴于请求不成功,唯一明智的事情就是null......
小智 104
在onError方法里面放到这里获取代码
((HttpException) e).code()
Run Code Online (Sandbox Code Playgroud)
你应该注意到,从Retrofit2开始,代码为2xx的所有响应都将从onNext()回调调用,其余的HTTP代码如4xx,5xx将在onError()回调上调用,使用Kotlin我想出了类似的东西.这在onError()中:
mViewReference?.get()?.onMediaFetchFinished(downloadArg)
if (it is HttpException) {
val errorCode = it.code()
mViewReference?.get()?.onMediaFetchFailed(downloadArg,when(errorCode){
HttpURLConnection.HTTP_NOT_FOUND -> R.string.check_is_private
else -> ErrorHandler.parseError(it)
})
} else {
mViewReference?.get()?.onMediaFetchFailed(downloadArg, ErrorHandler.parseError(it))
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48637 次 |
| 最近记录: |