Назовите основные методы HTTP, их предназначение и идемпотентность. Как они представлены в Go?

Ответ

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

Основные методы и их назначение:

  • GET: Запрашивает представление ресурса. Не изменяет состояние сервера. Идемпотентный.
  • POST: Отправляет данные на сервер для создания нового ресурса (например, добавление пользователя). Повторные вызовы создают новые ресурсы. Не является идемпотентным.
  • PUT: Полностью заменяет существующий ресурс данными из тела запроса. Если ресурс не существует, может его создать. Идемпотентный (повторные вызовы с теми же данными не меняют результат).
  • DELETE: Удаляет указанный ресурс. Идемпотентный (повторное удаление уже удаленного ресурса вернет тот же результат, например, 404 Not Found).
  • PATCH: Применяет частичные изменения к ресурсу. Не является идемпотентным по своей природе, хотя может быть реализован идемпотентно.
  • HEAD: Аналогичен GET, но сервер возвращает только заголовки, без тела ответа. Используется для проверки существования ресурса или получения метаданных. Идемпотентный.
  • OPTIONS: Запрашивает информацию о доступных опциях взаимодействия с ресурсом (например, какие методы разрешены). Идемпотентный.

Идемпотентность означает, что многократное повторение одного и того же запроса приводит к тому же результату, что и одиночный запрос.

Представление в Go:

В стандартной библиотеке net/http методы HTTP представлены в виде строковых констант для удобства и предотвращения опечаток:

http.MethodGet     // "GET"
http.MethodPost    // "POST"
http.MethodPut     // "PUT"
http.MethodDelete  // "DELETE"
http.MethodPatch   // "PATCH"
http.MethodHead    // "HEAD"
http.MethodOptions // "OPTIONS"

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

func handleUsers(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case http.MethodGet:
        // Логика для получения списка пользователей
        fmt.Fprintln(w, "Getting users...")
    case http.MethodPost:
        // Логика для создания нового пользователя
        fmt.Fprintln(w, "Creating a user...")
    default:
        // Сообщаем клиенту, что данный метод не поддерживается
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    }
}

Официальная спецификация методов находится в RFC 7231 и RFC 5789 (для PATCH).