【问题标题】:How can I get Meteor's HTTP.call (or get) method to modify the HTTP request Headers?如何获取 Meteor 的 HTTP.call(或 get)方法来修改 HTTP 请求标头?
【发布时间】:2015-08-08 09:44:50
【问题描述】:

我正在尝试通过仅加载足够的网页内容以获取其 HTML 的 <head> 标记、获取其标题、图像和描述来加速我的 Meteor 应用程序。 我有一个客户端使用以下代码调用服务器端方法:

Meteor.call("metaGetter", url, function(err, res){...});

而在服务器端,在metaGetter 方法中,我使用的是 Meteor 的 HTTP.call:

var result = HTTP.call('GET', url, {headers: {'content-range': "bytes 0-100"}});

如 Meteor 的文档中所写。我能够得到结果的内容,html。但是,在打印返回的标头后,我没有看到我尝试设置的 content-range 属性。

编辑:Akshat 的解决方案有效,但仅适用于某些网站,实际上很少。任何帮助将不胜感激。

【问题讨论】:

  • 为什么要调用 HEAD 却要调用 GET?
  • “服务器必须忽略通过 GET 以外的请求方法接收到的 Range 标头字段” - 按照 stackoverflow.com/questions/18549051/…
  • 现在尝试这个,它不会加载网页的内容 - 我无法访问必要的标签。
  • 啊,误会了。您只需要 HTML 中的 head 标签?我认为这行不通。 GET 方法返回包含所有 html 的 content,我认为您不能只请求特定的标签...

标签: javascript meteor http-headers http-get http-range


【解决方案1】:

使用range 标头:

var result = HTTP.call('GET', url, {headers: {'range': "bytes=0-100"}});

如果使用的服务器支持内容范围,则响应应具有 content-range 标头。

当然,这需要一个支持请求范围的主机。我已经尝试了上面的代码,它确实可以在 http://www.microsoft.com 上作为 url 工作。

很遗憾,对于不支持它的网站,除了请求整个文档之外,您真的无能为力。

一个相当奇怪的替代方法是手动请求网页作为套接字,并在获得的字节数超过所需字节时切断。

【讨论】:

  • 我不太清楚 - 我更新了问题以表明我需要加载网页的内容,并想要它的 <head> 标签。
  • @forallepsilon 我已经更新了答案。您需要使用 range 标头并将其放在您的字节范围中
  • 我最初尝试使用range,但没有成功。服务器是否可能不支持内容范围?
  • @forallepsilon 是的,这可能是原因。它是什么服务器?如果它是一个普通的节点服务器(和你自己的),你可以添加中间件来支持它
  • @forallepsilon 用这个测试一下:cyberciti.biz/cloud-computing/…
【解决方案2】:

一般来说,如果你想总是获取标题,你不能有固定的限制:

  1. 某些 HTTP 服务器不支持范围标头:How can I find out whether a server supports the Range header?
  2. 您不能保证 X 字节总是包含标题。例如。它可能会在 1000 字节之后出现。

一般来说,我会获取整个 HTML 文件。在大多数体面的服务器上,这应该不到 100 毫秒。人类几乎察觉不到。如果您经常这样做,您可能希望允许并行执行服务器端方法(请参阅http://docs.meteor.com/#/full/method_unblock

如果必须优化,你可以使用以前的方法,获取 100 个字节,但如果你没有找到</title>,那么你就回退到下载整个 HTML 文件。

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 2011-04-27
    • 2015-11-26
    • 2017-02-08
    • 1970-01-01
    • 2017-11-01
    • 2016-10-22
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多