Я изменяю способ, которым наше приложение работает, чтобы использовать модификацию вместо просто OkHTTP
Способ, которым он работал, мы отправляли запрос, извлекали тело как входной поток и считывали все байты вstring.
После этого мы будем анализировать тело с помощью 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 оно должно возобновиться вместо остановки?