52

我的问题可能听起来很愚蠢,但我只是想确定一下:

  • 是否可以在请求该资源之前发送 HTTP 响应?

例如,假设您有一个 HTML 页面index.html,该页面仅显示名为img.jpg. 现在,如果您的服务器知道访问者每次都会请求 HTML 文件,然后是 jpg 图像:

服务器是否可以在 HTML 文件之后发送图像以节省时间?

我知道 HTTP 是一个同步协议,所以理论上它不应该工作,但我只是希望有人确认(或不确认)。

4

7 回答 7

23

Jacques Mattheij最近发表的一篇文章引用了您的问题,声称尽管 HTTP 被设计为同步协议,但实现并非如此。实际上,浏览器(他没有具体说明哪个)接受尚未发送的请求的答案。

另一方面,如果您正在寻找不那么 hacky 的东西,您可以看看:

  • 允许服务器向浏览器发送内容的推送技术。取代长轮询/彗星“黑客”的现代实现是websockets。您可能还想看看socket.io
  • 或者,您可能想看看client-side routing。一些实现将其与缓存技术相结合(我相信在derby.js中)。
于 2014-06-09T15:08:10.400 回答
15

如果有人请求 /index.html,而您发送了两个响应(一个用于 /index.html,另一个用于 /img.jpg),您怎么知道收件人会收到这两个响应并知道在第二个响应之前如何处理它们请求进入?

问题不在于发送。问题在于接收器可能会收到意外数据。

另一个问题是您拒绝客户端使用 HTTP 缓存工具,如 If-Modified-Since 和 If-None-Match(即客户端可能不希望发送 /img.jpg,因为它已经有一个缓存复制)。

也就是说,您可以通过使用Comet技术来近似服务器推送的好处。但这比简单地预测传入的 HTTP 请求要复杂得多。

于 2012-09-06T02:31:51.567 回答
2

通过有效地缓存资源,您将获得更好的结果,即设置适当的缓存标头并配置您的 Web 服务器以进行缓存。如果这是一个特定问题,您还可以使用 base 64 encoding 内联图像。

您还可以查看长轮询javascript 解决方案。

于 2012-09-06T02:35:37.697 回答
1

您正在寻找服务器推送:它在 HTTP 中不可用。像 SPDY 这样的协议有它,但如果你被限制在 HTTP 上,那你就不走运了。

于 2012-09-06T02:34:39.210 回答
1

我认为不可能在同一个 HTTP 响应中混合 .html 和图像。至于“立即”发送图像数据,在第一次请求之后 - 有一个“静态资源”的概念可能会有所帮助(但它需要客户端为特定资源创建一个新的请求)。

文章中提到了一些有趣的事情。

于 2012-09-06T02:36:03.653 回答
-1

不,这是不可能的。

请求的第一行包含被请求的资源,因此除非您首先检查请求的字节(至少一行的值),否则您将不知道要响应什么。

于 2012-09-06T02:31:38.307 回答
-2

不,HTTP 被定义为请求/响应协议。一个请求:一个响应。其他任何东西都不是 HTTP,而是其他东西,您必须正确指定它并在两端完全实现它。

于 2012-09-06T10:06:35.357 回答