如何确保 http 响应已送达?

how to make sure the http response was delivered?

要响应http请求,我们可以在方法函数中使用return "content"。

但对于一些关键任务用例,我想确保 http 已发送 200 OK 响应。有什么想法吗?

HTTP 协议不是那样工作的。如果您需要确认,则需要客户将确认发送给您。

或者您应该考虑实现一个 bi-direction 套接字(示例库是 socket.io),客户端可以在其中发送 ACK。如果它是关键任务,那么不要让它只打开 http,使用 websockets

您还可以使用 AJAX 回调来收集确认。创建此类解决方案的一种方法是为每个请求生成 UUID 并作为 header

的一部分返回
$ curl -v http://domain/url
....
response:

X-ACK-Token: 89080-3e432423-234234-23-42323

然后客户再次拨打电话

$ curl http://domain/ack/89080-3e432423-234234-23-42323

因此服务器会知道给定的响应已被客户端确认。但是你不能强制自动ACK,它仍然在客户端发送它,如果他们不这样做,你无从得知

PS:这里的UUID并不是真正的UUID,只是作为随机数共享的例子

看看微软的asynchronous server socket

An asynchronous server socket requires a method to begin accepting connection requests from the network, a callback method to handle the connection requests and begin receiving data from the network, and a callback method to end receiving the data (this is where your client could respond with the success or failure of the HTTP request that was made).

Example

因为@tarun-lalwani 已经编写了不是为此设计的 http 协议。你可以做的是让应用程序创建一个文件,你的程序在 200 响应后检查远程文件的存在和时间。这意味着每 200 个响应都需要另一个请求来检查文件

使用 HTTP 是不可能的,如果出于某种原因您不能使用套接字,因为您的实现需要 HTTP(如 API),您必须与您的客户端确认超时策略。

这取决于您要处理多少个案子,但是例如您可以这样说:

  1. 客户端生成内部标识符并发送 HTTP 请求,在 Headers 或 Body 参数中包含 "ClientID"(如时间戳或随机数)。
  2. 服务器响应200 OK(或错误,无所谓)
  3. 客户端等待服务器响应 60 秒(您定义最大超时时间)。
    1. 如果收到响应,处理并完成。
    2. 如果没有收到答案,请在超时后重试,包括在步骤 1 中生成的相同 "ClientID"。
      1. 服务器检测到 "ClientID" 已经收到。
        • 或者return 409冲突通知"Already exists"客户端应该知道如何处理。
        • 或者只是 return 200 OK 并且客户不知道它是第一次收到。

同样,这在很大程度上取决于您的业务/技术要求。因为您甚至可以获得两个或更多个连续的超时句柄循环。

希望你有一个想法。