android - 如何在 Android 上的改造中使用 401 errorCode 中的 response.body
问题描述
在我的应用程序中,我想从服务器获取一些数据,为此我使用了retrofit。
我想显示错误消息,但在调用 Api 后显示强制关闭错误。
因为response.body
是空的!
我的json是:
{"data":{},"meta":{"error_message":"\u0644\u0637\u0641\u0627 \u062f\u0648\u0628\u0627\u0631\u0647 \u0648\u0627\u0631\u062f \u0634\u0648\u06cc\u062f","error_type":"OAuthPermissionsException","validation_error":null,"code":401}}
我的数据模型是:
data class ResponseModelRegister(
@SerializedName("data")
val `data`: Data = Data(),
@SerializedName("meta")
val meta: BaseResponseMeta = BaseResponseMeta()
)
我为 call Api 编写以下代码:
override fun callRegister(auth: String, accept: String, contentType: String, body: BodyModelRegister) {
if (view.checkNetworkConnection()) {
view.showLoader()
disposable = ApiClient.getInstance().apisUseCase()
.getRegisterUser(auth, accept, contentType, body)
.applyIoScheduler()
.subscribe({ response ->
view.hideLoader()
when (response.code()) {
in 200..202 -> {
response.body()?.let { itBody ->
if (itBody.data.role == STAFF_PROFILE) {
view.gotoStaffNextPage()
} else if (itBody.data.role == CUSTOMER_PROFILE) {
view.gotoCustomerNextPage()
}
}
}
in 400..499 -> {
Log.e("errMessageIS", response.body().toString())
response.body()?.meta?.let {
view.serverError(it.errorMessage)
}
}
in 500..599 -> {
view.responseCodeError()
}
}
}, { error ->
view.hideLoader()
view.responseError(error)
})
}
}
日志信息:E/errMessageIS: null
为什么给我看空?错误代码为401时如何访问元字段?
解决方案
您应该使用reponse.errorBody()
而不是response.body()
获取错误。此外,您可以做些什么来使其变得更好,您可以将错误主体反序列化为已知模型。查看此链接以了解如何实现它:https ://futurestud.io/tutorials/retrofit-2-simple-error-handling
我看到你正在使用@SerializedName
,所以你可能正在使用 GSON,所以你可以像这样轻松地做到这一点:
data class ErrorResponse(
@SerializedName("data") val payload: Data,
@SerializedName("meta") val meta: Meta
)
data class Meta(
@SerializedName("error_message") val errorMessage: String,
@SerializedName("error_type") val errorType: String,
@SerializedName("validation_error") val validationError: ? // don't know the type
@SerializedName("code") val errorCode: Int
)
val type = object : TypeToken<ErrorResponse>() {}.type
var errorResponse: ErrorResponse? = null
try {
errorResponse = gson.fromJson(response.errorBody()?.charStream(), type)
} catch(e: Exception) {
e.printStackTrace()
}
val errorMessage = errorResponse?.errorMessage
推荐阅读
- jquery - 搜索功能未清除
- css - Use current tag name in attribute value when selector is a wildcard
- cassandra - [从 MAXBATCHSIZE 复制] 上的 cassandra 触发器
- amazon-web-services - 通过 ALB 将客户端转发到特定的 ENI
- mysql - 如何在 MySQL 中按小时对值进行分组
- r - 如何使用 dplyr 计算会话中不同项目的平均购买量
- javascript - 使用 Vue.js 应用条件 CSS 类的问题
- react-native - react-native-vector-icons 字体真棒和轻版本
- typescript - 如何查看 webpack 警告
- javascript - 函数参数在循环内不起作用