如何使用 Kotlin 协程获取 API 错误正文
Posted
技术标签:
【中文标题】如何使用 Kotlin 协程获取 API 错误正文【英文标题】:How to get API error body using Kotlin coroutines 【发布时间】:2020-11-23 04:39:45 【问题描述】:我正在尝试使用改造和协程进行 POST 请求, 并且只要 HTTP 响应状态不是 200,它就会抛出异常。我的 API 有一个如下所示的响应正文:
"auth_token": null,
"error": "Email can't be blank. Password can't be blank. First name can't be blank. Last name can't
be blank. Date of birth can't be blank"
我想在没有回调的情况下捕获此错误消息,这可能吗?
API 服务类
@GET("flowers")
suspend fun getAllFlowers(@Query("page") page: Int): Flowers
@POST("users/register")
suspend fun registerUser(@Body user: User) : NetworkResponse
网络响应类
class NetworkResponse(
val auth: String,
val error: String)
ViewModel 类
fun registerUser(user: User)
coroutineScope.launch
try
val registerUser = FlowerApi.retrofitService.registerUser(user)
_token.value = registerUser.auth
catch (cause: Throwable)
//CATCH EXCEPTION
提前致谢
【问题讨论】:
这能回答你的问题吗? Retrofit 2.0 how to get deserialised error response.body 我想在没有回调的情况下这样做,这可能吗?从 API 获取错误正文 你的意思是你不想用 try catch 包装请求? 我只想用最好的方法来做这件事 【参考方案1】:在您的catch
块中,您需要检查throwable
是否为HttpException
(来自Retrofit 包),然后您可以通过调用cause.response()?.errorBody()?.string()
从中找到错误正文:
catch (cause: Throwable)
when (cause)
is HttpException ->
cause.response()?.errorBody()?.string() //retruns the error body
else ->
//Other errors like Network ...
【讨论】:
以上是关于如何使用 Kotlin 协程获取 API 错误正文的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程协程底层实现 ① ( Kotlin 协程分层架构 | 基础设施层 | 业务框架层 | 使用 Kotlin 协程基础设施层标准库 Api 实现协程 )