Как с помощью HTTP-метода PATCH обновить несколько полей одного ресурса

Ответ

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

Принцип работы: Клиент отправляет на сервер только те поля, которые необходимо изменить. Сервер применяет эти изменения к существующему ресурсу, оставляя остальные поля нетронутыми. Это снижает объем передаваемых данных по сравнению с PUT.

Пример на Python с requests:

Предположим, нужно обновить имя пользователя и его статус активности.

import requests
import json

# URI конкретного ресурса
url = 'https://api.example.com/users/123'

# Данные для частичного обновления
payload = {
    'full_name': 'John Doe',  # string
    'is_active': False        # boolean
}

headers = {'Content-Type': 'application/json'}

response = requests.patch(url, data=json.dumps(payload), headers=headers)

print(response.status_code)
print(response.json())

Ключевые моменты:

  • Цель: Частичное обновление. Идеально для изменения 1-2 полей в большом объекте.
  • Идемпотентность: PATCH не является идемпотентным по своей природе, в отличие от PUT, так как результат повторного запроса может отличаться (например, если операция — инкремент значения).
  • Формат: Для сложных операций (добавление в массив, удаление поля) часто используется стандарт JSON Patch (RFC 6902) с Content-Type application/json-patch+json.

Ответ 18+ 🔞

Смотри, вот тебе как есть, без прикрас. PATCH — это когда тебе надо не всю хрень переписывать, а только один кусок. Представь, что у тебя есть пользователь, и ты хочешь ему только имя поменять, а не весь паспорт заново выписывать. Вот для этого он и нужен.

Как это работает, если по-простому: Ты шлёшь на сервер только те поля, которые надо поменять. Сервер смотрит, берёт эти новые значения и аккуратно вставляет их на место старых. Всё остальное остаётся как было. Это как заплатку на штаны наложить, а не новые покупать.

Вот тебе пример на Python, чтобы было совсем понятно:

Допустим, у нас есть юзер с id 123, и мы хотим ему обновить имя и выключить активность.

import requests
import json

# Адрес конкретного чувака
url = 'https://api.example.com/users/123'

# То, что мы хотим поменять. Только это и ничего больше.
payload = {
    'full_name': 'John Doe',  # Это строка
    'is_active': False        # А это булево значение, да-нет
}

headers = {'Content-Type': 'application/json'}

# Отправляем заплаточку
response = requests.patch(url, data=json.dumps(payload), headers=headers)

print(response.status_code)
print(response.json())

Важные нюансы, чтобы не облажаться:

  • Суть: Частичное обновление. Идеально, когда объект большой, как слон, а менять надо только хобот.
  • Идемпотентность: А вот тут, блядь, интересно. PATCH по умолчанию не идемпотентный, в отличие от PUT. Если ты два раза подряд отправишь один и тот же PATCH, который, например, увеличивает счётчик, то счётчик увеличится дважды. Пиздец, да? Поэтому смотри в документацию API, что они там себе позволяют.
  • Формат: Если тебе нужно не просто заменить значение, а сделать что-то хитрое — добавить элемент в массив, удалить поле — то умные дядьки придумали стандарт JSON Patch (RFC 6902). Для него нужно ставить специальный заголовок Content-Type: application/json-patch+json. Но это уже высший пилотаж, для начала хватит и обычного подхода.