Node.js發(fā)起HTTP請(qǐng)求的6種不同方法小結(jié)
介紹
本期將向大家介紹6種不同的方法在node.js中去發(fā)起HTTP請(qǐng)求,這里我們會(huì)通過對(duì)掘金社區(qū)的板塊分類接口 的請(qǐng)求作為演示來完成這個(gè)每種不同方法的使用,當(dāng)然為了更清晰的打印出所得到的數(shù)據(jù),我們要提前安裝chalk庫(kù)來給其打印的數(shù)據(jù)加上顏色,好了,我們馬上就要開始啦~
正文
Node.js HTTPS Module
Node.js在標(biāo)準(zhǔn)庫(kù)中帶有https模塊,所以你根本不需要引入任何庫(kù)去發(fā)起請(qǐng)求,因?yàn)閚ode.js本身就可以完成,處理一些簡(jiǎn)單的數(shù)據(jù)請(qǐng)求也是綽綽有余了。
const chalk = require("chalk")
const https = require('https')
https.get('https://api.juejin.cn/tag_api/v1/query_category_briefs', res => {
let list = [];
res.on('data', chunk => {
list.push(chunk);
});
res.on('end', () => {
const { data } = JSON.parse(Buffer.concat(list).toString());
data.forEach(item => {
console.log(`${chalk.yellow.bold(item.rank)}.${chalk.green(item.category_name)}`);
})
});
}).on('error', err => {
console.log('Error: ', err.message);
});從結(jié)構(gòu)上有些許復(fù)雜,因?yàn)槲覀円粋€(gè)空數(shù)組list來存儲(chǔ)請(qǐng)求數(shù)據(jù)塊chunk,然后在請(qǐng)求結(jié)束后還要通過Buffer處理數(shù)據(jù)再解析成json格式。

Axios
相信前端的小伙伴對(duì)axios并不陌生,它是一個(gè)非常流行且受歡迎的Promise式請(qǐng)求庫(kù)。它既可以瀏覽器端使用可以在客戶端使用它,而且眾所周知,它還有著攔截器,數(shù)據(jù)自動(dòng)轉(zhuǎn)換json等十分方便的功能。
我們可以使用以下命令安裝axios:
npm i -S axios
下面是我們通過axios獲取掘金板塊分類簡(jiǎn)單示例:
const chalk = require("chalk")
const axios = require('axios');
axios.get('https://api.juejin.cn/tag_api/v1/query_category_briefs')
.then(res => {
const { data } = res.data
data.forEach(item => {
console.log(`${chalk.yellow.bold(item.rank)}.${chalk.green(item.category_name)}`);
})
})
.catch(err => {
console.log('Error: ', err.message);
});這里axios直接用get請(qǐng)求請(qǐng)求接口,可以結(jié)構(gòu)也是promise形式的,數(shù)據(jù)自動(dòng)幫你解析成json,可以說是非常的簡(jiǎn)潔與方便。

Got
got聲稱是“一個(gè)人性化且功能強(qiáng)大的 Node.js HTTP 請(qǐng)求庫(kù)”,人性化在于它用了Promise式的API與對(duì)JOSN做處理配置等功能,而一些如HTTP2的支持,分頁(yè)式API以及RFC的緩存等能力是大多數(shù)請(qǐng)求庫(kù)所不具備的。
我們可以使用以下命令安裝got:
npm i -S got@10.7.0
下面是我們通過got獲取掘金板塊分類簡(jiǎn)單示例:
const chalk = require("chalk")
const got = require('got');
got.get('https://api.juejin.cn/tag_api/v1/query_category_briefs', {
responseType: 'json'
})
.then(res => {
const { data } = res.body
data.forEach(item => {
console.log(`${chalk.yellow.bold(item.rank)}.${chalk.green(item.category_name)}`);
})
})
.catch(err => {
console.log('Error: ', err.message);
});這里我們先要對(duì)請(qǐng)求接口進(jìn)行{responseType: 'json'}的配置,然后返回的數(shù)據(jù)可以在body里拿到了,也是十分的好用。

