如何确保http响应已交付?

时间:2018-03-23 07:47:39

标签: cherrypy

要回复http请求,我们只需使用return" content"在方法函数中。

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

4 个答案:

答案 0 :(得分:10)

HTTP协议无法正常运行。如果您需要确认,则需要客户端向您发送确认。

或者您应该考虑实现双向套接字(示例库为socket.io),客户端可以在其中发送ACK。如果它是关键任务,那么请不要仅仅http使用websockets

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

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

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

然后客户再次拨打电话

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

因此服务器会知道客户端已经确认了给定的响应。但是你不能强制执行自动确认,它仍然在客户端发送它,如果它们没有,你就无法知道

PS:UUID在这里不是实际的UUID,只是例如作为随机数共享

答案 1 :(得分:1)

看看微软asynchronous server socket

  

异步服务器套接字需要一种方法来开始接受来自网络的连接请求,一种回调方法来处理连接请求并开始从网络接收数据,一种回调方法来结束接收数据(这是您的客户端可以响应所做的HTTP请求的成功或失败

Example

答案 2 :(得分:1)

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

这取决于你想要处理的案件数量,但是例如你可以陈述这样的事情:

  1. 客户端生成内部标识符并发送HTTP请求,包括" ClientID" (如时间戳或随机数)在标题中或作为Body参数。
  2. 服务器响应200 OK(或错误,无所谓)
  3. 客户端等待服务器应答60秒(您定义最大超时)。
    1. 如果收到回复,请处理并完成。
    2. 如果没有收到答案,请在超时后重试,包括相同的" ClientID"在步骤1中生成。
      1. 服务器检测到" ClientID"已经收到了。
        • 返回409冲突,通知它已经存在"已经存在"并且客户应该知道如何处理它。
        • 或者只返回200 OK,客户从未知道它是第一次收到。
  4. 同样,这在很大程度上取决于您的业务/技术要求。因为您甚至可以获得两个或更多连续的超时句柄循环。

    希望你有个主意。

答案 3 :(得分:0)

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