android - 使用延迟对象时如何获取从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 返回的错误字符串。有人可以告诉我如何获取该错误字符串吗?
解决方案
我遇到了同样的问题,我通过解析从异常中获得的 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)
}
}
}
}
推荐阅读
- javascript - Vimeo iframe 嵌入视频仅对其他 Vimeo iframe 自动暂停。当播放同一页面上的 YouTube iframe 时,它们不会暂停
- ios - 如何在 Objective-C 中将多个 ViewController 链接到 NavigationController
- amazon-web-services - AWS:帮助在 Elastic Beanstalk 上配置端到端加密
- javascript - React axios - TypeError:无法读取未定义的属性'post'
- javascript - 使用 AJAX、JQuery 和 HTML 显示/隐藏数据
- java - 如何用 java 2d 数组解决这个问题?
- python - 根据另一个列表排序对对象列表进行排序
- reactjs - 渲染选择
- autohotkey - 在后台运行的 AHK 脚本
- java - Java Selenium 仅针对第一页重复打印表格行