【问题标题】:How to use response.body in 401 errorCode in retrofit on Android如何在 Android 的改造中使用 401 errorCode 中的 response.body
【发布时间】:2021-02-04 00:17:57
【问题描述】:

在我的应用程序中,我想从服务器获取一些数据,为此我使用了 retrofit
我想显示错误消息,但调用 Api 后显示强制关闭错误。
因为response.bodynull

我的 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()
)

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

Logcat 消息:E/errMessageIS: null

为什么显示 null?错误代码为 401 时如何访问元字段?

【问题讨论】:

  • 检查你是否有类似errorBody()而不是body()
  • @P.Juni in errorBody,我如何访问我的元模型?

标签: android kotlin retrofit retrofit2


【解决方案1】:

您应该使用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

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多