有没有办法使改型忽略EOFExceptions并继续进行解析?

时间:2019-10-08 10:01:48

标签: android retrofit okhttp

我正在更改我们的应用程序使用改造而不是仅使用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异常的情况下应该恢复而不是停止?

0 个答案:

没有答案