Needle
needle是一個(gè)比較簡(jiǎn)潔小巧的請(qǐng)求庫(kù),它的形式可以是Promise的方式也可以是回調(diào)函數(shù)的方式,看自己的習(xí)慣選用,而且它的返回值會(huì)對(duì)XML與JSON自動(dòng)做出轉(zhuǎn)換,也是非常的方便。
我們可以使用以下命令安裝needle:
npm i -S needle
下面是我們通過needle獲取掘金板塊分類簡(jiǎn)單示例:
const chalk = require("chalk")
const needle = require('needle');
needle.get('https://api.juejin.cn/tag_api/v1/query_category_briefs', (err, res) => {
if (err) return console.log('Error: ', err.message);
const { data } = res.body
data.forEach(item => {
console.log(`${chalk.yellow.bold(item.rank)}.${chalk.green(item.category_name)}`);
})
})這里我們演示的用了回調(diào)函數(shù)的方式來展示,可以看出返回有err與res,成功時(shí)err為null,成功后返回的res的body里就是所要請(qǐng)求的數(shù)據(jù),這里是幫你自動(dòng)轉(zhuǎn)化好的json格式。

如果你想使用Promise的方式,可以這么去寫:
needle('get', 'https://api.juejin.cn/tag_api/v1/query_category_briefs')
.then(function(res) {
// ...
})
.catch(function(err) {
// ...
});Superagent
請(qǐng)求庫(kù)superagent發(fā)布時(shí)間可謂是相當(dāng)?shù)脑缌丝梢宰匪莸?011年,但它是漸進(jìn)式客戶端 HTTP 請(qǐng)求庫(kù),與具有相同 API 的 Node.js 模塊,支持許多高級(jí) HTTP 客戶端功能,依舊是十分的好用。
我們可以使用以下命令安裝superagent:
npm i -S superagent
下面是我們通過superagent獲取掘金板塊分類簡(jiǎn)單示例:
const chalk = require("chalk")
const superagent = require('superagent');
superagent.get('https://api.juejin.cn/tag_api/v1/query_category_briefs')
.then(res => {
const { data } = JSON.parse(res.text)
data.forEach(item => {
console.log(`${chalk.yellow.bold(item.rank)}.${chalk.green(item.category_name)}`);
})
})
.catch(err => {
console.log('Error: ', err.message);
});現(xiàn)在的superagent用法與axios十分的相似,但是需要去自己把數(shù)據(jù)處理成json格式。

Node-fetch
顧名思義,這個(gè)請(qǐng)求庫(kù)它的api與window.fetch保持了一致,也是promise式的。最近非常受歡迎,但可能最大的問題是,它的v2與v3版差異比較大,v2保持著cjs標(biāo)準(zhǔn),而v3則用了ejs的方式,升級(jí)后可能造成一些困擾,所以為了統(tǒng)一這個(gè)標(biāo)準(zhǔn)我們這里用了2.6.7版作為演示版本。
我們可以使用以下命令安裝node-fetch:
npm i -S node-fetch@2.6.7
下面是我們通過node-fetch獲取掘金板塊分類簡(jiǎn)單示例:
const chalk = require("chalk")
const fetch = require("node-fetch")
fetch('https://api.juejin.cn/tag_api/v1/query_category_briefs', {
method: 'GET'
})
.then(async res => {
let { data } = await res.json()
data.forEach(item => {
console.log(`${chalk.yellow.bold(item.rank)}.${chalk.green(item.category_name)}`);
})
})
.catch(err => {
console.log('Error: ', err.message);
});可以看出它與window.fetch用起來完全一樣,沒有任何學(xué)習(xí)壓力。

對(duì)比
接下來我們看一下關(guān)于這幾款請(qǐng)求庫(kù)近一年的下載量趨勢(shì)圖:

現(xiàn)在我們可以發(fā)現(xiàn),就下載量而言,在過去一年中,node-fetch 最受歡迎,needle 最不受歡迎。
| Stars | Version | Unpacked Size | Created Years | |
|---|---|---|---|---|
| axios | 91,642 | 0.26.1 | 398 kB | 2014 |
| got | 10,736 | 12.0.1 | 244 kB | 2014 |
| needle | 1,446 | 3.0.0 | 227 kB | 2012 |
| superagent | 15,928 | 7.1.1 | 581 kB | 2011 |
| node-fetch | 7,434 | 3.2.3 | 106 kB | 2015 |
這里我們又統(tǒng)計(jì)了這幾個(gè)庫(kù)的其他一些數(shù)據(jù),axios的star數(shù)量可謂一騎絕塵,遠(yuǎn)遠(yuǎn)超過其他幾個(gè)庫(kù)。
結(jié)語(yǔ)
這些請(qǐng)求庫(kù),他們都做了同一件事都可以發(fā)起HTTP請(qǐng)求,或許寫法會(huì)有些許不同,但都是條條大路通羅馬。就個(gè)人而言,也可能是經(jīng)常寫瀏覽器端的緣故,所以是axios的忠實(shí)用戶,不管是練習(xí)還是開發(fā)axios都是首選,當(dāng)然node-fetch也越來越收到關(guān)注,包也十分的小,練習(xí)的時(shí)候也會(huì)經(jīng)常用到,但api使用起來感覺還是沒有axios那般方便。
其實(shí)還有兩個(gè)出名的HTTP請(qǐng)求庫(kù)本文沒有提到:
一個(gè)是ky.js,它是一個(gè)非常小巧且強(qiáng)大的fetch式的請(qǐng)求庫(kù),主要為deno和現(xiàn)代瀏覽器所打造,所以暫時(shí)不參與其中的討論,感興趣的同學(xué)自己探索。
另一個(gè)就是request.js,沒有說的原因是它在2020年的時(shí)候就已經(jīng)被完全棄用了,如果有使用過的小伙伴可以在把項(xiàng)目里的request它替換成其他的方法。

