简单的http客户端通讯对比程序

本小节将通过对比不同的http请求发起者的不同使用方式,来一一对比分析不同方式的请求的区别,从而来指引向更好的superagent库靠拢!!

要实现以下的效果

执行一程序,该程序接收一命令参数,通过该参数去获取对应的图片列表功能,如下图所示: http客户端简易使用

要实现这个过程,简单对这个进行一个流程的分析:

  1. 创建一客户端,发起get请求;
  2. 设置请求所需的header以及传递的参数;
  3. 拿到响应后的数据,对数据进行解析;
  4. 提取关键元素,输出并结束

:stars: 针对这个场景,抽离公共的不变的部分:

const https = require('node:https');
const searchKey = process.argv.slice(2).join(' ').trim();
if(!searchKey.length){
  return console.info('请输入搜索关键词');
}
console.info(`您将要搜素的关键词是:${searchKey}`);

:point_down: 然后剩余的部分用不同的方式来实现这个过程

原始request方式发起的请求

https.request({
  host: 'api.pexels.com',
  port: 443,
  method: 'get',
  path: `/v1/search?query=${searchKey}&per_page=2`,
  headers: {
    Authorization: '563492ad6f917000010000017f9ad271a98442cb869adde6499770de'
  }
}, res => {
  let body = '';
  res.setEncoding('utf-8');
  res.on('data', chunk => {
    body += chunk;
  });
  res.on('end', () => {
    let obj = JSON.parse(body);
    obj.photos.forEach((item, index) => {
      console.info(`\t\t第${index + 1}张图片`);
      console.info(`\t图片拥有者:${item.photographer}\n`);
      console.info(`\t图片描述:${item.alt}\n`);
      console.info(`\t图片地址:${item.src.original}\n`);
    });
  })
}).end();

:trollface: 首先,利用https.request方法,来创建一请求,并发起该请求,然后,通过监听该请求回调方法中的对象的data以及end方法,data方法完成数据的读取,而end代表完成读取数据时的回调,通过临时中间变量body, 缓存读取到的数据字符串,并对该字符串进行解析成为一JSON对象,然后直接获取其中的相关元素的数据!!

替换为https.get来发起的请求

https.get({
  host: 'api.pexels.com',
  port: 443,
  method: 'get',
  path: `/v1/search?query=${searchKey}&per_page=2`,
  headers: {
    Authorization: '563492ad6f917000010000017f9ad271a98442cb869adde6499770de'
  }
}, res => {
  let body = '';
  res.setEncoding('utf-8');
  res.on('data', chunk => {
    body += chunk;
  });
  res.on('end', () => {
    let obj = JSON.parse(body);
    obj.photos.forEach((item, index) => {
      console.info(`\t\t第${index + 1}张图片`);
      console.info(`\t图片拥有者:${item.photographer}\n`);
      console.info(`\t图片描述:${item.alt}\n`);
      console.info(`\t图片地址:${item.src.original}\n`);
    });
  })
})

:trollface: 与第一种方式不同的是,第二种方式采用了https.get方法,来发起的请求,而且在发起的同时无需显式地调用end方法,而是直接就解析了!!

升级为superagent库的使用

const request = require('superagent');
request.get(`https://api.pexels.com/v1/search?query=${searchKey}&per_page=2`)
        .set('Authorization', '563492ad6f917000010000017f9ad271a98442cb869adde6499770de')
        .then(res => {
          // console.info(res.body);
          res.body.photos.forEach((item, index) => {
            console.info(`\t\t第${index + 1}张图片`);
            console.info(`\t图片拥有者:${item.photographer}\n`);
            console.info(`\t图片描述:${item.alt}\n`);
            console.info(`\t图片地址:${item.src.original}\n`);
          });
        });

:trollface: superagent库提供了一系列方便用户快速进行网络配置话请求的流程,所有的数据的追加,都通过方法的方式,来直接补充,而且每一个方法,定义是那个都比较清晰,而且自带content-type/application-json默认解析模式, 同时也提供了基于异步的同时调用方式,与promise完美结合到了一起!! 关于对该库的使用,具体见官方文档

results matching ""

    No results matching ""