gpt4 book ai didi

java - 没有响应体时RxJava抓取网络响应码

转载 作者:搜寻专家 更新时间:2023-11-01 09:25:34 26 4
gpt4 key购买 nike

努力跟上 RxJava 的步伐。我有一个不返回任何数据的网络调用。唯一的响应是代码(快乐路径:200,否则为 4xx)。我想听取此响应,但我所能找到的只是如何使用某种响应对象来实现。

@GET
Observable<Response<ResponseBody>> makeHttpCall(@Url String url);

所以我的 RxJava 代码如下所示:

myRetrofit.makeHttpCall(url)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Response<ResponseBody>>() {
@Override
public void onCompleted() {
Timber.d("on completed");
}

@Override
public void onError(Throwable e) {
if (!(e instanceof EOFException)) {
Timber.e(e, "error occurred");
}
}

@Override
public void onNext(Response<ResponseBody> responseBodyResponse) {
Timber.d("on next");
}
});

这可行,但似乎是错误的解决方案。我不喜欢我的观察者如何进入 onError 方法。我的响应是 200,因此我希望在 onNext 或 onCompleted 方法中看到它。

我研究过使用 Completable,但这根本不起作用。不过,我仍然认为这可能是正确的做法。

这里最好的方法是什么?我想知道问题是否简单地追溯到我对 <Response<ResponseBody>> 的使用以及是否有更适合这种情况的不同类型。

最佳答案

如果您只关心 Http 代码响应,那么类似这样的内容应该浮出水面:

应用程序接口(interface):

@GET
Single<Response<ResponseBody>> makeHttpCall(@Url String url);

调用:

myRetrofit.makeHttpCall(url)
.subscribeOn(Schedulers.io())
.map(Response::code)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
i -> Timber.d("code " + i),
e -> {
if (!(e instanceof EOFException)) {
Timber.e(e, "error occurred");
}
});

另请注意,在您的原始代码中,您传递了 Response<ResponseBody>Observer在主线程上 - 与 ResponseBody 交互在此线程上将导致 NetworkOnMainThreadException因为处理 body 被认为是一个 IO 操作——我不知道你在这里想要的 Intent ,但是当你进行需要与 body 交互的 api 调用时值得注意。

关于java - 没有响应体时RxJava抓取网络响应码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957619/

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