【问题标题】:How to get error body returned by server when using Retrofit + Coroutine使用 Retrofit + Coroutine 时如何获取服务器返回的错误正文
【发布时间】:2021-07-26 10:10:48
【问题描述】:

当使用 Coroutine 和 Retrofit 调用网络 API 时,如果服务器返回错误(响应码!= 200),我们将得到一个异常。我的问题是如何查找/读取服务器通过异常发送的错误正文(在 Json 中)?

try{
     apiService.login()
}catch(exception:Exception){
     //How to read error body from exception
     //Error body example: {"ok":false,"error":"Incorrect username or password."}
}

【问题讨论】:

    标签: android exception error-handling retrofit kotlin-coroutines


    【解决方案1】:

    您只需要这样做:

    (exception as? HttpException).response()?.errorBody()?.string()
    

    这将返回 Json 格式的错误正文。

    【讨论】:

      【解决方案2】:

      要使用协程和改造来处理错误,您必须创建一个 Sealed 类,请按照以下步骤操作...

      1:状态句柄类

      sealed class NetworkState {
        data class Success(val data : CharactersResponseModel) : NetworkState()
        object InvalidData : NetworkState()
        data class Error(val error : String) : NetworkState()
        data class NetworkException(val error : String) : NetworkState()
        sealed class HttpErrors : NetworkState() {
          data class ResourceForbidden(val exception: String) : HttpErrors()
          data class ResourceNotFound(val exception: String) : HttpErrors()
          data class InternalServerError(val exception: String) : HttpErrors()
          data class BadGateWay(val exception: String) : HttpErrors()
          data class ResourceRemoved(val exception: String) : HttpErrors()
          data class RemovedResourceFound(val exception: String) : HttpErrors()
        }
      }
      
      1. 处理错误或成功的 API 调用

         private suspend fun fetchCharacters() : NetworkState {
         return try {
           val response = apiService.getCharacters()
           if (response.isSuccessful) {
             if (response != null) {
               NetworkState.Success(response.body()!!)
             } else {
               NetworkState.InvalidData
             }
           } else {
             when(response.code()) {
               403 -> NetworkState.HttpErrors.ResourceForbidden(response.message())
               404 -> NetworkState.HttpErrors.ResourceNotFound(response.message())
               500 -> NetworkState.HttpErrors.InternalServerError(response.message())
               502 -> NetworkState.HttpErrors.BadGateWay(response.message())
               301 -> NetworkState.HttpErrors.ResourceRemoved(response.message())
               302 -> NetworkState.HttpErrors.RemovedResourceFound(response.message())
               else -> NetworkState.Error(response.message())
             }
           }
        
         } catch (error : IOException) {
           NetworkState.NetworkException(error.message!!)
         }
        

        }

      2. 在你的 UI 中制作 liveData 或 flow 到 Observer 的网络状态

      【讨论】:

        猜你喜欢
        • 2021-10-25
        • 2022-01-18
        • 2021-11-15
        • 2014-05-17
        • 2019-02-07
        • 2016-02-22
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多