fetch-api 请求(GET 和 POST)失败。我很失落

roc*_*uit 5 javascript server-sent-events fetch-api svelte fastapi

我已经为钱编写代码 20 多年了,但我没有理由回答这个问题。

天哪,我用谷歌搜索过它。我知道这里有很多半相同的问题,我想我已经阅读了所有的回答,并尝试了所有建议的模式。许多问题都没有得到特别明确的阐述,而且我的案例似乎有点自相矛盾(所有部分都是孤立工作的)。请耐心等待,我会尽力而为。

前面使用 svelte-kit,后面使用 fastapi。

首先,下面是我的“Buttons.svelte”组件,逐字复制。

<script lang="javascript">

    async function worksJustFine() {
        fetch("https://jsonplaceholder.typicode.com/todos")
            .then(response => {
                console.log(" response", response)
                console.log(" r.json() >", response.clone().json())
                response.json()
                    .then(json => {
                        console.log("json", json)
                    })
                    .catch(error => console.log(error))
            })
    }


    async function doesNotWork() {
        fetch(`http://localhost:8000/api/test_url?test_param=1`)
            .then(response => {
                console.log(" response", response)
                console.log(" r.json() >", response.clone().json())
                response.json()
                    .then(json => {
                        console.log("json", json)
                    })
                    .catch(error => console.log(error))
            })
    }
</script>

<buttons>
    <button class="btn btn-outline-primary btn-lg" on:click={worksJustFine}>OK</button>
    <button class="btn btn-outline-primary btn-lg" on:click={doesNotWork}>NOT OK</button>
</buttons>

<style lang="scss">
</style>
Run Code Online (Sandbox Code Playgroud)

其次,下面是路线/视图:

@router.get("/api/test_url")
async def test_url(test_param: str):
    try:
        print(f"test_param: {test_param}")
        return {"success": True, "message": "Message", "hooray": True}
    except Exception as e:
        print(repr(e))
        return {"success": False, "message": repr(e), "": True}
Run Code Online (Sandbox Code Playgroud)

问题表现如下:

  • “NOT OK”按钮发起一个永远不会返回的请求,网络面板仅显示标准的 pebkac“(待处理)”请求,似乎永远。对于 Chromium 和 Chrome 来说确实如此,尽管上面的两个 GET 请求都可以在 Firefox(最新版和开发版)中使用。

  • fastAPI URL 在curl、insomnia 以及新选项卡中浏览器的直接请求(使用 chrome-stable、chromium 和 Firefox)中都能完美运行。

  • 如果我使用 POST 请求(这是我的目标),那么它根本无法在任何浏览器上工作。待定,永远。然而,当由curl、邮递员等触发时,POST 确实可以正常工作。

  • 有时我点击它然后走开。很少,在未指定的时间(半小时,一小时?)之后我返回 - 并发现它实际上确实有效 - 请求已通过,副作用是显而易见的。我认为这种情况在三天的斗争中总共发生了两次。

  • 这不是 CORS。如果我禁用下面的代码,它就会成为 CORS 问题,但使用此代码似乎很清楚。此外,如上所述,它在 FF 中运行良好,想必 FF 也尊重 CORS。

app = FastAPI()
app.add_middleware(CORSMiddleware,
                   allow_origins=["http://localhost:3000"],
                   allow_credentials=True,
                   allow_methods=["*"],
                   allow_headers=["*"])
app.include_router(router)
Run Code Online (Sandbox Code Playgroud)
  • 我的浏览器都没有安装任何插件或广告拦截器。在我的主浏览器(qtwebengine/qutebrowser)中,我有一个用于快进 YouTube 广告的 Greasemonkey 脚本,以及几个用户 CSS 文件。

  • 我读过的帖子和文章中的一个共同点是,根据调试工具面板是否打开,情况可能会有所不同。就我而言,这对情况没有任何影响。

  • 一切都在本地主机上运行 - 没有虚拟机,没有容器......只有我和本地主机。

  1. 由于worksJustFine效果很好,因此它似乎不是 svelte/javascript 问题。

  2. 由于test_url除 fetch API 之外的所有来源都可以正常工作(如 POST 或 GET),因此它似乎不是 fastAPI 问题。

我缺少什么?我可以提供哪些进一步的信息?

铬请求(待定)

insomnia请求,fastapi尚未重启,chromium请求仍待处理

roc*_*uit 3

感谢您抽出时间阅读此处并发表评论。我已经克服了这个问题,尽管我还没有摆脱残留的困惑。

  • 我不知道 SSE 连接有限制 - Chromium 中的连接数硬上限为 6(firefox 也声称是这种情况,并且两者都被标记为 wontfix)。

  • 我为不同的流数据点使用了 6 个 SSE 连接。

  • 我禁用了所有 SSE 端点,并且 GET/POST 工作得很好。然后我逐步重新启用所有SSE 端点......

  • 现在,系统与我上面提出问题时的状态完全没有变化!但是,GET 请求适用于 Chrome 和 Chromium,POST 请求适用于所有浏览器。

我了解错误的根源,并且我已将 SSE 指定为“一看到就被 websockets 取代的垃圾”。

再次感谢您抽出时间与我交谈。

“我希望我能拥抱你们所有人……但我不会”