gpt4 book ai didi

android - 使用 Retrofit 2.0 和 RxJava 获取响应状态码

转载 作者:IT老高 更新时间:2023-10-28 13:05:10 29 4
gpt4 key购买 nike

我正在尝试升级到 Retrofit 2.0 并在我的 android 项目中添加 RxJava。我正在进行 api 调用,并希望在服务器出现错误响应的情况下检索错误代码。

Observable<MyResponseObject> apiCall(@Body body);

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

在 Retrofit 1.9 中,RetrofitError 仍然存在,我们可以通过以下方式获取状态:

error.getResponse().getStatus()

你如何使用 RxJava 在 Retrofit 2.0 中做到这一点?

最佳答案

而不是像您那样声明 API 调用:

Observable<MyResponseObject> apiCall(@Body body);

你也可以这样声明:

Observable<Response<MyResponseObject>> apiCall(@Body body);

然后您将拥有如下所示的订阅者:

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

因此,带有错误代码的服务器响应也将被传递到 onNext,您可以通过调用 reponse.code() 来获取代码。

http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html

编辑:好的,我终于开始研究 e-nouri 在他们的评论中所说的内容,即只有 2xx 代码将用于 onNext。事实证明我们都是对的:

如果调用是这样声明的:

Observable<Response<MyResponseObject>> apiCall(@Body body);

甚至这个

Observable<Response<ResponseBody>> apiCall(@Body body);

所有响应将在 onNext 中结束,无论其错误代码如何。这是可能的,因为一切都被 Retrofit 包装在 Response 对象中。

另一方面,如果调用是这样声明的:

Observable<MyResponseObject> apiCall(@Body body);

或者这个

Observable<ResponseBody> apiCall(@Body body);

确实只有 2xx 响应会转到 onNext。其他所有内容都将包装在 HttpException 中并发送到 onError。这也是有道理的,因为没有 Response 包装器,应该将什么 发送到 onNext?鉴于请求不成功,发出的唯一明智的事情是 null...

关于android - 使用 Retrofit 2.0 和 RxJava 获取响应状态码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33774940/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com