使用 Node.js 获取 HTTP 头

有没有一种内置的方法可以通过 node.js 获取特定地址的标题?

比如,

var headers = getUrlHeaders("http://stackoverflow.com");

会回来

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.
165723 次浏览

我不确定如何使用 Node 来实现这一点,但是总体思路是向您感兴趣的 URL 发送一个 HTTP 头请求。

请求与 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);
});
});
});

试着看看 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);
});

这个示例代码应该可以工作:

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();

使用优秀的 request模块:

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

如果您愿意,您可以将方法更改为 GET,但是如果您只想查看标题,那么使用 HEAD将使您避免获得整个响应主体。

我在使用 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);
}
}
);

这里是我的贡献,处理任何使用 http 或 https 的 URL,并使用承诺。

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)
})