改造 Observables 和访问 Response

Retrofit Observables and access to Response

我正在使用 Retrofit 和 RxJava,但似乎不能做我想做的事。

这是我的网络服务声明:

Observable<Response> rawRemoteDownload(@Header("Cookie") String token, @Path("programId") int programId);

我遇到的问题是 Web 服务返回 403 和一个包含详细信息的 json 负载。

Retrofit 调用 onError,只传递 Throwable,所以我无法检查响应体。

这是我的部分测试代码

apiManager.rawRemoteDownloadRequest("token", 1).subscribe(new Observer<Response>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {
            // this is called and I've lost the response!
        }

        @Override
        public void onNext(Response response) {

        }
    });

解决方案:

感谢 Gomino,我将其作为解决方案:

new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {
            if (throwable instanceof RetrofitError) {
                Response response = ((RetrofitError) throwable).getResponse();

                System.out.println(convertToString(response.getBody()));
            }
        }

其中 convertToString 看起来像:

private String convertToString(TypedInput body) {
    byte[] bodyBytes = ((TypedByteArray) body).getBytes();
    return new String(bodyBytes);
}

检查 throwable 是否为 RetrofitError:

@Override
public void onError(Throwable e) {
   if (e instanceof RetrofitError) {
      Response response = ((RetrofitError) e).getResponse();
   }
}