response为null时怎么进入onNext
参考:
1. 如果不需要输出response响应头
可以借助map,在subscribe之前把可能为null的response映射成另外一个不空的对象。
这样的话,就不会自动走进onError了。
例如,在presenter里面:
private void func(FuncReq funcReq) {
// ...
// ...
// ...
// ...
funcModel.responseNull(funcReq)
.map(new Func1<Response<FuncResp>, Object>() {
@Override
public Object call(Response<FuncResp> funResp) {
return funResp == null ? new NotNullObj() : funResp;
}
})
.subscribe(new Subscriber<Object>() {
@Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
@Override
pubic void onError(Throwable throwable) {
Log.d(TAG, "onError: ");
}
@Override
public void onNext(Object notNullResponse) {
Log.d(TAG, "onNext: ");
}
});
// ...
// ...
// ...
// ...
}
2. 如果需要输出response响应头
如果需要看响应码的话,就要保留response的数据,那么可以将Response的类型设置成ResponseBody。
这样返回的Response就不会是null,而且ResponseBody里面会保存一部分头部数据并且可以直接访问得到。
例如,在presenter里面,
private void func(FuncReq funcReq) {
// ...
// ...
// ...
funcModel.responseNull(funcReq)
.subscribe(new Subscriber<Response<ResponseBody>>() {
@Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
@Override
pubic void onError(Throwable throwable) {
Log.d(TAG, "onError: ");
}
@Override
public void onNext(Response<ResponseBody> notNullResponse) {
Log.d(TAG, "onNext: ");
Log.d(TAG, "notNullResponse: " + notNullResponse.toString());
Log.d(TAG, "responseCode: " + String.valueOf(notNullResponse.code()));
}
});
// ...
// ...
// ...
}
3. 如果只是想模拟http请求查看报文,以及为什么会跨域
可以考虑postman,而不是浏览器。因为浏览器会有跨域问题,但postman没有。

本文介绍在使用Retrofit2结合RxJava2时,如何处理可能为null的response,包括通过map操作避免onError触发,利用ResponseBody保存响应头数据,以及推荐使用Postman而非浏览器进行HTTP请求模拟,以避免跨域问题。
1138

被折叠的 条评论
为什么被折叠?



