Node.js 如何发送 HTTP POST 请求?
Node.js 发 POST 请求三种方式:内置 http/https 模块(零依赖)、axios 库(最常用)、全局 fetch(Node 18+ 推荐)。本文给出三种写法的完整代码与选用建议。
**三种主流方式:内置 http 模块、第三方 axios、Node 18+ 自带的 fetch。**新项目推荐直接用 fetch,零依赖且 API 现代。
方式一:fetch(Node 18+,推荐)
const res = await fetch('https://example.com/api', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key1: 'value1', key2: 'value2' })
});
const data = await res.json();
console.log(data);
无需安装任何依赖,语法与浏览器端一致。
方式二:内置 http 模块(零依赖,老代码常见)
const http = require('http');
const postData = JSON.stringify({ key1: 'value1', key2: 'value2' });
const options = {
hostname: 'example.com',
port: 80,
path: '/path/to/api',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(postData) // 必填,否则服务端可能读不到 body
}
};
const req = http.request(options, (res) => {
let responseData = '';
res.on('data', (chunk) => { responseData += chunk; });
res.on('end', () => console.log('响应:', responseData));
});
req.on('error', (error) => console.error('错误:', error.message));
req.write(postData);
req.end(); // 必须调用 end(),否则请求不会发出
HTTPS 就把 require('http') 换成 require('https')。
方式三:axios(功能丰富的第三方库)
npm install axios
const axios = require('axios');
const res = await axios.post('https://example.com/api', {
key1: 'value1',
key2: 'value2'
});
console.log(res.data);
axios 自动处理 JSON 序列化/反序列化,自带超时、拦截器、错误分类,适合复杂 HTTP 交互的项目。
怎么选
| 场景 | 推荐 |
|---|---|
| 新项目、脚本 | fetch(零依赖) |
| 老项目维护 | 跟随现有技术栈 |
| 需要拦截器/重试/上传进度 | axios |
常见问题(FAQ)
Q:POST 表单(application/x-www-form-urlencoded)怎么发?
fetch/axios 把 body 换成 new URLSearchParams({k: 'v'}),并相应设置 Content-Type。
Q:要设置超时怎么办?
fetch 用 AbortSignal.timeout(5000);axios 配置 { timeout: 5000 };http 模块用 req.setTimeout()。
Q:发二进制/文件怎么做?
fetch 和 axios 都支持 FormData:把文件 append 进去直接 POST,头会自动带上 multipart 边界。