【问题标题】:errorBody with retrofit2 and kotlin带有retrofit2和kotlin的errorBody
【发布时间】:2020-06-11 01:53:32
【问题描述】:

我正在尝试获取服务返回的错误(从无效凭据开始时)rest api,但由于某种原因,errorBody 没有从我的回答中捕获它。

我收到的正确答案没有问题,但是当我收到错误时,我无法解决服务器发送给我的内容。

对不起我的英语,我不得不使用翻译器

这是我应该得到错误的部分

override fun postLogin(callback: OperationCallBack<ResponseToken>, user: Login) {
    call = Api.build()?.login(user)
    call?.enqueue(object :Callback<ResponseToken>{
        override fun onFailure(call: Call<ResponseToken>, t: Throwable) {
            callback.onError(t.message)
        }

        override fun onResponse(call: Call<ResponseToken>, response: Response<ResponseToken>) {
            Log.v(TAG, "ErrorMensaje: ${response.message()}")
            Log.v(TAG, "ErrorBodyToString: ${response.errorBody().toString()}")

            response.body()?.let {
                if(response.isSuccessful && (it.isSuccess())){
                    Log.v(TAG, "token ${it.token}")
                    callback.onSuccess(it)
                }else{
                    Log.v(TAG, "token ${it.token}")
                    callback.onError("Error ocurrido")
                }
            }
        }
    })
}

errorBody 仅使用 toString 向我显示,否则它返回 null。使用 toString 这就是我得到的

2020-06-10 19:26:05.095 26590-26590/com.umbani.umbani V/CONSOLE: ErrorMensaje:
2020-06-10 19:26:05.095 26590-26590/com.umbani.umbani V/CONSOLE: ErrorBodyToString: okhttp3.ResponseBody$Companion$asResponseBody$1@fcb3843

okHttp 控制台显示来自服务器的错误,我无法捕捉到

D/OkHttp: {"success":true,"error":{"message":"Invalid credentials"}}

使用 Gson 或其他转换器转换没有问题。我能做到。我已经这样做了,并得到了积极的回应。

我在 StackOverFlow 上看到了很多答案,但没有一个对我有帮助。 谢谢

更新: 我在这个答案中找到了解决方案: https://stackoverflow.com/a/55835083/10372439

解决方案:

toString () 替换为string ()

response.errorBody()!!.string()

【问题讨论】:

  • 节省了我的时间,因为它只告诉了 ."string()"。对于那些想知道的人,当您收到 404 或 400 错误代码时,您应该使用 errorBody() 而不是 body()。

标签: kotlin gson retrofit2 response http-status-code-500


【解决方案1】:

尝试覆盖 onFailure 块,然后使用正确的对象进行投射

override fun onFailure(call: Call< ResponseToken >, t: Throwable) {
         if (t is HttpException) {
            try {
                val errorStringRaw: String? = t.response()?.errorBody()?.string()
                //Parse error message; format is api specific; we can't make a generic approach for this as of the moment
                val type = object : TypeToken<ResponseBody?>() {}.type
                val response: ResponseBody = Gson().fromJson(errorStringRaw, type)
                } catch (e: Exception) {

                }
         }
}

【讨论】:

  • 谢谢,但是还是不行,其实我在onFailure里面放了一个Log,没有进入@steven0529方法
  • 检查状态码响应。也许它会向您发送 STATUS 200,因此 Retrofit 认为这是一个成功的响应
  • 为了测试目的,可以尝试在 Log.v(TAG, "ErrorBodyToString: ${response.errorBody().toString()}") 之后从这个答案中移动解析逻辑。
  • 谢谢。这就是我所做的,但打印 errorBody.toString() 不会返回来自服务器的消息。只有我上面说的。有没有一种清晰有序的方法来捕捉不到 200 的retrofit2 错误?
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 2021-12-23
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多