Что такое REST

«Что такое REST» — вопрос из категории Сети, который задают на 50% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

REST (Representational State Transfer) — это архитектурный стиль для построения распределенных систем, в частности веб-сервисов (RESTful API). Он использует стандартные возможности протокола HTTP.

Основные принципы REST применительно к разработке на Node.js:

  1. Ресурсо-ориентированность: Все сущности (пользователи, заказы) представляются как ресурсы с уникальными идентификаторами (URI).

    • GET /api/users — получить список пользователей.
    • GET /api/users/123 — получить пользователя с ID 123.
  2. Единообразие интерфейса (Uniform Interface): Использование стандартных HTTP-методов для операций CRUD.

    • GET — получение ресурса.
    • POST — создание нового ресурса.
    • PUT — полное обновление ресурса.
    • PATCH — частичное обновление ресурса.
    • DELETE — удаление ресурса.
  3. Отсутствие состояния (Stateless): Каждый запрос от клиента должен содержать всю информацию, необходимую серверу для его обработки. Сервер не хранит состояние сессии клиента между запросами. Аутентификация, например, реализуется через токены (JWT в заголовке каждого запроса).

  4. Кэшируемость: Ответы сервера должны явно указывать, можно ли их кэшировать и как долго (через HTTP-заголовки Cache-Control, ETag).

  5. Слоистая система: Клиент не знает, подключен ли он напрямую к серверу или через промежуточные узлы (балансировщики, прокси, шлюзы).

Пример реализации простого RESTful API для ресурса articles на Express.js:

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

let articles = [{ id: 1, title: 'First Article' }];
let nextId = 2;

// GET /articles — получить все статьи
app.get('/articles', (req, res) => {
  res.json(articles);
});

// POST /articles — создать новую статью
app.post('/articles', (req, res) => {
  const newArticle = { id: nextId++, ...req.body };
  articles.push(newArticle);
  res.status(201).json(newArticle); // 201 Created
});

// GET /articles/:id — получить статью по ID
app.get('/articles/:id', (req, res) => {
  const article = articles.find(a => a.id === parseInt(req.params.id));
  if (!article) return res.status(404).send('Article not found');
  res.json(article);
});

// PUT /articles/:id — полностью обновить статью
app.put('/articles/:id', (req, res) => {
  const index = articles.findIndex(a => a.id === parseInt(req.params.id));
  if (index === -1) return res.status(404).send('Article not found');
  articles[index] = { id: articles[index].id, ...req.body };
  res.json(articles[index]);
});

// DELETE /articles/:id — удалить статью
app.delete('/articles/:id', (req, res) => {
  const initialLength = articles.length;
  articles = articles.filter(a => a.id !== parseInt(req.params.id));
  if (articles.length === initialLength) return res.status(404).send('Article not found');
  res.status(204).send(); // 204 No Content
});

app.listen(3000);

Видео-ответы