繁体   English   中英

如果客户端尝试上传新文件而服务器仍在处理前一个文件,我应该返回哪个 HTTP 状态?

[英]Which HTTP status should I return if the client tries to upload a new file while server is still processing the previous one?

我的应用程序有一个允许用户上传文件的按钮。 上传文件非常快,我们非常快地向客户端发送响应,但是服务需要一段时间来处理它。

只有当前一个文件已经处理完毕时,用户才能上传一个新文件。 因此,如果用户在服务器仍在处理文件时尝试上传文件,我们应该向客户端返回错误。

我的问题是我应该使用哪种 HTTP 响应状态? 我检查了所有选项,这些是我认为更接近我的情况的选项:

  • 409 Conflict - 表示由于资源当前状态存在冲突而无法处理请求,例如多个同时更新之间的编辑冲突。
  • 425 Too Early (RFC 8470) - 表示服务器不愿意冒险处理可能被重放的请求。
  • 428 Precondition Required (RFC 6585) - 源服务器要求请求是有条件的。 旨在防止“丢失更新”问题,其中客户端获取资源的状态,修改它,并将其放回服务器,同时第三方修改了服务器上的状态,导致冲突。 [58]

你认为哪一个最适合这种情况? 或者其中任何一个,我应该使用另一个吗?

你认为哪一个最适合这种情况?

429 请求过多

429 状态码表示用户在给定时间内发送了太多请求(“速率限制”)。

响应表示应该包含解释条件的详细信息,并且可以包含一个 Retry-After 标头,指示在发出新请求之前要等待多长时间。

429 Too Many Requests
Retry-After: 60
Content-Type: text/plain

Why don't you wait a minute?

为什么我不提倡您推荐的任何代码:

425 太早了; 我会避免这个,因为它似乎特定于早期数据的上下文。

428 需要先决条件; 这里的核心问题是如何与通用客户端进行通信,请求中应包含哪个先决条件。 此外,从语义上讲,它有点偏离。

409 冲突; 在实践中,您也许可以使这一项工作。 从语义上讲,困难在于客户端确实没有办法解决冲突(例如:重新加载页面以获取服务器资源副本的新副本)。


需要认识到的重要一点是,HTTP 状态代码只是对人类来说是偶然的。 状态码是网络文档传输域的元数据; 目标受众是通用 HTTP 组件(浏览器、蜘蛛、缓存、代理等)。

因此,要使用的“最佳”代码将是告诉通用组件正确事情的代码。 专业化发生在响应正文中,我们使用有效负载来传达细粒度的细节。

您如何接收请求并将其放入队列中。 为您的队列创建一个消费者,以便在前一个完成之前无法处理任何请求。 这样,无论当前状态如何,您都可以只接受来自客户的请求,并且只返回一个标准的确认响应 - 200 或您在成功时发送的任何响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM