Какие HTTP-методы лежат в основе REST API и за какие операции они отвечают?

Ответ

В основе REST (Representational State Transfer) API лежат стандартные HTTP-методы, которые обычно сопоставляются с CRUD-операциями (Create, Read, Update, Delete).

Основные методы:

  • GET: Получение ресурса. Этот метод идемпотентен (повторные вызовы возвращают тот же результат) и безопасен (не изменяет состояние сервера).

    • Пример: GET /api/users/123 — получить данные пользователя с ID 123.
  • POST: Создание нового ресурса. Не является идемпотентным, так как повторные вызовы создадут несколько ресурсов.

    • Пример: POST /api/users с телом запроса, содержащим данные нового пользователя.
  • PUT: Полное обновление существующего ресурса. Является идемпотентным: повторный вызов с теми же данными не изменит состояние.

    • Пример: PUT /api/users/123 с полным набором полей для обновления.
  • PATCH: Частичное обновление существующего ресурса. Не всегда является идемпотентным (зависит от логики операции).

    • Пример: PATCH /api/users/123 с телом, содержащим только изменяемые поля, например, {"email": "new@example.com"}.
  • DELETE: Удаление ресурса. Идемпотентен: повторное удаление уже удаленного ресурса вернет тот же результат (например, ошибку 404).

    • Пример: DELETE /api/users/123.

Пример простого роутера на Go с использованием стандартной библиотеки net/http:

func usersHandler(w http.ResponseWriter, r *http.Request) {
    // Здесь может быть логика для извлечения ID из URL, например /users/{id}
    switch r.Method {
    case http.MethodGet:
        // Логика получения пользователя
        w.WriteHeader(http.StatusOK)
        w.Write([]byte("Getting a user..."))
    case http.MethodPost:
        // Логика создания пользователя
        w.WriteHeader(http.StatusCreated)
        w.Write([]byte("Creating a user..."))
    case http.MethodPut:
        // Логика полного обновления
        w.WriteHeader(http.StatusOK)
        w.Write([]byte("Updating a user..."))
    case http.MethodDelete:
        // Логика удаления
        w.WriteHeader(http.StatusNoContent) // или http.StatusOK
        w.Write([]byte("Deleting a user..."))
    default:
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    }
}

func main() {
    http.HandleFunc("/api/users/", usersHandler)
    http.ListenAndServe(":8080", nil)
}