我正在更改我们的应用程序使用改造而不是仅使用OkHTTP的方式
它过去的工作方式是,我们发送请求,检索正文作为输入流,并将所有字节读入字符串。
之后,我们将使用gson解析正文。
问题是服务器似乎在配置方面有问题(据告知,该问题在要修复的事情上,但是会花费很长时间),例如,它可能返回400字节的数据,但会发送消息,说字节实际上是402。
我们当前处理它的方式是捕获EOF异常并将其忽略,然后正常解析返回的字符串。
现在我使用以下请求获取所需的实体
@GET("/services/v1/entities")
suspend fun getEntities() : List<ServerEntity>
其中,如果没有错误,则可以正常工作
到目前为止我找到的解决方案都是
a)使用以下代码重试所有请求,直到我没有收到EOF异常为止:
internal suspend fun <T> tryTimes(times: Int = 3, func: suspend () -> T): T {
var tries = times.coerceAtLeast(2)
try {
var lastException: EOFException? = null
while (tries > 0) {
try {
return func.invoke()
} catch (eof: EOFException) {
lastException = eof
tries--
}
}
throw lastException!!
} finally {
log.d("DM", "tried request ${times.coerceAtLeast(2) - tries} times")
}
}
大多数情况下记录为0或1次尝试
或将我的所有请求更改为
@GET("/services/v1/entities")
suspend fun getEntities() : ResponseBody
并手动解析流(ResponseBody
可能不正确,但您可以理解我的意思)
有没有一种方法可以使用我的原始功能并使改装知道在发生EOF异常的情况下应该恢复而不是停止?