Android中如何在Retrofit结合RxJava时获取HTTPS状态码?
如何在Retrofit+RxJava中获取HTTPS响应状态码
嘿,我来帮你搞定这个问题!你现在的困扰在于,当前的Observable直接返回了解析后的ResponseData实体类——这是Retrofit帮你自动把响应体转换成了业务对象,所以拿不到响应状态码、请求头这些元数据。要解决这个问题,只需要调整一下ApiService的返回类型,让它返回Retrofit提供的Response包装类就行,这样就能拿到完整的响应信息了。
具体操作步骤:
修改ApiService的方法返回类型
把原来返回Observable<ResponseData>的方法,改成返回Observable<Response<ResponseData>>。Response是Retrofit自带的类,它会包裹你的业务实体类,同时包含HTTP状态码、响应头、响应体等所有请求相关信息。调整订阅时的泛型匹配
对应的,DisposableObserver的泛型也要同步改成Response<ResponseData>,这样在onNext回调里就能拿到完整的响应对象了。在onNext中获取状态码和业务数据
拿到Response对象后,你可以通过response.code()直接获取HTTP状态码,用response.body()获取原来的ResponseData实体内容。
修改后的完整代码示例:
progressDialog.show(); Observable<Response<ResponseData>> observable = apiService.getData(); compositeDisposable.add(observable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<Response<ResponseData>>() { @Override public void onNext(Response<ResponseData> response) { // 获取HTTP响应状态码 int statusCode = response.code(); Log.e("pppp", "onNext: 状态码 = " + statusCode); // 获取解析后的业务实体数据 ResponseData responseData = response.body(); if (responseData != null) { Log.e("pppp", "onNext: 响应数据 = " + responseData.toString()); } } @Override public void onError(Throwable e) { progressDialog.dismiss(); Log.e("pppp", "onError: " + e.getMessage()); } @Override public void onComplete() { progressDialog.dismiss(); Log.e("pppp", "onComplete"); } }) );
额外小提示:
- Retrofit默认会把4xx、5xx这类错误状态码的请求抛到
onError回调里,而不会进入onNext。如果你想让所有状态码都进入onNext处理,可以在构建Retrofit时配置相关规则,或者在onNext里用response.isSuccessful()判断请求是否成功(该方法会返回code >= 200 && code < 300的判断结果)。
内容的提问来源于stack exchange,提问作者Vichit
相关产品推荐
相关产品推荐

