android - HTTP 状态码出错时无法解析响应对象
问题描述
我正在使用 android native 中的“RxJava2”调用一项 Web 服务,如下所示。这里的问题是,如果第三方 Web 服务出现错误,则返回 HTTP 状态代码错误,错误对象中的错误描述是单独的。
现在这里的问题是服务返回 HTTP 状态代码 422 , rxjava 调用属于onError
并且由于我无法解析Response
具有errors[]
数组的对象。
服务响应
(HTTP 状态码是 422 Unprocessable Entity)
{
"fitness": [],
"errors": [
{
"code": 409,
"message": "Conflict",
"errors": "Activity is already taken",
"activity_id": "100"
}
]
}
安卓代码
fitnessFlowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.takeUntil(response->response.getSummary().getNext()!=null)
.subscribe(new Subscriber<Response>() {
@Override
public void onSubscribe(Subscription s) {
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(Response response) {
Log.e(TAG, "onNext" );
if(response !=null){
if(response.getFitness()!=null && response.getFitness().size()!=0){
Realm realm = Realm.getDefaultInstance();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(response.getFitness());
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
Log.i(TAG, "onSuccess , fitness data saved");
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
Log.i(TAG, "onError , fitness data failed to save"+error.getMessage() );
}
});
}else{
Log.i(TAG, "onError , no fitness data available" );
}
}else{
Log.i(TAG, "onError , response is null" );
}
}
@Override
public void onError(Throwable t) {
Log.e(TAG, "onError" +t.getMessage());
}
@Override
public void onComplete() {
Log.e(TAG, "onComplete");
}
});
解决方案
我相信您的问题已经在此线程中得到解答:How do I get Response body when there is an error when using Retrofit 2.0 Observables。
但基本上你需要做的是从onError的Throwable中获取一个HttpException,然后从该异常中获取responseBody
public void onError(Throwable t) {
if (t instanceof HttpException) {
ResponseBody body = ((HttpException) t).response().errorBody();
// Parse the body using gson
}
Log.e(TAG, "onError" +t.getMessage());
}
推荐阅读
- html - HTML中的工作表是否有输入类型?
- javascript - 范围/视图移动到另一个控制器后,Promise 处理是否继续?
- vue.js - 服务工作者不缓存 https 响应
- java - 将类型化集合从 Scala 2.13 方法返回给 Java 8 调用者
- javascript - 使用php,ajax从数据库中获取数据
- python - 通过 environment.yml 使用 conda 安装 npm 包
- anaconda - Anaconda 安装:错误:系统无法找到指定的注册表项或值
- regex - 如果单元格包含值范围内的文本,则返回找到的文本的相邻值
- javascript - 如何修复托管在 http-server 上的电子邮件表单 (PHP) 的 POST 405 错误?
- javascript - 如何获得 JSON 对象中两个数字之间的最大差异