到此這篇關(guān)于Node.js發(fā)起HTTP請(qǐng)求的6種不同方法小結(jié)的文章就介紹到這了,更多相關(guān)Node.js發(fā)起HTTP請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Node.JS發(fā)送http請(qǐng)求批量檢查文件中的網(wǎng)頁(yè)地址、服務(wù)是否有效可用
- node.js中express模塊創(chuàng)建服務(wù)器和http模塊客戶端發(fā)請(qǐng)求
- 詳解在Node.js中發(fā)起HTTP請(qǐng)求的5種方法
- Node.js模擬發(fā)起http請(qǐng)求從異步轉(zhuǎn)同步的5種用法
- Node.js中的http請(qǐng)求客戶端示例(request client)
- Node.js發(fā)送HTTP客戶端請(qǐng)求并顯示響應(yīng)結(jié)果的方法示例
- 完美解決node.js中使用https請(qǐng)求報(bào)CERT_UNTRUSTED的問題
- node.js請(qǐng)求HTTPS報(bào)錯(cuò):UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解決方法
- Node.js中Request模塊處理HTTP協(xié)議請(qǐng)求的基本使用教程
相關(guān)文章
npm設(shè)置同時(shí)從多個(gè)包源加載包的方法
本文主要介紹了npm 設(shè)置同時(shí)從多個(gè)包源加載包的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
node爬取新型冠狀病毒的疫情實(shí)時(shí)動(dòng)態(tài)
這篇文章主要介紹了node爬取新型冠狀病毒的疫情實(shí)時(shí)動(dòng)態(tài),非常不錯(cuò),本文通過實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2020-02-02
Nodejs把接收?qǐng)D片base64格式保存為文件存儲(chǔ)到服務(wù)器上
這篇文章主要介紹了Nodejs把接收?qǐng)D片base64格式保存為文件存儲(chǔ)到服務(wù)器上,文中代碼較簡(jiǎn)短,需要的朋友可以參考下2018-09-09
node.js模擬實(shí)現(xiàn)自動(dòng)發(fā)送郵件驗(yàn)證碼
這篇文章主要為大家介紹了node.js模擬實(shí)現(xiàn)自動(dòng)發(fā)送郵件驗(yàn)證碼的實(shí)例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Node.js版本發(fā)布策略頻率與穩(wěn)定性的平衡
這篇文章主要為大家介紹了Node.js版本發(fā)布策略頻率與穩(wěn)定性的平衡,幫助大家大家更清晰了解node發(fā)展史,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
NodeJs項(xiàng)目中關(guān)閉ESLint的方法
ESLint是一個(gè)用來識(shí)別 ECMAScript 并且按照規(guī)則給出報(bào)告的代碼檢測(cè)工具,使用它可以避免低級(jí)錯(cuò)誤和統(tǒng)一代碼的風(fēng)格。這篇文章主要介紹了NodeJs項(xiàng)目中關(guān)閉ESLint的方法,需要的朋友可以參考下2018-08-08
NodeJS學(xué)習(xí)筆記之Module的簡(jiǎn)介
模塊是Node.js 應(yīng)用程序的基本組成部分,文件和模塊是一一對(duì)應(yīng)的。換言之,一個(gè) Node.js 文件就是一個(gè)模塊,這個(gè)文件可能是JavaScript 代碼、JSON 或者編譯過的C/C++ 擴(kuò)展。2017-03-03

