【问题标题】:How do I get Response body when there is an error when using Retrofit 2.0 Observables使用 Retrofit 2.0 Observables 时出现错误时如何获取响应正文
【发布时间】:2016-02-22 06:45:34
【问题描述】:

我正在使用 Retrofit 2.0 进行返回 Observables 的 api 调用。当呼叫顺利进行并且响应符合预期时,一切正常。现在假设我们有一个错误响应,它会抛出一个 onError。即使是错误,我也想阅读响应正文。

例子

@FormUrlEncoded
@POST("tokenLogin")
Observable<LoginResponse> loginWithToken(
        @Field("token") String pin
);

当请求和响应有效时,我会得到正确的 observable,并且在出现错误时按预期调用 onError。

正确答案:

{ "status" : "authenticated" }

Observable 将其转换为正确的 Observable,我可以将响应读取为 LoginResponse 对象。

现在,错误响应如下:

{ "errorMessage" : "You need to take some xyz action" }

我想阅读该错误响应并将消息显示给用户。我该怎么做呢?

【问题讨论】:

    标签: android retrofit rx-java rx-android


    【解决方案1】:

    只需检查 throwable 是否是 HttpException 的实例,然后您就可以访问改造响应

    if (e instanceof HttpException) {
        ResponseBody body = ((HttpException) e).response().errorBody();
        ...
    }
    

    然后你可以使用converter to deserialize it(或者自己做)。

    【讨论】:

      【解决方案2】:

      您可以添加此代码块以显示错误消息。

      @Override
      public void onFailure(Throwable t) {
      
       if (t instanceof HttpException) {
              ResponseBody body = ((HttpException) t).response().errorBody();
              Gson gson = new Gson();
              TypeAdapter<ErrorParser> adapter = gson.getAdapter
                      (ErrorParser
                              .class);
              try {
                  ErrorParser errorParser =
                          adapter.fromJson(body.string());
      
                  Logger.i(TAG, "Error:" + errorParser.getError());
      
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
      

      【讨论】:

      • 我想了解您的 ErrorParser。谢谢:)
      • @Alston ErrorParser 是 JSON 类
      • @Akshay Shinde 谢谢兄弟,它帮助了我。很棒的工作
      【解决方案3】:

      Retrofit 返回 Throwable Object,它是一种 HttpException。您需要做的第一步是您应该知道错误主体对象的结构。将展示如何做到这一点 Kotlin。了解结构后,您需要创建 Error.kt 文件,如下所示:

      package com.test.test.qr.data.network.responsemodel
      import com.google.gson.annotations.SerializedName
      
      data class Error(
          @SerializedName("code")
          val code: String,
          @SerializedName("message")
          val message: String
      )
      

      现在您需要将正文从 HttpException 解析为您创建的 Error.Kt。这可以如下所示完成:

      if(it is HttpException) {
          val body = it.response()?.errorBody()
          val gson = Gson()
          val adapter: TypeAdapter<Error> = gson.getAdapter(Error::class.java)
          try {
              val error: Error = adapter.fromJson(body?.string())
              Log.d("test", " code = " + error.code + " message = " + error.message)
          } catch (e: IOException) {
             Log.d("test", " Error in parsing")
          }
      }
      

      你在 onError() 中从改造中获得的 Throwable 在哪里。希望能帮助到你。快乐编码...:-)

      【讨论】:

      • 像魅力一样工作!!
      猜你喜欢
      • 2016-11-10
      • 2018-08-18
      • 1970-01-01
      • 2020-12-04
      • 2018-01-02
      • 2016-09-02
      • 2021-07-26
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多