为什么解除3次往返正在做2种HTTP请求

时间:2015-02-23 16:25:02

标签: lift

我正在使用电梯3往返,我正在努力了解幕后发生的事情。

为什么有两种请求:

  • 获取comet_request
  • 在ajax_request上发布

1 个答案:

答案 0 :(得分:3)

Lift使用HTTP Long Polling对浏览器进行异步响应。我不太详细了解为什么Lift开发人员选择Long Polling而不是其他实现,比如Web Sockets,但是有充分考虑的理由,如果您有兴趣,只需快速搜索一下Lift邮件列表已被多次讨论过。

它的工作原理是浏览器向服务器发出请求,服务器保持请求打开,直到有信息要发送。当信息可用时,它会被推下管道,浏览器会对其进行处理,浏览器会启动一个新的长轮询请求。 Lift使用servlet容器的异步支持以非常少的资源消耗保持连接打开,并且因为Javascript本质上是异步的,所以等待新信息也不是浏览器的资源密集型。由于浏览器可以同时对同一个域发出请求的数量有限制,因此Lift一次只能打开其中一个长轮询连接,并且可以复用来自许多不同的响应者的响应"通过它。

最初添加了Lift的异步支持,以便服务器端事件生成的数据可以在发生时推送到客户端。随着客户端框架的普及,推送由客户端事件发起的异步数据的能力变得有用,因此增加了往返次数。我们的想法是客户端向服务器发出请求,而不是立即响应,服务器在另一个线程中执行某些操作,然后稍后发送响应(可能很多)。对于客户端API的用户,这被建模为承诺,但在幕后发生的事情是Lift收到请求并立即响应(记住,我们不能向同一域开放太多请求)但是当可用时,将通过长轮询连接流式传输满足承诺的实际数据。

那么,那就是你所看到的。您的初始请求是ajax POST,它会触发往返的开始。如果您要查看该请求返回的数据,您会发现它不是满足承诺的数据。实际的响应数据是通过Lift的长轮询机制提供的,这就是您在GET请求中看到的内容。