这里来介绍一个Node.js的模块——request。有了这个模块,http请求变的超简单。
流:
反过来,也可以将文件传给PUT或POST请求。未提供header的情况下,会检测文件后缀名,在PUT请求中设置相应的content-type。
fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) 请求也可以pipe给自己。这种情况下会保留原content-type和content-length。
request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))
表单:
request支持application/x-www-form-urlencoded和multipart/form-data实现表单上传。
x-www-form-urlencoded很简单:
或者:
使用multipart/form-data不用操心设置header之类的琐事,request会帮你解决。
HTTP认证:
或
sendImmediately,默认为真,发送一个基本的认证header。设为false之后,收到401会重试(服务器的401响应必须包含WWW-Authenticate指定认证方法)。
sendImmediately为真时支持Digest认证。
OAuth登录:
定制HTTP header
User-Agent之类可以在options对象中设置。在下面的例子中,我们调用github API找出某仓库的收藏数和派生数。我们使用了定制的User-Agent和https.
url: 'https://api.github.com/repos/mikeal/request',headers: {
'User-Agent': 'request'
}
};
function callback(error,body) {
if (!error && response.statusCode == 200) {
var info = JSON.parse(body);
console.log(info.stargazers_count +"Stars");
console.log(info.forks_count +"Forks");
}
}
request(options,callback);
cookies:
默认情况下,cookies是禁用的。在defaults或options将jar设为true,使后续的请求都使用cookie.
通过创建request.jar()的新实例,可以使用定制的cookie,而不是request全局的cookie jar。
或者
注意,setCookie至少需要三个参数,最后一个是回调函数。
更多使用方法和说明可点击这里继续阅读:https://github.com/mikeal/request/
示例
这里写了一个很简单的示例,用来抓取去哪儿网的酒店查询数据(获取酒店某一时间段内各房型的价格排名):
<div class="jb51code">
<pre class="brush:js;">
var request = require('request'),fs = require('fs');
var reqUrl = 'http://hotel.qunar.com/price/detail.jsp?fromDate=2012-08-18&toDate=2012-08-19&cityurl=shanghai_city&HotelSEQ=shanghai_city_2856&cn=5';
request({uri:reqUrl},function(err,body) {
//console.log(response.statusCode);
//console.log(response);
//如果数据量比较大,就需要对返回的数据根据日期、酒店ID进行存储,如果获取数据进行对比的时候直接读文件
var filePath = __dirname + '/data/data.js';
if (fs.exists(filePath)) {
fs.unlinkSync(filePath);
console.log('Del file ' + filePath);
}
fs.writeFile(filePath,body,'utf8',function(err) {
if (err) {
throw err;
}
console.log('Save ' + filePath + ' ok~');
});
console.log('Fetch ' + reqUrl + ' ok~');
});