如何使用 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 实现协程 )

未解决的参考:等待。 Kotlin 协程

使用协程和 Flow 简化 API 设计

使用协程和 Flow 简化 API 设计

无法从ViewModel向用户显示协程错误消息

Kotlin协程简介