Node.js GET/POST请求(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在现代 Web 开发中,Node.js GET/POST 请求是构建前后端交互的核心技术。无论是获取数据、提交表单,还是与第三方 API 通信,HTTP 请求都扮演着关键角色。对于编程初学者而言,理解这两种请求方式的差异与实现逻辑,是掌握全栈开发的基础;而对中级开发者来说,深入优化请求性能、处理复杂场景,则能显著提升项目质量。本文将通过循序渐进的讲解,结合代码示例与实际案例,帮助读者系统性地掌握 Node.js 中的 GET/POST 请求。


GET 请求详解

基础概念:GET 请求是什么?

GET 请求用于从服务器获取数据,相当于用户向图书馆询问书籍信息。其特点包括:

  1. 数据可见性:参数直接附加在 URL 后,例如 http://example.com/api?name=John&id=123
  2. 安全性低:敏感信息(如密码)不应通过 GET 传输;
  3. 缓存友好:浏览器可缓存 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-Typeapplication/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:

  1. 通过 GET 请求获取用户列表;
  2. 通过 POST 请求创建新用户;
  3. 返回 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');
});

运行与测试

  1. 启动服务后,发送 GET 请求:
    curl http://localhost:3000/api/users?page=1  
    
  2. 发送 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/awaitPromise 处理异步操作,避免阻塞事件循环:

// 示例:异步保存用户到数据库
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 架构设计的关键一步。

最新发布