改造 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();
}
}
我正在使用 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();
}
}