使用node.js获取HTTP标头

los*_*rce 64 node.js

是否有通过node.js获取特定地址标头的内置方法?

就像是,

var headers = getUrlHeaders("http://stackoverflow.com");
Run Code Online (Sandbox Code Playgroud)

会回来的

HTTP/1.1 200 OK.
Cache-Control: public, max-age=60.
Content-Type: text/html; charset=utf-8.
Content-Encoding: gzip.
Expires: Sat, 07 May 2011 17:32:38 GMT.
Last-Modified: Sat, 07 May 2011 17:31:38 GMT.
Vary: *.
Date: Sat, 07 May 2011 17:31:37 GMT.
Content-Length: 32516.
Run Code Online (Sandbox Code Playgroud)

cle*_*lee 129

此示例代码应该工作:

var http = require('http');
var options = {method: 'HEAD', host: 'stackoverflow.com', port: 80, path: '/'};
var req = http.request(options, function(res) {
    console.log(JSON.stringify(res.headers));
  }
);
req.end();
Run Code Online (Sandbox Code Playgroud)

  • 您可能注意到,这(根据服务器和你正在试图获得头字段),你可能真的需要一个"全" GET请求,如某些服务器不包括某些头字段,如`设置cookie`,在HEAD请求的回复中. (3认同)

yoj*_*o87 22

尝试查看http.get响应标头.

var http = require("http");

var options = {
  host: 'stackoverflow.com',
  port: 80,
  path: '/'
};

http.get(options, function(res) {
  console.log("Got response: " + res.statusCode);

  for(var item in res.headers) {
    console.log(item + ": " + res.headers[item]);
  }
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});
Run Code Online (Sandbox Code Playgroud)

  • 这可能适用于小文件,但如果您不打算对数据主体执行任何操作,则最好使用HTTP HEAD. (22认同)

Nem*_*emo 18

使用优秀的request模块:

var request = require('request');
  request("http://stackoverflow.com", {method: 'HEAD'}, function (err, res, body){
  console.log(res.headers);
});
Run Code Online (Sandbox Code Playgroud)

GET如果您愿意,可以将方法更改为,但HEAD如果您只想查看标题,使用将使您无法获取整个响应正文.

  • 这将获得整个身体!想象一下,您希望标题决定是否要获取网址内容或超出大小限制.这3行为5 MB PDF将下载整个pdf正文然后它将显示标题!如名称所示,标题必须位于开头而不是操作结束时.我忘了提到你可以在url之后轻松添加{method:'HEAD'}作为选项并获得标题. (3认同)
  • 不适用于这种特殊情况,但请求每天下载50万次.它支持流媒体,所有形式的身份验证,并具有更多功能. (3认同)

Mat*_*all 7

我不确定如何使用Node,但一般的想法是将HTTP HEAD请求发送到您感兴趣的URL.

要求响应与对应于GET请求的响应相同,但没有响应主体.这对于检索在响应头中编写的元信息非常有用,而无需传输整个内容.


这样的事情,基于这个问题:

var cli = require('cli');
var http = require('http');
var url = require('url');

cli.parse();

cli.main(function(args, opts) {
        this.debug(args[0]);

        var siteUrl = url.parse(args[0]);
        var site = http.createClient(80, siteUrl.host);
        console.log(siteUrl);

        var request = site.request('HEAD', siteUrl.pathname, {'host' : siteUrl.host})
        request.end();

        request.on('response', function(response) {
                response.setEncoding('utf8');
                console.log('STATUS: ' + response.statusCode);
                response.on('data', function(chunk) {
                        console.log("DATA: " + chunk);
                });
        });
});
Run Code Online (Sandbox Code Playgroud)


Fra*_*oth 7

我遇到了一些问题http.get; 所以我切换到了lib request:

var request = require('request');

var url = 'http://blog.mynotiz.de/';

var options = {
    url: url,
    method: 'HEAD'
};

request(options, function (error, response, body) {
        if (error) {
            return console.error('upload failed:', error);
        }

        if (response.headers['content-length']) {
            var file_size = response.headers['content-length'];
            console.log(file_size);
        }
    }
);
Run Code Online (Sandbox Code Playgroud)


Dir*_*nry 6

这是我的贡献,它使用http或https处理任何URL,并使用Promises.

const http = require('http')
const https = require('https')
const url = require('url')

function getHeaders(myURL) {
  const parsedURL = url.parse(myURL)
  const options = {
    protocol: parsedURL.protocol,
    hostname: parsedURL.hostname,
    method: 'HEAD',
    path: parsedURL.path
  }
  let protocolHandler = (parsedURL.protocol === 'https:' ? https : http)

  return new Promise((resolve, reject) => {
    let req = protocolHandler.request(options, (res) => {
      resolve(res.headers)
    })
    req.on('error', (e) => {
      reject(e)
    })
    req.end()
  })
}

getHeaders(myURL).then((headers) => {
  console.log(headers)
})
Run Code Online (Sandbox Code Playgroud)