我偶然发现了一个对端点的请求可能需要超过 60 秒(假设这是超时值)的情况,在这种情况下,服务器会发送响应并继续在后台处理请求。在某些情况下,相同的请求会在超时之前被处理,并且成功的响应会从服务器发送到客户端。
在第一种情况下使用的最佳 HTTP 代码是什么?我读了HTTP 服务器超时。何时发送,建议 503 或 504,以及HTTP 状态代码 'Loading',其中提到请求可以被视为成功并返回 200。但我不相信这些建议中的任何一个比其他建议更.
我偶然发现了一个对端点的请求可能需要超过 60 秒(假设这是超时值)的情况,在这种情况下,服务器会发送响应并继续在后台处理请求。在某些情况下,相同的请求会在超时之前被处理,并且成功的响应会从服务器发送到客户端。
在第一种情况下使用的最佳 HTTP 代码是什么?我读了HTTP 服务器超时。何时发送,建议 503 或 504,以及HTTP 状态代码 'Loading',其中提到请求可以被视为成功并返回 200。但我不相信这些建议中的任何一个比其他建议更.
所以从你的问题和评论中总结一下:你有一个 HTTP API,它接受一个命令并执行它,并通过一个 webhook 发送一个回调回复。如果执行时间超过一分钟,您必须发送某种形式的回复,表明请求仍在处理中。
在 HTTP 请求处理程序中执行长时间运行的工作存在各种问题。对于初学者,您在处理非 HTTP 工作时占用了 HTTP 服务器资源(线程、套接字),您无法在不丢失工作的情况下重新启动 HTTP 服务器,等等。
所以我会选择一种排队机制来处理工作,立即回复 200 OK 或 201 Created,然后将工作安排在后台线程甚至不同的服务上进行处理。完成后,您将执行 webhook 回调。
对初始调用的任何错误响应都会使调用者感到困惑:他们不知道他们请求的工作是否会完成,除非您使用与实际错误条件实际上不同的“异国情调”状态代码,并记录他们可以预期的情况。
不
HTTP 协议不能那样工作。
服务器将接收请求,处理它并发送回复。循环到此结束。
HTTP 从不打算发送具有不同状态的多阶段回复。如果您想这样做,您需要使用构建在 HTTP 之上的自定义协议。
发送超时错误作为未完成响应的指示是一种反模式。如果您的服务器处理请求的时间比平时多,您应该发送带有 ID 的成功响应,该 ID 可用于轮询初始请求的状态并获取结果。
Charlie 和 CodeCaster 建议返回 200 或 201,我查看了其他 2xx 代码,发现 202 Accepted:
来自https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
超文本传输协议 (HTTP) 202 Accepted 响应状态码表示请求已被接受处理,但处理尚未完成;事实上,处理可能还没有开始。该请求最终可能会或可能不会被执行,因为在实际进行处理时它可能会被禁止。
202 是非承诺的,这意味着 HTTP 无法稍后发送异步响应来指示处理请求的结果。它适用于另一个进程或服务器处理请求或批处理的情况。
我想知道这是否最合适。