【问题标题】:Get body From error response with Retrofit with execute()使用带有 execute() 的 Retrofit 从错误响应中获取正文
【发布时间】:2016-04-07 15:53:26
【问题描述】:

所以出于某种原因,我需要像这样执行我的调用:

val result = manager.call.execute()
if (result.isSuccess) {
   //do stuff
} else {
    //handle exeption
}

当我的代码到达else 括号时,result.body() 为 null,result.errorBody() 的缓冲区内容为 0,但长度不为 0。

但是,这是我从改造中得到的日志:

<-- 400 Bad Request https://cubus-friends-
...
D/OkHttp: {"error":"validation_error","error_description":"No user with that phone number"}
D/OkHttp: <-- END HTTP (81-byte body)  

如何将我的 json 错误字符串放入代码中的 else 括号中?

【问题讨论】:

  • 你试过这个吗:Getting JSON from RetrofitError? P.S:看看 Retrofit 2.0 部分
  • 好的,所以我没有注意到评论末尾的 Retrofit 2 部分...谢谢!

标签: android retrofit2


【解决方案1】:

你可以像这样创建一个简单的类

class ApiError constructor(error: Throwable) {
    var errorMessage = "An error occurred"
    var error = "error"

    init {
        if (error is HttpException) {
            val errorJsonString = error.response()
                                       .errorBody()?.string()
            parsedString = JsonParser().parse(errorJsonString)
            this.error = parsedString.asJsonObject["error"].asString
            this.errorMessage = parsedString.asJsonObject["error_message"].asString
        } else {
            this.errorMessage = error.message ?: this.errorMessage
        }
    }
}

然后像这样使用它

try  { 
    val result = manager.call.execute()
} catch(error: IOException) {
    ApiError(error).errorMessage
}

这种方法的优点是您可以在代码中的任何位置使用ApiError(error).errorMessage,而无需重写解析逻辑。

这一切都来自this blog post(我写的)。

【讨论】:

    【解决方案2】:

    这是最好的方式,无需创建未使用的注解对象实例

    responseBodyConverter<Error>(Error::class.java, arrayOfNulls<Annotation>(0))
    

    【讨论】:

      【解决方案3】:

      正如@florian-do 所建议的,Getting JSON from RetrofitError 包含答案,请参阅答案末尾的 Retrofit2 部分。但是,我使用的是 kotlin,这个小改动对于获取转换器是必要的:

      val a = object : Annotation{}
      val converter = Backend.retrofit. //this is for accessing my Retrofit object
              responseBodyConverter<Error>(Error::class.java, arrayOf(a))
      

      【讨论】:

        【解决方案4】:

        如果您想在错误响应出现时获取数据(通常是响应代码,除了 200),您可以在 onResponse() 方法中这样做:

          if (result.isSuccess) {
          //do stuff
          } else {
          //handle exeption
              val converter = 
              ApiClient.getClient()?.responseBodyConverter<ErrorResponseData>(
                        ErrorResponseData::class.java, arrayOfNulls<Annotation>(0))
                                var errorResponse: ErrorResponseData? = null
                                    errorResponse = converter?.convert(response.errorBody())
                                    if (errorResponse != null) {
                                        //TODO: Handle Error case...
                                    }
          }
        

        【讨论】:

          猜你喜欢
          • 2016-11-10
          • 2016-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-18
          • 2012-05-10
          • 1970-01-01
          相关资源
          最近更新 更多