全书目录

第十二篇:Express 完全指南 —— 老城区主干道宇宙

第十一章:REST API —— 老城区标准政务窗口

1 分钟 147 字 第 249 / 962 个阅读单元

REST 不是“只有 JSON”这么简单,它更像是:

给城市办事窗口制定统一规则。

比如“道路资源”:

text
GET    /api/roads        查询全部道路
GET    /api/roads/:id    查询一条道路
POST   /api/roads        新建道路
PATCH  /api/roads/:id    局部更新道路
DELETE /api/roads/:id    删除道路
#1. 一个小型 REST API 例子
js
const express = require('express');
const app = express();

app.use(express.json());

let roads = [
  { id: 1, name: '中山主路', status: 'open' },
  { id: 2, name: '复兴大道', status: 'repairing' }
];

app.get('/api/roads', (req, res) => {
  res.json(roads);
});

app.get('/api/roads/:id', (req, res) => {
  const road = roads.find(item => item.id === Number(req.params.id));

  if (!road) {
    return res.status(404).json({ message: '道路不存在' });
  }

  res.json(road);
});

app.post('/api/roads', (req, res) => {
  const newRoad = {
    id: roads.length + 1,
    name: req.body.name,
    status: req.body.status || 'open'
  };

  roads.push(newRoad);
  res.status(201).json(newRoad);
});

app.patch('/api/roads/:id', (req, res) => {
  const road = roads.find(item => item.id === Number(req.params.id));

  if (!road) {
    return res.status(404).json({ message: '道路不存在' });
  }

  if (req.body.name !== undefined) road.name = req.body.name;
  if (req.body.status !== undefined) road.status = req.body.status;

  res.json(road);
});

app.delete('/api/roads/:id', (req, res) => {
  roads = roads.filter(item => item.id !== Number(req.params.id));
  res.status(204).send();
});

app.listen(3000);
#2. 为什么 REST 风格对初学者重要

因为它帮你建立“资源”思维,而不是“随手乱开窗口”:

不够统一的路口:

text
/getRoadList
/createRoad
/updateRoadStatus
/removeRoadById

更清晰的路口:

text
GET    /api/roads
POST   /api/roads
PATCH  /api/roads/:id
DELETE /api/roads/:id
#3. 一张资源关系图
text
资源 = 这座城里能被操作的东西
│
├── roads        道路
├── districts    行政区
├── notices      公告
└── inspectors   巡检员