Android Studio 使用改进的HttpException捕获错误消息

v6ylcynt  于 2023-03-09  发布在  Android
关注(0)|答案(2)|浏览(156)

我使用Retrofit向API发出一些请求,当我收到响应时,如果请求成功,通常会从API收到这种格式的响应

    • 成功响应**
{
    "success": 1,
    "error": [],
    "data": [
        // Some data..
     ]
}

如果出现错误,响应将如下所示

    • 响应不成功**
{
    "success": 0,
    "error": [
        "Password is incorrect"
    ],
    "data": []
}

现在的问题是,如果有一个不成功的请求,它与error code 403一起出现,所以Retrofit将其归类为异常并抛出HttpException,然后我无法捕获json响应中附加的password is incorrect消息。
有没有什么办法,即使有一个HttpException,我仍然可以得到身体的React?

更新

这是我使用的示例代码

    • 视图模型**
viewModelScope.launch {
    try {
        val result = myApi.request(requestParam)
    }catch (e: HttpException){
        // Log the error
    }
}
qvtsj1bj

qvtsj1bj1#

我找到了一个从传递的异常中取回响应的方法。
正如我在问题中所说,这是我正在使用的代码

旧代码示例

viewModelScope.launch {
    try {
        val result = myApi.request(requestParam)
    }catch (e: HttpException){
        // Log the error
    }
}

但是,我不知道响应主体是通过异常传递的,您可以使用errorBody()方法将其作为字符串接收,如下所示。

新代码示例

viewModelScope.launch {
    try {
        val result = myApi.request(requestParam)
    }catch (e: HttpException){
        val response = e.response()?.errorBody()?.string()
    }
}

从那里你可以操作这个字符串来提取错误信息。

6qftjkof

6qftjkof2#

您可以像这样添加扩展方法:

inline fun Job.onHttpError(crossinline block: (HttpException) -> Unit) {
 this. invokeOnCompletion {
     if (it != null && it is HttpException) block(it)
 }
}

然后,您可以获得如下所示的异常信息:

viewModelScope.launch {
  val result = global.apiService.legalDigitalList()
}.onHttpError {
  showLog(it. message)
}

相关问题