首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在安卓系统改造中如何使用response.body在401 errorCode

在安卓系统改造中如何使用response.body在401 errorCode
EN

Stack Overflow用户
提问于 2020-10-21 06:04:48
回答 1查看 545关注 0票数 0

在我的应用程序中,我希望从服务器获得一些数据,为此,我使用了改装

我想要显示错误信息,但是在打完电话后,Api告诉我强制关闭错误。

因为response.body

我的儿子是:

代码语言:javascript
复制
{"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}}

我的数据模型是:

代码语言:javascript
复制
data class ResponseModelRegister(
    @SerializedName("data")
    val `data`: Data = Data(),
    @SerializedName("meta")
    val meta: BaseResponseMeta = BaseResponseMeta()
)

我为调用Api :编写了下面的代码

代码语言:javascript
复制
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)
            })
    }
}

Logcat消息:E/errMessageIS: null

为什么给我看空?当错误代码为401时,如何访问元字段?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-21 06:57:31

您应该使用reponse.errorBody()而不是response.body()来获取错误。此外,要使其更好,还可以将错误体反序列化为已知的模型。查看如何实现它的链接:https://futurestud.io/tutorials/retrofit-2-simple-error-handling

我看到您使用的是@SerializedName,所以您可能使用了GSON,所以您可以这样轻松地完成它:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64457543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档