首页 > 解决方案 > 正确处理 404 以在订阅方法中进行后续 API 调用

问题描述

我不是安卓开发者,但我发现自己支持一些安卓代码。我有一个带有订阅方法的“doesExist”API 调用。如果 API 返回错误,我希望调用第二个 API,但在 subscribe 的错误回调中它不会调用。发出请求的函数被调用,但查尔斯告诉我该请求从未真正发出过。我花了几个小时浏览博客文章和 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)
               })

当 dosCaseExist API 调用成功时,将应用 flatMap,并且该块中的部分代码还将调用第二个 API。当 doesExist 返回 200 时,这个总是有效的。

如果“它”不存在,原始的 doesExist API 用于返回 200 和一个空主体。当它不存在时,我们想创建它。当“它”不存在并且我们想要创建它时,我们正在更改 API 以返回 404。这就是为什么您会看到两次创建调用。当它正常工作时,flatMap 中的那个会消失。

我已经通过一些 Charles 重写验证了 404 响应本身导致它进入订阅错误回调。当我调试时,我可以一直追踪到实际进行 API 调用,但事实并非如此。就像由于某种原因,当第一个调用抛出 404 时,它会跳过实际调用第二个调用。

显然,我想要发生的是,如果 dosCaseExist 得到 404,我希望 subsribe 错误回调中的 createCase 运行。我不确定这是否是线程问题,如果我没有正确处理 404,或者我只是不理解订阅(所有这些都是完全可能的)。

谢谢您的帮助。我难住了。

标签: kotlinrx-androidsubscribe

解决方案


终于发现问题所在了。我不明白在订阅中创建的调用是我从未订阅过的可观察的。相反,我将调用从订阅错误回调移动到 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
           })

推荐阅读