Строим полноценный CRUD API шаг за шагом: GET, POST, PATCH, DELETE — с тестами в браузере.
REST API — это сервер, который принимает HTTP-запросы и возвращает JSON. Браузер, мобильное приложение, другой сервис — все общаются через одни и те же маршруты.
| Операция | HTTP-метод | URL | Что делает |
|---|---|---|---|
| Create | POST | /api/todos | Создать задачу |
| Read | GET | /api/todos | Получить все задачи |
| Update | PATCH | /api/todos/:id | Изменить задачу |
| Delete | DELETE | /api/todos/:id | Удалить задачу |
Данные хранятся в памяти — простой массив объектов:
const todos = [
{ id: 1, title: "Первая задача", done: false },
];Каждый маршрут читает или изменяет этот массив и возвращает результат.
200 — успешный GET / PATCH / DELETE201 — успешный POST (создан новый ресурс)404 — ресурс не найден400 — неверный запрос (нет обязательных полей)На следующих шагах ты напишешь каждый маршрут и сразу проверишь его в браузере.
const app = express();
app.use(express.json());
const todos = [
{ id: 1, title: "Изучить HTTP-методы", done: true },
{ id: 2, title: "Написать GET /api/todos", done: false },
];
let nextId = 3;
// GET — список всех задач
app.get('/api/todos', (req, res) => {
res.json(todos);
});
// POST — создать задачу
app.post('/api/todos', (req, res) => {
const todo = { id: nextId++, title: req.body.title, done: false };
todos.push(todo);
res.status(201).json(todo);
});
// PATCH — переключить done
app.patch('/api/todos/:id', (req, res) => {
const todo = todos.find(t => t.id === Number(req.params.id));
if (!todo) return res.status(404).json({ error: 'Not found' });
todo.done = !todo.done;
res.json(todo);
});
// DELETE — удалить задачу
app.delete('/api/todos/:id', (req, res) => {
const idx = todos.findIndex(t => t.id === Number(req.params.id));
if (idx === -1) return res.status(404).json({ error: 'Not found' });
const [removed] = todos.splice(idx, 1);
res.json(removed);
});
app.listen(3000, () => console.log('✅ http://localhost:3000'));| Метод | Путь | Смысл | Код |
|---|---|---|---|
| GET | /api/todos | получить список | 200 OK |
| POST | /api/todos | создать задачу | 201 Created |
| PATCH | /api/todos/:id | отметить готовой | 200 OK |
| DELETE | /api/todos/:id | удалить задачу | 200 OK |
POST /api/todos
{ "text": "Написать код" }{
"id": 2,
"text": "Написать код",
"done": false
}Один и тот же конвейер обслуживает все маршруты. Разница — какие звенья включаются: GET без тела пропускает express.json и validate, а :id-маршруты дополнительно читают req.params.