Node.js GET/POST请求(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在现代 Web 开发中,Node.js GET/POST 请求是构建前后端交互的核心技术。无论是获取数据、提交表单,还是与第三方 API 通信,HTTP 请求都扮演着关键角色。对于编程初学者而言,理解这两种请求方式的差异与实现逻辑,是掌握全栈开发的基础;而对中级开发者来说,深入优化请求性能、处理复杂场景,则能显著提升项目质量。本文将通过循序渐进的讲解,结合代码示例与实际案例,帮助读者系统性地掌握 Node.js 中的 GET/POST 请求。
GET 请求详解
基础概念:GET 请求是什么?
GET 请求用于从服务器获取数据,相当于用户向图书馆询问书籍信息。其特点包括:
- 数据可见性:参数直接附加在 URL 后,例如
http://example.com/api?name=John&id=123
; - 安全性低:敏感信息(如密码)不应通过 GET 传输;
- 缓存友好:浏览器可缓存 GET 请求的结果,提升加载速度。
实现 GET 请求的代码示例
使用 Node.js 内置的 http
模块,可快速搭建一个处理 GET 请求的服务器:
const http = require('http');
const server = http.createServer((req, res) => {
// 设置响应头,允许跨域等配置
res.setHeader('Content-Type', 'application/json');
if (req.url.startsWith('/api/users')) {
// 解析 URL 参数(如 http://localhost:3000/api/users?name=Bob)
const url = new URL(req.url, `http://${req.headers.host}`);
const name = url.searchParams.get('name') || 'Guest';
res.end(JSON.stringify({
message: `Hello, ${name}!`,
success: true
}));
}
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
关键点解析
- URL 解析:通过
URL
构造函数和searchParams
属性提取参数; - 响应格式:设置
Content-Type
为application/json
,确保客户端正确解析数据; - 默认值处理:当参数缺失时返回默认值(如
Guest
),避免程序出错。
GET 请求的高级场景:分页与过滤
实际开发中,GET 请求常需处理复杂参数,例如分页查询:
// URL 示例:http://localhost:3000/api/posts?page=2&limit=10&category=tech
const server = http.createServer((req, res) => {
if (req.url.startsWith('/api/posts')) {
const url = new URL(req.url, `http://${req.headers.host}`);
const page = parseInt(url.searchParams.get('page') || 1);
const limit = parseInt(url.searchParams.get('limit') || 10);
const category = url.searchParams.get('category') || 'all';
// 模拟数据库查询逻辑
const posts = getPostsFromDB(page, limit, category);
res.end(JSON.stringify(posts));
}
});
比喻说明
这如同在图书馆中,用户通过“第几层书架”(page
)、“每层取多少本书”(limit
)、“科技类书籍”(category
)来精准筛选书籍,GET 请求的参数设计直接影响数据返回的范围。
POST 请求详解
核心特性与使用场景
POST 请求用于向服务器提交数据,例如用户注册、表单提交或文件上传。其特点包括:
- 数据隐蔽性:参数存放在请求体(Body)中,不在 URL 显露;
- 无长度限制:可传输大量数据(如文件或复杂对象);
- 幂等性:与 GET 不同,POST 可能改变服务器状态(如创建新资源)。
实现 POST 请求的代码示例
以下示例演示如何接收并处理用户提交的表单数据:
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
if (req.method === 'POST' && req.url === '/api/register') {
let body = '';
// 监听数据流,逐块读取请求体
req.on('data', (chunk) => {
body += chunk.toString();
});
req.on('end', () => {
const userData = JSON.parse(body);
// 模拟用户注册逻辑
saveUserToDB(userData);
res.writeHead(201, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
message: 'User created successfully',
user: userData
}));
});
}
});
server.listen(3000);
关键点解析
- 数据流处理:通过
req.on('data')
和req.on('end')
处理分块传输的请求体; - JSON 解析:使用
JSON.parse()
将字符串转为对象,需确保客户端发送Content-Type: application/json
; - 状态码规范:返回
201 Created
表示资源创建成功。
处理表单数据的进阶方法
对于传统 application/x-www-form-urlencoded
格式的表单(如 HTML 表单默认提交类型),可借助第三方库 querystring
解析:
const querystring = require('querystring');
// 处理 POST 请求
req.on('end', () => {
const parsedData = querystring.parse(body);
console.log(parsedData); // { username: 'alice', email: 'alice@example.com' }
});
对比与选择
- JSON 格式:适合复杂数据结构(如嵌套对象);
- 表单格式:适用于简单键值对(如用户注册表单)。
GET/POST 请求的对比与选择
场景需求 | 推荐方法 | 原因说明 |
---|---|---|
获取公开数据(如天气) | GET | 参数可见,适合缓存 |
提交敏感信息(如密码) | POST | 数据隐藏,安全性更高 |
更新服务器资源(如订单) | POST | 可改变服务器状态,符合 RESTful 设计 |
分页查询数据库记录 | GET | 参数明确,便于调试和分享链接 |
实际案例:构建简易用户系统
案例目标
实现一个包含以下功能的 API:
- 通过 GET 请求获取用户列表;
- 通过 POST 请求创建新用户;
- 返回 JSON 格式数据。
完整代码实现
const http = require('http');
const url = require('url');
const querystring = require('querystring');
// 模拟数据库存储
let users = [];
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'application/json');
if (req.url === '/api/users') {
if (req.method === 'GET') {
// 获取用户列表
const page = parseInt(url.parse(req.url, true).query.page) || 1;
const pageSize = 10;
const startIndex = (page - 1) * pageSize;
const paginatedUsers = users.slice(startIndex, startIndex + pageSize);
res.end(JSON.stringify(paginatedUsers));
} else if (req.method === 'POST') {
// 创建新用户
let body = '';
req.on('data', chunk => body += chunk);
req.on('end', () => {
const newUser = JSON.parse(body);
users.push(newUser);
res.writeHead(201);
res.end(JSON.stringify(newUser));
});
}
}
});
server.listen(3000, () => {
console.log('User API server running at http://localhost:3000');
});
运行与测试
- 启动服务后,发送 GET 请求:
curl http://localhost:3000/api/users?page=1
- 发送 POST 请求创建用户:
curl -X POST http://localhost:3000/api/users \ -H "Content-Type: application/json" \ -d '{"name": "Bob", "email": "bob@example.com"}'
进阶技巧与最佳实践
1. 错误处理与响应状态码
在代码中添加错误处理逻辑,例如:
try {
// 处理请求的代码
} catch (error) {
res.writeHead(500, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'Internal Server Error' }));
}
2. 异步请求与非阻塞设计
使用 async/await
或 Promise
处理异步操作,避免阻塞事件循环:
// 示例:异步保存用户到数据库
async function saveUser(userData) {
return new Promise((resolve, reject) => {
// 模拟数据库操作
setTimeout(() => {
resolve('User saved');
}, 1000);
});
}
3. 中间件与路由分离
通过 Express.js 等框架简化代码结构:
const express = require('express');
const app = express();
// 解析 JSON 请求体
app.use(express.json());
// GET 路由
app.get('/api/users', (req, res) => {
res.json(users);
});
// POST 路由
app.post('/api/users', (req, res) => {
users.push(req.body);
res.status(201).json(req.body);
});
app.listen(3000);
结论
通过本文,读者应已掌握Node.js GET/POST 请求的核心原理与实现方法。GET 请求适合数据获取,而 POST 请求适用于数据提交,两者结合可构建完整的 Web API 系统。对于初学者,建议从基础代码示例入手,逐步尝试更复杂的场景(如分页、错误处理);中级开发者则可探索异步优化、安全加固(如防止 CSRF 攻击)等进阶主题。
实践是最好的学习方式——尝试将本文的代码示例部署到本地环境,或根据需求扩展功能(如添加用户认证、数据库连接),逐步提升 Node.js 开发能力。掌握 HTTP 请求不仅是技术上的突破,更是理解 Web 架构设计的关键一步。