Node.js發(fā)起HTTP請求的6種不同方法小結
介紹
本期將向大家介紹6種不同的方法在node.js中去發(fā)起HTTP請求,這里我們會通過對掘金社區(qū)的板塊分類接口
的請求作為演示來完成這個每種不同方法的使用,當然為了更清晰的打印出所得到的數(shù)據(jù),我們要提前安裝chalk庫
來給其打印的數(shù)據(jù)加上顏色,好了,我們馬上就要開始啦~
正文
Node.js HTTPS Module
Node.js在標準庫中帶有https模塊,所以你根本不需要引入任何庫去發(fā)起請求,因為node.js本身就可以完成,處理一些簡單的數(shù)據(jù)請求也是綽綽有余了。
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); });
從結構上有些許復雜,因為我們要弄一個空數(shù)組list來存儲請求數(shù)據(jù)塊chunk,然后在請求結束后還要通過Buffer處理數(shù)據(jù)再解析成json格式。
Axios
相信前端的小伙伴對axios并不陌生,它是一個非常流行且受歡迎的Promise式請求庫。它既可以瀏覽器端使用可以在客戶端使用它,而且眾所周知,它還有著攔截器,數(shù)據(jù)自動轉換json等十分方便的功能。
我們可以使用以下命令安裝axios:
npm i -S axios
下面是我們通過axios獲取掘金板塊分類簡單示例:
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請求請求接口,可以結構也是promise形式的,數(shù)據(jù)自動幫你解析成json,可以說是非常的簡潔與方便。
Got
got聲稱是“一個人性化且功能強大的 Node.js HTTP 請求庫”,人性化在于它用了Promise式的API與對JOSN做處理配置等功能,而一些如HTTP2的支持,分頁式API以及RFC的緩存等能力是大多數(shù)請求庫所不具備的。
我們可以使用以下命令安裝got:
npm i -S got@10.7.0
下面是我們通過got獲取掘金板塊分類簡單示例:
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); });
這里我們先要對請求接口進行{responseType: 'json'}
的配置,然后返回的數(shù)據(jù)可以在body里拿到了,也是十分的好用。
Needle
needle是一個比較簡潔小巧的請求庫,它的形式可以是Promise的方式也可以是回調(diào)函數(shù)的方式,看自己的習慣選用,而且它的返回值會對XML與JSON自動做出轉換,也是非常的方便。
我們可以使用以下命令安裝needle:
npm i -S needle
下面是我們通過needle獲取掘金板塊分類簡單示例:
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,成功時err為null,成功后返回的res的body里就是所要請求的數(shù)據(jù),這里是幫你自動轉化好的json格式。
如果你想使用Promise的方式,可以這么去寫:
needle('get', 'https://api.juejin.cn/tag_api/v1/query_category_briefs') .then(function(res) { // ... }) .catch(function(err) { // ... });
Superagent
請求庫superagent發(fā)布時間可謂是相當?shù)脑缌丝梢宰匪莸?011年,但它是漸進式客戶端 HTTP 請求庫,與具有相同 API 的 Node.js 模塊,支持許多高級 HTTP 客戶端功能,依舊是十分的好用。
我們可以使用以下命令安裝superagent:
npm i -S superagent
下面是我們通過superagent獲取掘金板塊分類簡單示例:
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
顧名思義,這個請求庫它的api與window.fetch保持了一致,也是promise式的。最近非常受歡迎,但可能最大的問題是,它的v2與v3版差異比較大,v2保持著cjs標準,而v3則用了ejs的方式,升級后可能造成一些困擾,所以為了統(tǒng)一這個標準我們這里用了2.6.7版作為演示版本。
我們可以使用以下命令安裝node-fetch:
npm i -S node-fetch@2.6.7
下面是我們通過node-fetch獲取掘金板塊分類簡單示例:
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用起來完全一樣,沒有任何學習壓力。
對比
接下來我們看一下關于這幾款請求庫近一年的下載量趨勢圖:
現(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)計了這幾個庫的其他一些數(shù)據(jù),axios的star數(shù)量可謂一騎絕塵,遠遠超過其他幾個庫。
結語
這些請求庫,他們都做了同一件事都可以發(fā)起HTTP請求,或許寫法會有些許不同,但都是條條大路通羅馬。就個人而言,也可能是經(jīng)常寫瀏覽器端的緣故,所以是axios的忠實用戶,不管是練習還是開發(fā)axios都是首選,當然node-fetch也越來越收到關注,包也十分的小,練習的時候也會經(jīng)常用到,但api使用起來感覺還是沒有axios那般方便。
其實還有兩個出名的HTTP請求庫本文沒有提到:
一個是ky.js,它是一個非常小巧且強大的fetch式的請求庫,主要為deno和現(xiàn)代瀏覽器所打造,所以暫時不參與其中的討論,感興趣的同學自己探索。
另一個就是request.js,沒有說的原因是它在2020年的時候就已經(jīng)被完全棄用了,如果有使用過的小伙伴可以在把項目里的request它替換成其他的方法。
到此這篇關于Node.js發(fā)起HTTP請求的6種不同方法小結的文章就介紹到這了,更多相關Node.js發(fā)起HTTP請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Node.JS發(fā)送http請求批量檢查文件中的網(wǎng)頁地址、服務是否有效可用
- node.js中express模塊創(chuàng)建服務器和http模塊客戶端發(fā)請求
- 詳解在Node.js中發(fā)起HTTP請求的5種方法
- Node.js模擬發(fā)起http請求從異步轉同步的5種用法
- Node.js中的http請求客戶端示例(request client)
- Node.js發(fā)送HTTP客戶端請求并顯示響應結果的方法示例
- 完美解決node.js中使用https請求報CERT_UNTRUSTED的問題
- node.js請求HTTPS報錯:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解決方法
- Node.js中Request模塊處理HTTP協(xié)議請求的基本使用教程
相關文章
AngularJS + Node.js + MongoDB開發(fā)的基于高德地圖位置的通訊錄
這篇文章主要介紹了AngularJS + Node.js + MongoDB開發(fā)的基于高德地圖位置的通訊錄,需要的朋友可以參考下2015-01-01node?puppeteer爬蟲爬取電影網(wǎng)站及生成pdf文檔示例
這篇文章主要介紹了node?puppeteer爬蟲爬取電影網(wǎng)站及生成pdf文檔使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07