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

Catching an error message with retrofit HttpException

我正在使用 Retrofit 向 API 发出一些请求,当我收到回复时,如果请求是成功

响应成功

{
    "success": 1,
    "error": [],
    "data": [
        // Some data..
     ]
}

如果有错误,响应将是这样的

响应失败

{
    "success": 0,
    "error": [
        "Password is incorrect"
    ],
    "data": []
}

现在的问题是万一有一个不成功的请求,它带有error code 403,所以Retrofit将它归类为一个Exception并抛出一个HttpException,那么我就没有办法捕捉到password is incorrect 消息附加在 json 响应中。

有什么办法即使出现 HttpException 也能得到正文响应吗?

更新

这是我正在使用的示例代码

ViewModel

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

好吧,我想出了一个方法来从传递的异常中取回响应。

正如我在问题中所说,这是我正在使用的代码

旧代码示例

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()
    }
}

然后您可以从那里操作此字符串以提取错误消息。