【问题标题】:Access raw response body in Retrofit callback在 Retrofit 回调中访问原始响应体
【发布时间】: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 方法的Retrofit Response 对象。
  • @stkent 你有自定义适配器吗?
  • @Raghunandan 自定义适配器到底是什么意思?在配置我的 Gson 实例时,我使用了几个自定义类型适配器。
  • @stkent 自定义类扩展 CallAdapter.Factory

标签: android retrofit retrofit2 okhttp okhttp3


【解决方案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);

【讨论】:

  • 这样做需要我手动将 Gson 转换应用到我的 JsonObject ;如果可能的话,我宁愿继续利用内置的适配器机制。
  • get 你会得到原始格式的 json 格式,然后你可以像这样把它放到你的 POJO 中 Gson g= new Gson(); POJOClass pojo=g.fromJson(response.body,POJOClass.class);
  • 然后我失去了回调的一般性质,这是一个严峻的副作用。
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2019-09-07
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多