在Retrofit回调中访问原始响应主体

时间:2016-10-27 15:01:32

标签: android retrofit retrofit2 okhttp okhttp3

改装版: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&#39; s ResponseBody无关),它包含泛型类型T extends Validatable,其中Validatable是一个公开的接口用于确认反序列化响应满足给定约束的isValid方法。

如果我收到表面上成功的响应(HTTP代码2XX,非空响应主体等),但其反序列化主体未通过此验证步骤(即containsValidSuccess返回false),我会喜欢提供一个对话框,其消息包含原始(预反序列化)响应主体。但是,我似乎无法通过Retrofit Response类型访问此原始响应正文。

我已阅读其他似乎暗示Interceptor可能更符合我需求的网页。我熟悉拦截器,并在我的应用程序中使用它们进行其他调用操作,但我不确切地知道如何将拦截器中的信息传递给最终的Callback.onResponse方法以便呈现对话框。

我是在正确的道路上吗?我是否遗漏了Retrofit API中的一些明显内容?我怎样才能达到既定目标?谢谢!

1 个答案:

答案 0 :(得分:1)

试试这个

@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> 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.
 }
}

之后你就可以把它放到你的POJO中了

Gson g= new Gson(); 
POJOClass pojo=g.fromJson(response.body,POJOClass.class);