首页 > 解决方案 > 使用延迟对象时如何获取从api返回的错误字符串?

问题描述

我正在使用改造 2 向 API 发送发布请求。我使用延迟对象作为函数的返回类型

@POST("/some_path/")
fun sendPostReqAsync(@Body body: PostRequestBody): Deferred<PostReqResponse>

这里 PostReqResponse 是一个 DataClass,我使用 Moshi 作为转换器工厂。当请求成功时,我得到了所需的结果。当 API 端出现错误时,它会发送错误响应,例如“无效参数”或“用户不存在”。

{"non_field_errors":["User does not exist."]}

但是通过使用 try-catch 我得到了"retrofit2.HttpException: HTTP 400 Bad Request."

uiScope.launch {
        withContext(Dispatchers.IO) {
            try {
                val response = onboardingApi.sendPostReqAsync(body).await()
                Log.i("api_data",response.toString())
            } catch (e: Exception) {
                val error = e.toString()
                Log.i("api_data",error)
            }
        }
    }

但我想要 API 返回的错误字符串。有人可以告诉我如何获取该错误字符串吗?

标签: androidapikotlinretrofitdeferred

解决方案


我遇到了同样的问题,我通过解析从异常中获得的 Json 来解决它。

这里的解决方案可能会解决您的问题

uiScope.launch {
        withContext(Dispatchers.IO) {
            try {
                val response = onboardingApi.sendPostReqAsync(body).await()
                Log.i("api_data",response.toString())
            } catch (e: Exception) {
                if (e is HttpException) {
                    val jsonObj = JSONObject(e.response()?.errorBody()!!.charStream().readText())
                    val error = jsonObj.getJSONArray("non_field_errors").getJSONObject(0).toString()
                    Log.i("api_data",error)
                }
            }
        }
    }

推荐阅读