首頁  >  文章  >  web前端  >  淺析Node發起HTTP請求的6種方法

淺析Node發起HTTP請求的6種方法

青灯夜游
青灯夜游轉載
2022-12-09 20:08:203783瀏覽

Node中怎麼發起HTTP請求?這篇文章就來和大家一起探索下Node發起HTTP請求的6種不同方法,希望對大家有幫助!

淺析Node發起HTTP請求的6種方法

本文介紹6種在nodejs#中發起HTTP請求的不同方法,這裡我們會透過對掘金社區的板塊分類介面 的請求作為演示來完成這個每種不同方法的使用,當然為了更清晰的打印出所得到的數據,我們要提前安裝chalk庫來給其列印的資料加上顏色,好了,我們馬上就要開始啦~【相關教學推薦:nodejs影片教學程式設計教學

#正文


Node.js HTTPS Module

Node.js在標準函式庫中帶有https模組,所以你根本不需要引入任何函式庫去發起請求,因為node.js本身就可以完成,處理一些簡單的資料請求也是綽綽有餘了。

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);
});

從結構上有些許複雜,因為我們要弄一個空數組list來儲存請求資料塊chunk,然後在請求結束後還要透過Buffer處理資料再解析成json格式。

淺析Node發起HTTP請求的6種方法

Axios

#相信前端的小夥伴對axios並不陌生,它是一個非常流行且受歡迎的Promise式請求庫。它既可以瀏覽器端使用可以在客戶端使用它,而且眾所周知,它還有著攔截器,資料自動轉換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形式的,資料自動幫你解析成json,可以說是非常的簡潔與方便。

淺析Node發起HTTP請求的6種方法

Got

#got聲稱是「一個人性化且功能強大的Node.js HTTP 請求庫”,人性化在於它用了Promise式的API與對JOSN做處理配置等功能,而一些如HTTP2的支持,分頁式API以及RFC的緩存等能力是大多數請求庫所不具備的。

我們可以使用以下指令安裝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'}的配置,然後回傳的資料可以在body裡拿到了,也是十分的好用。

淺析Node發起HTTP請求的6種方法

Needle

#needle是一個比較簡潔小巧的請求庫,它的形式可以是Promise的方式也可以是回呼函數的方式,看自己的習慣選用,而且它的回傳值會對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)}`);
    })
})

這裡我們示範的用了回呼函數的方式來展示,可以看出返回有err與res,成功時err為null,成功後返回的res的body裡就是所要請求的數據,這裡是幫你自動轉化好的json格式。

淺析Node發起HTTP請求的6種方法

如果你想使用Promise的方式,可以去寫:

needle('get', 'https://api.juejin.cn/tag_api/v1/query_category_briefs')
.then(function(res) {
    // ...
})
.catch(function(err) {
    // ...
});

Superagent

請求庫superagent發佈時間可謂是相當的早了可以追溯到2011年,但它是漸進式客戶端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);
});

现在的superagent用法与axios十分的相似,但是需要去自己把数据处理成json格式。

淺析Node發起HTTP請求的6種方法

Node-fetch

顾名思义,这个请求库它的api与window.fetch保持了一致,也是promise式的。最近非常受欢迎,但可能最大的问题是,它的v2与v3版差异比较大,v2保持着cjs标准,而v3则用了ejs的方式,升级后可能造成一些困扰,所以为了统一这个标准我们这里用了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用起来完全一样,没有任何学习压力。

淺析Node發起HTTP請求的6種方法

对比


接下来我们看一下关于这几款请求库近一年的下载量趋势图:

淺析Node發起HTTP請求的6種方法

现在我们可以发现,就下载量而言,在过去一年中,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

这里我们又统计了这几个库的其他一些数据,axios的star数量可谓一骑绝尘,远远超过其他几个库。

结语

这些请求库,他们都做了同一件事都可以发起HTTP请求,或许写法会有些许不同,但都是条条大路通罗马。就个人而言,也可能是经常写浏览器端的缘故,所以是axios的忠实用户,不管是练习还是开发axios都是首选,当然node-fetch也越来越收到关注,包也十分的小,练习的时候也会经常用到,但api使用起来感觉还是没有axios那般方便。

其实还有两个出名的HTTP请求库本文没有提到:

一个是ky.js,它是一个非常小巧且强大的fetch式的请求库,主要为deno和现代浏览器所打造,所以暂时不参与其中的讨论,感兴趣的同学自己探索。

另一个就是request.js,没有说的原因是它在2020年的时候就已经被完全弃用了,如果有使用过的小伙伴可以在把项目里的request它替换成其他的方法。

淺析Node發起HTTP請求的6種方法

更多node相关知识,请访问:nodejs 教程

以上是淺析Node發起HTTP請求的6種方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除