获取正文从错误响应中使用execute()进行Retrofit
所以出于某种原因,我需要像这样执行我的电话:
val result = manager.call.execute() if (result.isSuccess) { //do stuff } else { //handle exeption }
当我的代码到达else
括号result.body()
为空, result.errorBody()
的缓冲区内容为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
括号?
正如@ florian-do所建议的那样, 从RetrofitError获取JSON包含答案,请参阅答案末尾的Retrofit2部分。 但是,我正在使用kotlin,这个小小的改变是获得转换器所必需的:
val a = object : Annotation{} val converter = Backend.retrofit. //this is for accessing my Retrofit object responseBodyConverter<Error>(Error::class.java, arrayOf(a))
你可以像这样创建一个简单的类
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
,而不必重写解析逻辑。
这是从这个博客文章 (我写的)。