Node.js 如何发送 HTTP POST 请求?

Node.js 发 POST 请求三种方式:内置 http/https 模块(零依赖)、axios 库(最常用)、全局 fetch(Node 18+ 推荐)。本文给出三种写法的完整代码与选用建议。

最佳实践
Node.js 事件循环与异步任务示意

**三种主流方式:内置 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 边界。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台