Как изменить URL-адрес запроса с помощью Retrofit и Okhttp (воссоздание Retrofit2.Call)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как изменить URL-адрес запроса с помощью Retrofit и Okhttp (воссоздание Retrofit2.Call)

Сообщение Anonymous »

Я хочу изменить URL-адрес моего запроса после того, как он однажды завершится неудачей. Позвольте мне уточнить...
Итак, если я позвонил на www.abc.com/whatever и по какой-то причине этот вызов не удался, я хочу сделать последующие повторные попытки на www.abc-2.com/whatever. Проблема в том, что я использовал служебный метод для обертывания вызовов API вокруг логики try-catch и повтора. Выглядит это примерно так:

Код: Выделить всё

suspend fun  safeApiCall(apiCall: suspend () -> Response): Result {
val maxRetries = 5
val retryCount = 0
while (retryCount < maxRetries) {
try {
val response = apiCall.invoke()
if (response.isSuccessful) {
return Result.success(response.body)
} else {
retryCount++
}
} catch(e: Exception) {
// do some logging
retryCount++
}
}
}
... а интерфейс службы API выглядит примерно так:

Код: Выделить всё

interface MyApiService {
@GET
suspend fun getApiData(
@Url completeUrl: String,
@QueryMap queries: Map,
@HeaderMap headerMap: Map = hashMapOf()
): Response
}
В моем репозитории или ViewModel я вызываю API примерно так:

Код: Выделить всё

suspend fun getMyApiResponse(): Result {
return safeApiCall {
apiService.getApiData(
completeUrl = "www.abc.com/whatever",
queries = listOf(),
)
}
}
Теперь, в методе SafeApiCall, если первый вызов API завершится неудачно, я хочу изменить хост моей конечной точки API, но это не так просто, поскольку SafeApiCall
code> не содержит информации об объекте запроса. Я попытался изменить методы в своей службе API, чтобы они возвращали объекты вызова следующим образом:

Код: Выделить всё

interface MyApiService {
@GET
fun getApiData(
@Url completeUrl: String,
@QueryMap queries: Map,
@HeaderMap headerMap: Map = hashMapOf()
): Call
}
но теперь у меня новая проблема: хотя у меня есть доступ к объекту запроса и исходной конечной точке, к которой был сделан запрос, я не могу создать новый объект Call с помощью новая конечная точка, чтобы поставить ее в очередь, поскольку модификация делает это внутри, во время выполнения (AFAIK). Кроме того, важно получить исходную конечную точку, поскольку решение о получении новой конечной точки зависит от исходной.
Есть ли какой-либо метод, с помощью которого я могу добиться переключения URL-адресов без особых изменений с помощью метода SafeApiCall. Я знаю, что мог бы использовать перехватчик, но тогда мне пришлось бы переместить в него всю логику, связанную с повтором, а перехватчики просто не кажутся правильным выбором для логики повтора.
Любая помощь будет очень ценю.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ng-retrofi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»