Ответ
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)
}