Android Retrofit抛出异常而非返回响应,如何获取404错误数据?
解决Retrofit 404时获取服务器错误对象的问题
默认情况下Retrofit会把4xx、5xx这类HTTP错误码直接抛出异常,所以你的代码会进入catch块。要拿到服务器返回的错误数据,按以下步骤修改即可:
第一步:修改Retrofit接口的返回类型
把接口方法的返回值用Response<T>包裹,这样Retrofit就不会自动抛出HTTP异常,而是返回完整的响应对象供你处理。示例:interface MyApiService { @GET("你的接口路径") suspend fun getRoadStatus(@Query("roadName") roadName: String): Response<List<你的数据模型类>> }第二步:在ViewModel里手动处理响应结果
调用接口后先判断response.isSuccessful:- 成功状态下,从
response.body()获取正常数据; - 失败状态下,通过
response.errorBody()解析服务器返回的错误内容。
修改后的
getRoadStatus方法:fun getRoadStatus(roadName: String) { viewModelScope.launch { _busy.value = true try { println("Getting result") val response = MyApi.retrofitService.getRoadStatus(roadName) if (response.isSuccessful) { response.body()?.takeIf { it.isNotEmpty() }?.let { _dataObject.value = it[0] } } else { // 解析错误响应 response.errorBody()?.let { errorBody -> val errorJson = errorBody.string() // 用你自己的错误模型类解析JSON,比如用Gson/Moshi val errorModel = Gson().fromJson(errorJson, 你的错误模型类::class.java) // 这里可以把错误对象存到LiveData,或者做其他业务处理 println("服务器返回错误:${errorModel.message}") } } } catch (e: Exception) { println("请求异常:${e.message}") } finally { _busy.value = false } } }- 成功状态下,从
补充:定义错误模型类
提前和服务器返回的错误JSON结构对应好模型类,比如服务器返回的404响应是:{ "message": "该道路不存在", "code": 404 }对应的模型类:
data class 你的错误模型类( val message: String, val code: Int )
内容的提问来源于stack exchange,提问作者Damandroid
相关产品推荐
相关产品推荐

