请求之前的HTTP响应

时间:2012-09-06 02:25:52

标签: http networking tcp comet

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

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

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

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

我知道HTTP是一种同步协议,所以理论上它不应该工作,但我只是想让某人确认(或不是)。

7 个答案:

答案 0 :(得分:23)

最近post by Jacques Mattheij引用了您的问题,声称尽管HTTP是作为同步协议设计的,但实现却没有。在实践中,浏览器(他没有确切地指定哪个)接受请求的答案尚未发送。

另一方面,如果你想要的东西不那么hacky,你可以看看:

  • 推送允许服务器将内容发送到浏览器的技术。现代实施取代长轮询/彗星" hacks"是websockets。您可能还想查看socket.io
  • 或者您可以查看client-side routing。有些实现将此与缓存技术相结合(例如我相信derby.js)。

答案 1 :(得分:15)

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

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

另一个问题是你否认客户端能够使用If-Modified-Since和If-None-Match等HTTP缓存工具(即客户端可能不希望发送/img.jpg,因为它已经发送有一个缓存副本。)

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

答案 2 :(得分:2)

通过有效缓存资源,即设置proper cache headers并配置Web服务器进行缓存,您将获得更好的结果。如果这是特定问题,您也可以inline images using base 64 encoding

您还可以查看long polling javascript解决方案。

答案 3 :(得分:1)

您正在寻找server push:它在HTTP中不可用。像SPDY这样的协议有它,但是如果你被限制在HTTP,你就不走运了。

答案 4 :(得分:1)

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

article中提到了几件有趣的事情。

答案 5 :(得分:-1)

不,这是不可能的。

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

答案 6 :(得分:-2)

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