правильная обработка 404, чтобы сделать последующий вызов API в методе подписки - PullRequest
0 голосов
/ 02 июля 2019

Я не разработчик Android, но я поддерживаю некоторый код Android. У меня есть вызов API «doExist» с методом подписки. Если API возвращает ошибку, я хочу вызвать второй API, но внутри функции обратного вызова с ошибкой для подписки вызов не выполняется. Вызвана функция для создания запроса, но Чарльз показывает мне, что запрос фактически не выполняется. Я часами просматривал сообщения в блогах и stackoverflow и не нашел ответа.

код:

fun doesExistThenCreate(id: String) {
       remoteCase.doesCaseExist(id)
               .flatMap {
                   if (it) {
                       //some stuff
                   } else {
                       //create on 200 response but empty body
                       //this was the old way
                       remoteCase.createCase(id)
                   }
               }
               .subscribe({
                   //success actions
               }, { 
                   //doesExist returns 404, so call create.
                   //this is the new way, and it's not working
                   remoteCase.createCase(id)
               })

Если API-интерфейс didCaseExist успешен, применяется flatMap, и часть кода в этом блоке также должна вызывать второй API-интерфейс. Этот всегда работает, когда doExist возвращает 200.

Исходный API-интерфейс doExist возвращал 200 с пустым телом, если "оно" не существует. Когда этого не существует, мы хотим его создать. Мы меняем API, чтобы он возвращал 404, когда «его» не существует, и мы хотим его создать. Вот почему вы видите два вызова для создания. Когда это будет работать правильно, тот, что в flatMap, исчезнет.

Я через несколько переписываний Чарльза подтвердил, что именно ответ 404 заставляет его входить в ответный вызов ошибки подписки. Когда я отлаживаю, я могу проследить весь путь до момента фактического вызова API, но это не так. По какой-то причине он пропускает второй вызов, когда первый бросает 404.

Очевидно, что я хочу, чтобы получилось так, что если didCaseExist получит 404, я хочу, чтобы createCase в обратном вызове ошибки подписчика работал. Я не уверен, что это проблема с многопоточностью, неправильно ли я обращаюсь с 404, или просто не понимаю, как подписаться (все это вполне возможно).

Спасибо за помощь. Я в тупике.

1 Ответ

0 голосов
/ 03 июля 2019

Наконец-то разобрался, что проблема.Я не понимал, что призыв к созданию в подписке был наблюдаемым, на который я никогда не подписывался.Вместо этого я переместил вызов из обратного вызова ошибки подписки в onErrorResumeNext, чтобы он мог пройти через цепочку и в конечном итоге получить подписку.Я понятия не имею, если это самый правильный способ сделать то, что я пытаюсь сделать, но это работает.

   remoteCase.doesCaseExist(id)
           .flatMap {
               if (it) {
                   //some stuff
               } else {
                   //create on 200 response but empty body
                   //this was the old way
                   remoteCase.createCase(id)
               }
           }
           .onErrorResumeNext(
               remoteCase.createCase(id)
           )
           .subscribe({
               //success actions
           }, { 
               //error actions
           })
...