JavaScript (Node.js) 的 HTTP 客户端:顶级网络库
在现代 Node.js 网页开发中,发送 HTTP 请求是最常见的操作之一。无论是调用 REST API、下载文件还是与微服务交互,都离不开可靠的 HTTP 客户端。在本文中,我们将详细分析 JavaScript (Node.js) 的四个最佳库:Axios、Got、node-fetch 和 undici。您将了解它们的特点、性能,并获得现成的代码示例。
1. Axios — 通用标准
Axios 是 Node.js 和浏览器中最流行的 HTTP 客户端。它基于 Promise 构建,支持拦截器 (interceptors)、自动 JSON 解析、CSRF 防护和请求取消。
安装:
npm install axiosGET 请求示例:
const axios = require('axios');
async function getUser(id) { try { const response = await axios.get(`https://api.example.com/users/${id}`); console.log(response.data); } catch (error) { console.error('错误:', error.message); }}
getUser(1);带标头的 POST 示例:
const axios = require('axios');
const data = { name: 'Alice', role: 'developer' };
axios.post('https://api.example.com/users', data, { headers: { 'Content-Type': 'application/json' }}).then(res => console.log(res.status));优点:简单易用、生态系统广泛、支持上传进度。
缺点:包体积较大(约 100 KB),对于简单任务来说过于臃肿。
2. Got — 快速且功能丰富
Got 是一个轻量级 HTTP 客户端,API 丰富。它支持流式传输、缓存、重试,并且比 Axios 更快。
安装:
npm install got带流和错误处理的示例:
const got = require('got');const fs = require('fs');
async function downloadFile(url, outputPath) { try { const stream = got.stream(url); const fileStream = fs.createWriteStream(outputPath); stream.pipe(fileStream);
await new Promise((resolve, reject) => { stream.on('end', resolve); stream.on('error', reject); }); console.log('文件已下载'); } catch (error) { console.error('下载错误:', error.message); }}
downloadFile('https://example.com/file.zip', './file.zip');带重试的示例:
const got = require('got');
got('https://api.example.com/data', { retry: { limit: 3, methods: ['GET'] }}).then(response => console.log(response.body));优点:体积小、速度快、内置重试机制。
缺点:对于新手来说 API 不够直观。
3. node-fetch — 熟悉的浏览器语法
node-fetch 是浏览器 Fetch API 在 Node.js 上的移植。如果您习惯了浏览器中的 fetch 并希望代码保持一致,它是理想选择。
安装:
npm install node-fetch使用 async/await 的示例:
const fetch = require('node-fetch');
async function getPosts() { const response = await fetch('https://jsonplaceholder.typicode.com/posts/1'); if (!response.ok) throw new Error('HTTP 错误 ' + response.status); const data = await response.json(); console.log(data.title);}
getPosts();发送 FormData 的示例:
const fetch = require('node-fetch');const FormData = require('form-data');
const form = new FormData();form.append('file', fs.createReadStream('./photo.jpg'));\