Request被设计为进行HTTP调用的最简单方法。默认情况下,它支持HTTPS并遵循重定向。
安装request模块
npm install request
超级简单易用
const request = require('request');
request('http://www.google.com', function (error, response, body) {
console.error('error:', error); // 如果出现错误,则打印错误
console.log('statusCode:', response && response.statusCode); // 如果收到响应,则打印响应状态代码
console.log('body:', body); // 打印Google主页的HTML
});
Request还提供了诸如request.defaults和request.post之类的方法,并且有许多使用示例和几种调试技术。
Streaming流
您可以将任何流(stream)传输到文件流(file stream)。例如:进行网络爬虫的时候,有时我们需要保存图片、js、css等文件。
const request = require('request');
const fs = require('fs');
//抓取本站logo并保存到本地
request('https://static.xinran001.com/build/images/logo.png').pipe(fs.createWriteStream('b.png'))
//抓取本站css样式文件保存本地
request('https://static.xinran001.com/build/css/index.css').pipe(fs.createWriteStream('1.css'))
也可以将文件传给PUT或POST请求,用于文件上传。未提供header的情况下,会检测文件后缀名,在PUT请求中设置相应的content-type。
fs.createReadStream('pic.jpg').pipe(request.put('http://veb.com/upload'))
//读取流pipe上传
请求也可以通过管道(pipe)传输到自身。执行此操作时,内容类型和内容长度将保留在Put头中。
request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))
当收到响应(response)时,请求发出“response”事件。response参数将是http.incomingmessage的一个实例。
request
.get('http://google.com/img.png')
.on('response', function(response) {
console.log(response.statusCode) // 200
console.log(response.headers['content-type']) // 'image/png'
})
.pipe(request.put('http://mysite.com/img.png'))
要在流(streaming)处理请求时轻松处理错误,请在进行管道(pipe)连接之前侦听错误事件:
request
.get('http://mysite.com/doodle.png')
.on('error', function(err) {
console.error(err)
})
.pipe(fs.createWriteStream('doodle.png'))
现在让我们想象一下。
http.createServer(function (req, resp) {
if (req.url === '/doodle.png') {
if (req.method === 'PUT') {
req.pipe(request.put('http://mysite.com/doodle.png'))
} else if (req.method === 'GET' || req.method === 'HEAD') {
request.get('http://mysite.com/doodle.png').pipe(resp)
}
}
})
您还可以从http.serverRequest实例以及http.serverResponse实例中pipe()。将发送HTTP方法、头和实体体数据。也就是说,如果你不真正关心安全,你可以:
http.createServer(function (req, resp) {
if (req.url === '/doodle.png') {
const x = request('http://mysite.com/doodle.png')
req.pipe(x)
x.pipe(resp)
}
})
由于pipe()在≥ Node 0.5.x中返回目标流,因此您还可以执行一行代理。:)
req.pipe(request('http://mysite.com/doodle.png')).pipe(resp)
此外,这些新功能都不会与请求先前的功能冲突,它只会扩展它们。
const r = request.defaults({'proxy':'http://localproxy.com'})
http.createServer(function (req, resp) {
if (req.url === '/doodle.png') {
r.get('http://google.com/doodle.png').pipe(resp)
}
})
您仍然可以使用中间代理,请求仍将遵循HTTP转发等。