gpt4 book ai didi

javascript - 为什么在收到早期响应时,curl 会提前终止对我的服务器的 http 请求,但来自浏览器前端的 http 请求却不会?

转载 作者:行者123 更新时间:2023-12-03 01:20:23 40 4
gpt4 key购买 nike

我的 API 服务器中有一个接受文件上传的 https 路由。对上传进行一些验证,例如,如果查询参数之一无效,服务器会在消耗整个请求正文(可能非常巨大)之前拒绝上传。

当我使用curl(或来自Insomnia,我认为它只是在幕后使用curl)针对此API运行请求时,并且服务器在消耗整个主体之前返回响应,curl终止而不继续上传数据,即使它尚未发送完整的有效负载。

curl 命令:

curl --request POST \
--url 'https://api.example.com/v0/projects/38/media?filename=somethingInvalid' \
--header 'content-type: video/mp4' \
--cookie session=orMaybeIAmInvalid \
--data '<gigantic chunk of binary here>'

此过程在一秒钟内终止,服务器返回 400 并返回一些响应,例如 your stuff is bad yo。但如果查询参数有效,上传大约需要5分钟。所以这一切都按预期工作:我不想让用户等待几分钟又几分钟的 400,这根本不基于文件的内容。

相同的请求与我的前端 Web 应用程序具有相反的行为。如果我使用相同的配置运行 xmlhttprequest 请求,即使 Web 服务器已达到尝试返回 400 并且不再关心正在上传的请求正文,浏览器也会在解析该请求正文之前继续运行 5 分钟它已经收到了 400。这是为什么?

我说“它试图在哪里返回 400”,因为我不太确定底层技术在这里是如何工作的。我的网络服务器内置于 play 框架中,这一行仅返回 400:

if (stuff.isInvalid()) {
return completedFuture(badRequest("your stuff is wrong yo"));
}

但是,仔细想想,我实际上非常惊讶这对于curl 来说完全有效,因为此时请求正文尚未完全消耗。因此,尽管我问“为什么这个浏览器请求不能按照我想要的方式工作”,我也在问我需要做哪些特定的研究途径来了解这里发生的事情。

最佳答案

听起来curl在发送请求的同时检查响应,并且它注意到在完成发送请求之前已经发生了响应。这不是正常的网络服务器行为,显然它将其视为不需要完成请求。

浏览器的逻辑不同,它直到完成发送整个请求后才开始从网络读取。

当查询参数有效时,应等待post数据完全接收后再发送响应,这样curl不会终止请求。这仍然允许您异步完成处理。

关于javascript - 为什么在收到早期响应时,curl 会提前终止对我的服务器的 http 请求,但来自浏览器前端的 http 请求却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51795373/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com