Kodokon kodokon.com

Создание REST API

Спроектируй чистый REST API с правильными HTTP-методами, правильными кодами состояния и валидацией тела запроса.

9 мин · 3 вопросов

Открыть этот урок в Kodokon

REST API предоставляет ресурсы (пользователи, задачи, заказы), которыми управляют с помощью HTTP-методов: GET для чтения, POST для создания, PUT или PATCH для обновления, DELETE для удаления. Профессиональное соглашение: существительные во множественном числе, никаких глаголов в URL. Ты пишешь POST /tasks, а не /createTask. Давай соберём небольшой API задач, пока что в памяти.

JAVASCRIPT
import express from "express";

const app = express();
app.use(express.json());

const tasks = [
  { id: 1, title: "Review the module", done: false }
];

app.get("/tasks", (req, res) => {
  res.json(tasks);
});

app.listen(3000);

Строка app.use(express.json()) обязательна: без неё req.body равен undefined для любого JSON-запроса. При создании всегда проверяй входные данные, отвечай кодом 201 и возвращай созданный ресурс: так клиент сможет получить сгенерированный сервером id.

JAVASCRIPT
app.post("/tasks", (req, res) => {
  const { title } = req.body;
  if (!title) {
    return res.status(400).json({
      error: "The title field is required"
    });
  }
  const task = {
    id: tasks.length + 1,
    title,
    done: false
  };
  tasks.push(task);
  res.status(201).json(task);
});

Запомни коды, которыми будешь пользоваться каждый день: 200 - успешное чтение или обновление, 201 - ресурс создан, 204 - успех без содержимого (удаление), 400 - некорректный запрос, 404 - ресурс не найден, 500 - ошибка сервера. Правило простое: если 4xx - ошибся клиент, если 5xx - подвёл твой код.

JAVASCRIPT
app.delete("/tasks/:id", (req, res) => {
  const id = Number(req.params.id);
  const index = tasks.findIndex((t) => t.id === id);
  if (index === -1) {
    return res.status(404).json({
      error: "Task not found"
    });
  }
  tasks.splice(index, 1);
  res.status(204).end();
});

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Какой код состояния ты вернёшь после успешного создания ресурса?
    • 200
    • 201
    • 204
    • 301
  2. Без какой строки req.body остаётся undefined при JSON-запросе?
    • app.use(express.json())
    • app.use(express.static(...))
    • app.listen(3000)
  3. Клиент отправляет POST без обязательного поля title. Как правильно отреагировать API?
    • Создать ресурс с пустым заголовком
    • Вернуть статус 400 с сообщением об ошибке
    • Вернуть статус 500
    • Проигнорировать запрос и ничего не отвечать