Когда используется HTTP PUT запрос?

Ответ

HTTP метод PUT используется для полного обновления существующего ресурса или создания нового ресурса, если он не существует, по указанному URI. Он отправляет полную репрезентацию ресурса на сервер.

Основные характеристики и применение:

  • Полное обновление: В отличие от PATCH, который изменяет только часть ресурса, PUT заменяет весь ресурс целиком. Если в теле запроса отсутствуют какие-либо поля существующего ресурса, они будут удалены или сброшены до значений по умолчанию.
  • Создание ресурса: Если ресурс по указанному URI не существует, PUT может использоваться для его создания. Клиент сам определяет URI нового ресурса.
  • Идемпотентность: PUT является идемпотентным методом. Это означает, что многократное выполнение одного и того же PUT запроса приведет к одному и тому же состоянию на сервере, без дополнительных побочных эффектов. Это делает его безопасным для повторных попыток.

Примеры использования:

  • Обновление профиля пользователя: Если у вас есть ресурс /users/123, и вы хотите обновить все данные пользователя, вы отправляете PUT запрос с полным JSON-объектом пользователя.
  • Создание файла по известному пути: Загрузка файла на сервер по конкретному пути, например, /files/document.pdf.

Пример HTTP PUT запроса (с использованием Python requests):

import requests

# Предположим, у нас есть пользователь с ID 1
user_id = 1
api_url = f'https://api.example.com/users/{user_id}'

# Данные для полного обновления пользователя
updated_data = {
    'name': 'Jane Doe',
    'email': 'jane.doe@example.com',
    'age': 35
}

# Отправка PUT запроса
response = requests.put(api_url, json=updated_data)

if response.status_code == 200: # OK
    print(f"Ресурс {api_url} успешно обновлен.")
    print(response.json())
elif response.status_code == 201: # Created
    print(f"Ресурс {api_url} успешно создан.")
    print(response.json())
else:
    print(f"Ошибка при выполнении PUT запроса: {response.status_code}")
    print(response.text)

Ожидаемые HTTP статусы:

  • 200 OK или 204 No Content: Ресурс успешно обновлен.
  • 201 Created: Ресурс успешно создан (если его не существовало).
  • 400 Bad Request: Некорректные данные в запросе.
  • 404 Not Found: Ресурс не найден (если сервер не поддерживает создание через PUT).

Ответ 18+ 🔞

А, вот эта штука, PUT, да? Ну, слушай, сейчас разжую, как есть.

Представь себе, у тебя есть анкета в паспортном столе, вся заполненная. И ты приносишь им целиком новую бланчину, где всё переписано — и имя, и прописка, и даже фотка другая. Старую — нахуй в мусорку, эту — в дело. Вот это и есть PUT, блядь. Полная замена, от и до. Никаких «ой, а давайте только фамилию исправим». Нет, сука, всё по новой!

А если в этом самом паспортном столе на полке с твоим номером пусто? Ну, окей, они твой новый бланк туда и положат. Создадут, короче. Сам сказал, куда класть — они и положили. Удобно, ёпта.

И главная его фишка — он идемпотентный. Это умное слово значит, что если ты десять раз подряд притащишь один и тот же бланк, в итоге на полке будет лежать ровно он, а не десять копий. Не накосячишь. Для автоматических повторов — то, что надо.

Где это применить, спросишь? Да везде, где надо целиком перетряхнуть запись. Профиль юзера на сайте обновил, файл на сервере по точному пути залил — везде PUT рулит.

Вот, смотри, как на питоне это выглядит, если не боишься кода:

import requests

# Допустим, мужика с айдишником 1 надо переписать
user_id = 1
api_url = f'https://api.example.com/users/{user_id}'

# Всё, что о нём знаем теперь. ВСЁ, Карл! Старое — не в счёт.
updated_data = {
    'name': 'Jane Doe',
    'email': 'jane.doe@example.com',
    'age': 35
}

# Летит наш PUT-запрос, как кирпич в окно
response = requests.put(api_url, json=updated_data)

if response.status_code == 200: # Всё гуд, обновили
    print(f"Ресурс {api_url} успешно обновлен.")
    print(response.json())
elif response.status_code == 201: # О, а его и не было! Создали!
    print(f"Ресурс {api_url} успешно создан.")
    print(response.json())
else:
    print(f"Ошибка при выполнении PUT запроса: {response.status_code}")
    print(response.text) # Тут сервер обычно матерится, что не так

А сервер тебе в ответ такие статусы швырнёт:

  • 200 OK или 204 No Content — принято, братан, заменил твой ресурс, можешь идти.
  • 201 Created — охуенно! На пустом месте создал, молодец.
  • 400 Bad Request — ты мне какую-то хуйню прислал, переделывай.
  • 404 Not Found — а менять-то нечего, пути такого нет (если создавать через PUT нельзя).

Вот и вся магия. Не PATCH, где ковыряешься, как в носу, а разом — хоба! — и новый ресурс. Красиво, блядь.