【问题标题】:How to get body from a server response with code 400 in Kotlin with coroutine and retrofit?如何通过协程和改造从 Kotlin 中代码 400 的服务器响应中获取正文?
【发布时间】:2021-04-17 12:47:56
【问题描述】:

我有一个 xampp 服务器连接到我的 android 应用程序。 当我执行 api 调用时,它会返回响应代码 200 或响应代码 400。 如果响应码是 200,我可以得到响应的正文。

这是响应正文:

{"message": "User was created."}

但是,当代码为 400 时,我无法获取响应正文。

它是空的。

这是我的界面:

@POST("api/user/createUser.php")
suspend fun register(@Body details : JsonObject) : Response<JsonElement>

我是这样称呼它的:

val service = Server.ApiClient.createService(ServerInterface::class.java)
        
        CoroutineScope(Dispatchers.IO).launch {

            try {
                val response = service.register(details)
                Log.wtf("Message",response.body().toString())
            }
            catch (e : Exception){
                Log.wtf("Error",e.message)
            }
        }

这是日志:

响应码 200:

E/Message: {"message":"User was created."}

响应码 400:

E/Message: null

有人知道怎么解决吗?

【问题讨论】:

    标签: android kotlin retrofit2 kotlin-coroutines


    【解决方案1】:

    如果我没记错的话,Retrofit 会将 200-399 范围之外的响应代码视为错误,因此应该使用 response.errorBody() 而不是 response.body() 来提供消息。

    【讨论】:

    • 当我在 response.errorBody() 上调用 .toString() 时,字符串是这样的:okhttp3.ResponseBody$Companion$asResponseBody$1@559aed4
    • @BinishMathew 这是因为errorBody() 返回一个ResponseBody 类型的对象。您可以在其上调用string() 方法以将响应正文作为字符串:response.errorBody().string()
    • 那行得通。谢谢@user2340612,但 string() 被标记为 Inappropriate blocking method call 。这是什么意思?
    • 基本上,警告是说该方法可能会通过将整个响应主体读入内存来阻塞线程,从而消除协程的潜在好处。 Here你可以找到更多信息
    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2020-02-22
    • 2019-09-28
    • 2017-04-19
    • 1970-01-01
    • 2020-10-01
    • 2011-11-30
    相关资源
    最近更新 更多