Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: HTTP, REST API, PATCH, PUT, partial update, idempotent

Какие есть подходы к обработке PATCH/PUT запросов?

Вопрос проверяет понимание различий между HTTP-методами PATCH и PUT и подходов к их обработке на сервере, что необходимо для корректного проектирования RESTful API.

Короткий ответ

PUT предназначен для полной замены ресурса, поэтому в запросе передаются все его поля. PATCH используется для частичного обновления, передаются только изменяемые поля. Обработка PUT проще: данные валидируются и полностью перезаписывают старый ресурс. Для PATCH нужно определить стратегию: как применять изменения, особенно для сложных структур и вложенных объектов. Часто используют JSON Patch (RFC 6902) или Merge Patch (RFC 7396) для стандартизации формата запроса.

Длинный ответ

HTTP-методы PUT и PATCH используются для обновления ресурсов в RESTful API, но имеют фундаментальные различия в семантике, что определяет подходы к их обработке на сервере.

Семантика PUT и PATCH

Метод PUT является идемпотентным и предназначен для полной замены ресурса. Клиент должен отправить представление ресурса целиком. Если какие-то поля опущены, сервер может интерпретировать это как их удаление или установку в значения по умолчанию.

Метод PATCH предназначен для частичного обновления ресурса. Клиент отправляет только те поля, которые необходимо изменить. Это не идемпотентный метод по умолчанию, хотя реализация может сделать его таковым.

Подходы к обработке PUT

Обработка PUT обычно прямолинейна:

  • Получить идентификатор ресурса (например, из URL) и новые данные из тела запроса.
  • Провести валидацию всех переданных полей (так как ожидается полное представление).
  • Полностью заменить существующий ресурс новыми данными в базе данных или хранилище.
  • Вернуть успешный статус (200 OK или 204 No Content) или соответствующие ошибки (404, 400, 409).

Подходы к обработке PATCH

Обработка PATCH сложнее, так как требует определения стратегии применения изменений. Основные подходы:

  1. Merge Patch (RFC 7396): Простейший формат, где тело запроса — это JSON-объект с изменяемыми полями. Сервер "сливает" (merge) эти поля с существующим ресурсом. Для удаления поля можно передать значение null.
  2. JSON Patch (RFC 6902): Более мощный и стандартизированный формат. Запрос представляет собой массив операций (add, remove, replace, move, copy, test). Позволяет точно указывать изменения для сложных структур, включая массивы и вложенные объекты.
  3. Собственный формат: Многие API используют упрощённый подход, где передаются только изменяемые поля, а логика обновления определяется бизнес-правилами приложения (например, игнорирование null или специальные флаги для удаления).

Пример кода (Node.js/Express, Merge Patch)

// Обработчик PATCH для ресурса /users/:id
app.patch('/users/:id', async (req, res) => {
    const userId = req.params.id;
    const updates = req.body; // Только изменяемые поля

    // 1. Получаем текущего пользователя
    const currentUser = await User.findById(userId);
    if (!currentUser) return res.status(404).json({ error: 'User not found' });

    // 2. Применяем обновления (слияние)
    // Игнорируем попытки изменить ID или другие защищённые поля
    const allowedUpdates = ['name', 'email', 'age'];
    for (const key of allowedUpdates) {
        if (updates.hasOwnProperty(key)) {
            // Если значение null, удаляем поле (или оставляем как есть)
            if (updates[key] === null) {
                delete currentUser[key];
            } else {
                currentUser[key] = updates[key];
            }
        }
    }

    // 3. Валидация и сохранение
    try {
        await currentUser.save();
        res.json(currentUser);
    } catch (error) {
        res.status(400).json({ error: error.message });
    }
});

Вывод: Используйте PUT, когда логика требует полной замены ресурса и клиент может легко получить все его данные. PATCH предпочтительнее для экономии трафика и атомарного обновления отдельных полей, особенно в мобильных приложениях или при работе с большими объектами. Для сложных сценариев обновления рекомендуется стандарт JSON Patch.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • Node.js

    Node.js

  • Express

Ключевые слова

#HTTP

#REST API

#PATCH

#PUT

#partial update

#idempotent

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.