我使用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)
}