我的问题可能听起来很愚蠢,但我只是想确定一下:
- 是否可以在请求该资源之前发送 HTTP 响应?
例如,假设您有一个 HTML 页面index.html
,该页面仅显示名为img.jpg
. 现在,如果您的服务器知道访问者每次都会请求 HTML 文件,然后是 jpg 图像:
服务器是否可以在 HTML 文件之后发送图像以节省时间?
我知道 HTTP 是一个同步协议,所以理论上它不应该工作,但我只是希望有人确认(或不确认)。
我的问题可能听起来很愚蠢,但我只是想确定一下:
例如,假设您有一个 HTML 页面index.html
,该页面仅显示名为img.jpg
. 现在,如果您的服务器知道访问者每次都会请求 HTML 文件,然后是 jpg 图像:
服务器是否可以在 HTML 文件之后发送图像以节省时间?
我知道 HTTP 是一个同步协议,所以理论上它不应该工作,但我只是希望有人确认(或不确认)。
Jacques Mattheij最近发表的一篇文章引用了您的问题,声称尽管 HTTP 被设计为同步协议,但实现并非如此。实际上,浏览器(他没有具体说明哪个)接受尚未发送的请求的答案。
另一方面,如果您正在寻找不那么 hacky 的东西,您可以看看:
如果有人请求 /index.html,而您发送了两个响应(一个用于 /index.html,另一个用于 /img.jpg),您怎么知道收件人会收到这两个响应并知道在第二个响应之前如何处理它们请求进入?
问题不在于发送。问题在于接收器可能会收到意外数据。
另一个问题是您拒绝客户端使用 HTTP 缓存工具,如 If-Modified-Since 和 If-None-Match(即客户端可能不希望发送 /img.jpg,因为它已经有一个缓存复制)。
也就是说,您可以通过使用Comet技术来近似服务器推送的好处。但这比简单地预测传入的 HTTP 请求要复杂得多。
通过有效地缓存资源,您将获得更好的结果,即设置适当的缓存标头并配置您的 Web 服务器以进行缓存。如果这是一个特定问题,您还可以使用 base 64 encoding 内联图像。
您还可以查看长轮询javascript 解决方案。
您正在寻找服务器推送:它在 HTTP 中不可用。像 SPDY 这样的协议有它,但如果你被限制在 HTTP 上,那你就不走运了。
我认为不可能在同一个 HTTP 响应中混合 .html 和图像。至于“立即”发送图像数据,在第一次请求之后 - 有一个“静态资源”的概念可能会有所帮助(但它需要客户端为特定资源创建一个新的请求)。
文章中提到了一些有趣的事情。
不,这是不可能的。
请求的第一行包含被请求的资源,因此除非您首先检查请求的字节(至少一行的值),否则您将不知道要响应什么。
不,HTTP 被定义为请求/响应协议。一个请求:一个响应。其他任何东西都不是 HTTP,而是其他东西,您必须正确指定它并在两端完全实现它。