捕获带有改装HttpException的错误消息



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

成功响应

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

如果出现错误,响应将像一样

未成功响应

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

现在的问题是,如果有一个不成功的请求,它会附带error code 403,所以Reform将其归类为Exception并抛出HttpException,那么我就无法捕获json响应中附加的password is incorrect消息。

即使有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()
}
}

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

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

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

相关内容

最新更新