В чем назначение и особенности HTTP-метода PUT?

Ответ

PUT — это идемпотентный метод HTTP-запроса, предназначенный для полного обновления существующего ресурса или создания нового по указанному URI.

Ключевые характеристики:

  • Полное обновление: Тело запроса содержит полную новую версию ресурса. Все существующие данные по указанному URI заменяются данными из запроса.
  • Идемпотентность: Повторная отправка одного и того же PUT-запроса приводит к тому же состоянию ресурса, что и одиночный запрос. Это ключевое отличие от POST.
  • Создание ресурса: Если ресурс по указанному URI не существует, сервер может (и часто должен) создать его.

Отличие от POST и PATCH:

  • PUT: Полностью заменяет ресурс. Клиент определяет URI ресурса.
  • POST: Обычно используется для создания нового дочернего ресурса. Сервер определяет URI нового ресурса и возвращает его в ответе.
  • PATCH: Применяет частичное обновление к ресурсу, изменяя только указанные в теле запроса поля.

Пример на Go:

// Предположим, у нас есть такая структура
type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

// Обработчик для обновления пользователя
func updateUser(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodPut {
        http.Error(w, "Метод не разрешен", http.StatusMethodNotAllowed)
        return
    }

    // Извлекаем ID пользователя из URL, например /users/123
    // ... логика извлечения id ...

    var updatedUser User
    // Декодируем тело запроса в нашу структуру
    if err := json.NewDecoder(r.Body).Decode(&updatedUser); err != nil {
        http.Error(w, "Некорректное тело запроса", http.StatusBadRequest)
        return
    }

    // ... логика поиска и полного обновления пользователя в базе данных ...

    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Пользователь с ID %d успешно обновлен", updatedUser.ID)
}