简单的http客户端通讯对比程序
本小节将通过对比不同的http请求发起者的不同使用方式,来一一对比分析不同方式的请求的区别,从而来指引向更好的
superagent
库靠拢!!
要实现以下的效果
执行一程序,该程序接收一命令参数,通过该参数去获取对应的图片列表功能,如下图所示:
要实现这个过程,简单对这个进行一个流程的分析:
- 创建一客户端,发起get请求;
- 设置请求所需的header以及传递的参数;
- 拿到响应后的数据,对数据进行解析;
- 提取关键元素,输出并结束
针对这个场景,抽离公共的不变的部分:
const https = require('node:https');
const searchKey = process.argv.slice(2).join(' ').trim();
if(!searchKey.length){
return console.info('请输入搜索关键词');
}
console.info(`您将要搜素的关键词是:${searchKey}`);
然后剩余的部分用不同的方式来实现这个过程
原始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();
首先,利用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`);
});
})
})
与第一种方式不同的是,第二种方式采用了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`);
});
});
superagent
库提供了一系列方便用户快速进行网络配置话请求的流程,所有的数据的追加,都通过方法的方式,来直接补充,而且每一个方法,定义是那个都比较清晰,而且自带content-type/application-json
默认解析模式,
同时也提供了基于异步的同时调用方式,与promise完美结合到了一起!!
关于对该库的使用,具体见官方文档