如何确保 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).
因为@tarun-lalwani 已经编写了不是为此设计的 http 协议。你可以做的是让应用程序创建一个文件,你的程序在 200 响应后检查远程文件的存在和时间。这意味着每 200 个响应都需要另一个请求来检查文件
使用 HTTP 是不可能的,如果出于某种原因您不能使用套接字,因为您的实现需要 HTTP(如 API),您必须与您的客户端确认超时策略。
这取决于您要处理多少个案子,但是例如您可以这样说:
- 客户端生成内部标识符并发送 HTTP 请求,在 Headers 或 Body 参数中包含 "ClientID"(如时间戳或随机数)。
- 服务器响应200 OK(或错误,无所谓)
- 客户端等待服务器响应 60 秒(您定义最大超时时间)。
- 如果收到响应,处理并完成。
- 如果没有收到答案,请在超时后重试,包括在步骤 1 中生成的相同 "ClientID"。
- 服务器检测到 "ClientID" 已经收到。
- 或者return 409冲突通知"Already exists"客户端应该知道如何处理。
- 或者只是 return 200 OK 并且客户不知道它是第一次收到。
同样,这在很大程度上取决于您的业务/技术要求。因为您甚至可以获得两个或更多个连续的超时句柄循环。
希望你有一个想法。
要响应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).
因为@tarun-lalwani 已经编写了不是为此设计的 http 协议。你可以做的是让应用程序创建一个文件,你的程序在 200 响应后检查远程文件的存在和时间。这意味着每 200 个响应都需要另一个请求来检查文件
使用 HTTP 是不可能的,如果出于某种原因您不能使用套接字,因为您的实现需要 HTTP(如 API),您必须与您的客户端确认超时策略。
这取决于您要处理多少个案子,但是例如您可以这样说:
- 客户端生成内部标识符并发送 HTTP 请求,在 Headers 或 Body 参数中包含 "ClientID"(如时间戳或随机数)。
- 服务器响应200 OK(或错误,无所谓)
- 客户端等待服务器响应 60 秒(您定义最大超时时间)。
- 如果收到响应,处理并完成。
- 如果没有收到答案,请在超时后重试,包括在步骤 1 中生成的相同 "ClientID"。
- 服务器检测到 "ClientID" 已经收到。
- 或者return 409冲突通知"Already exists"客户端应该知道如何处理。
- 或者只是 return 200 OK 并且客户不知道它是第一次收到。
- 服务器检测到 "ClientID" 已经收到。
同样,这在很大程度上取决于您的业务/技术要求。因为您甚至可以获得两个或更多个连续的超时句柄循环。
希望你有一个想法。