获取正文从错误响应中使用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 ,而不必重写解析逻辑。

这是从这个博客文章 (我写的)。