kotlin - 正确处理 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,或者我只是不理解订阅(所有这些都是完全可能的)。
谢谢您的帮助。我难住了。
解决方案
终于发现问题所在了。我不明白在订阅中创建的调用是我从未订阅过的可观察的。相反,我将调用从订阅错误回调移动到 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
})
推荐阅读
- php - Wordpress / Learndash - 添加评论时发送电子邮件
- python - 语法错误:SELECT username FROM TAMS WHERE NAME IN caner?
- flutter - 如何在 Flutter 中保持专注于 TextField 但不显示键盘?
- php - Laravel 从 index.php 和 index.html 重定向到域
- python - 给定数字列表将返回 true 或 false 的列表理解
- javascript - 对象内数组的平均值
- python - python-dotenv 在自定义包中不起作用
- nginx - Nginx 将我的 localhost 端口请求路由到外部 url
- powershell - 转换 PowerShell 对象以在条件下使用它
- python-3.x - 带有 Python 3 的 MacOS 上的 Ansible 2.10