如何在onResponse中捕获改造响应错误?

时间:2019-08-28 19:11:57

标签: android kotlin retrofit2

我正在Android应用中使用Retrofit2。这是我的回复代码:

override fun onResponse(call: Call<Asset>?, response: Response<Asset>?) {

                val errorStart = response?.errorBody()?.string() // I get "ERROR" here

                if (response != null && response.isSuccessful) {
                    // A successful response was returned
                    completion(response.body(), null)
                } else {
                    // Not success
                    val errorElse = response?.errorBody()?.string() // I get "" here

                    val error = Error(errorText)
                    completion(null,error)
                }
            }

这是我用来测试代码的代码:

response = Response.Builder()
                            .code(403)
                            .message(responseString)
                            .request(chain.request())
                            .protocol(Protocol.HTTP_1_0)
                            .body(ResponseBody.create(MediaType.parse("application/json"), "ERROR"))
                            .addHeader("content-type", "application/json")
                            .build()

运行代码并返回响应时,response?.errorBody()?.string()是一个字符串,我可以捕获它,就像在此代码中将其作为val errorStart一样。 ...但... 当我运行IF代码/逻辑并尝试在else代码块中捕获response?.errorBody()?.string()时,它现在为空白/消失。

有人可以解释发生了什么或我做错了什么吗?在OnResponse中捕获错误信息的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

首先,errorBody()的类型为stream,这意味着直到调用该方法才读取它。流只能读取一次,请查看here以获取详细说明。