在retrofit+Rxjava中如何取得状态码非200(出现错误)时的response里的body

一个典型的retrofit+Rxjava的网络请求如下

 1 Subscription subscription = videoChartService.login(newBody)
 2                 .observeOn(AndroidSchedulers.mainThread())
 3                 .subscribeOn(application.defaultSubscribeScheduler())
 4                 .subscribe(new Subscriber<LoginResponse>() {
 5                     @Override
 6                     public void onCompleted() {
 7                     }
 8 
 9                     @Override
10                     public void onError(Throwable error) {
11                     }
12 
13                     @Override
14                     public void onNext(LoginResponse loginResponse) {
15                     }
16                 });

我们知道如果成功我们可以从onNext里的Response里面来取出返回来的body。但是如果失败了,如何取出返回来的body呢??

根据文档,失败后会进入onError里面。但这个只是个Throwable类,如果直接tostring的话,我们可以看见它是只打印类返回的头部。所以看看能否向下转型,然后取出body。

这时我们故意发送一个失败请求,可以看见,打印出来的异常是

retrofit.HttpException

所以现在我们对它进行向下转型,onError里面代码如下:

 1 @Override
 2 public void onError(Throwable e) {
 3   if(e instanceof HttpException){
 4      ResponseBody body = ((HttpException) e).response().errorBody();
 5      try {
 6                 MyLog.Error(body.string());
 7           } catch (IOException IOe) {
 8                 IOe.printStackTrace();
 9           }
10    }
11 }

好了,现在打印出来的就是body了,注意是errorBody.string而不是errorBody.toString,不然它打印出来的只是地址。现在可用Gson等等各种方法了。 

转载地址:http://djjowfy.com/2016/04/29/当使用retrofit+Rxjava时,如何得到非200响应的body/

原文地址:https://www.cnblogs.com/fuyaozhishang/p/8607706.html