【发布时间】:2016-10-27 15:01:31
【问题描述】:
改造版本:2.1.0
OkHttp 版本:3.4.1
在我的 Retrofit Callback 实现的 onResponse 方法中,我有以下逻辑:
@Override
public void onResponse(Call<BaseResponseBody<T>> call, Response<BaseResponseBody<T>> response) {
if (response != null && response.isSuccessful() && response.body() != null && response.body().containsValidSuccess()) {
// Perform actions using response.body().getValue().
} else {
// If containsValidSuccess returns false, show a dialog that includes the raw JSON response body.
}
}
这里BaseResponseBody是我自己的类型(与OkHttp的ResponseBody无关),它包装了一个泛型类型T extends Validatable,其中Validatable是一个接口,它公开了一个isValid方法,用于确认反序列化的响应满足给定约束。
如果我收到一个表面上成功的响应(HTTP 代码 2XX、非空响应正文等),但其反序列化的正文未通过此验证步骤(即 containsValidSuccess 返回 false),我想显示一个对话框,其消息包含 raw(预反序列化)响应正文。但是,我似乎无法通过 Retrofit Response 类型访问此原始响应正文。
我已阅读其他页面,这些页面似乎暗示Interceptor 可能更适合我的需求。我熟悉拦截器并将它们用于我的应用程序中的其他调用操作,但我不知道如何将信息从拦截器传递到最终的 Callback.onResponse 方法以显示对话框。
我在正确的道路上吗?我在 Retrofit API 中遗漏了一些明显的东西吗?我怎样才能实现我的既定目标?谢谢!
【问题讨论】:
-
是的!如果我在
Callback中调用response.raw().body().string(),我会看到以下异常:java.lang.IllegalStateException: Cannot read raw response body of a converted body.。另一方面,在我的Callback中调用response.body()会返回一个没有string方法的RetrofitResponse对象。 -
@stkent 你有自定义适配器吗?
-
@Raghunandan 自定义适配器到底是什么意思?在配置我的 Gson 实例时,我使用了几个自定义类型适配器。
-
@stkent 自定义类扩展
CallAdapter.Factory
标签: android retrofit retrofit2 okhttp okhttp3