Request简化的HTTP客户端Streaming流学习

2019-08-22131次阅读node

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转发等。

上一篇: ES2019新特性  下一篇: Request简化的HTTP客户端Forms学习  

Request简化的HTTP客户端Streaming流学习相关文章