← Назад к вопросам

Какие знаешь HTTP методы?

1.0 Junior🔥 251 комментариев
#Сетевые протоколы и API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

HTTP методы в контексте разработки на Go

HTTP методы (часто называемые HTTP глаголами) — это ключевые элементы протокола HTTP, определяющие тип операции, которую клиент хочет выполнить с указанным ресурсом. В веб-разработке на Go понимание и правильное использование методов критически важно для создания корректных RESTful API и веб-приложений.

Основные HTTP методы (RFC 7231)

Вот основные методы, которые я постоянно использую в разработке на Go:

  1. GETзапрос данных с указанного ресурса. Не должен изменять состояние сервера (идемпотентный и безопасный). Это самый частый метод.

    // Пример в Go с net/http
    func getHandler(w http.ResponseWriter, r *http.Request) {
        if r.Method != http.MethodGet {
            http.Error(w, "Метод не разрешен", http.StatusMethodNotAllowed)
            return
        }
        // Логика получения данных (например, из БД)
        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(data)
    }
    
  2. POSTотправка сущностей (создание новых ресурсов) на сервер. Не идемпотентный и не безопасный. Часто используется для форм и API.

    func postHandler(w http.ResponseWriter, r *http.Request) {
        if r.Method != http.MethodPost {
            http.Error(w, "Метод не разрешен", http.StatusMethodNotAllowed)
            return
        }
        var newItem Item
        if err := json.NewDecoder(r.Body).Decode(&newItem); err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }
        // Логика создания и сохранения newItem
        w.WriteHeader(http.StatusCreated)
        json.NewEncoder(w).Encode(createdItem)
    }
    
  3. PUTполная замена ресурса данными из запроса. Идемпотентный. Если ресурс существует — заменяет, если нет — создает.

    // В отличие от POST, PUT обычно требует полного представления ресурса
    func putHandler(w http.ResponseWriter, r *http.Request) {
        id := chi.URLParam(r, "id") // Используем маршрутизатор Chi
        var updatedItem Item
        json.NewDecoder(r.Body).Decode(&updatedItem)
        // Логика полной замены ресурса с id
    }
    
  4. PATCHчастичное обновление ресурса. Не идемпотентный в строгом смысле (зависит от реализации). Более эффективен для крупных ресурсов.

    // Часто используется с форматами типа JSON Patch (RFC 6902)
    func patchHandler(w http.ResponseWriter, r *http.Request) {
        var patchOperations []PatchOp
        json.NewDecoder(r.Body).Decode(&patchOperations)
        // Применяем только указанные изменения к ресурсу
    }
    
  5. DELETEудаление указанного ресурса. Идемпотентный.

    func deleteHandler(w http.ResponseWriter, r *http.Request) {
        id := mux.Vars(r)["id"] // Пример с Gorilla Mux
        // Логика удаления ресурса с id
        w.WriteHeader(http.StatusNoContent) // 204 No Content - стандартный ответ
    }
    
  6. HEAD — идентичен GET, но сервер не возвращает тело сообщения. Используется для получения метаданных (заголовков).

    // В Go обработка часто делегируется тому же обработчику, что и GET
    
  7. OPTIONSописание возможностей (доступных методов) для ресурса. Критически важен для CORS в веб-приложениях.

    func optionsHandler(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Allow", "GET, POST, PUT, DELETE, OPTIONS")
        w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
        w.WriteHeader(http.StatusNoContent)
    }
    

Дополнительные методы для профессионалов

  • CONNECT — установка туннеля (прокси) к серверу (HTTPS, WebSockets).
  • TRACE — диагностика, возвращает полученный запрос (редко используется из-за уязвимостей).

Практическое применение в Go

При работе с пакетом net/http и фреймворками (Gin, Echo, Chi) важно:

  1. Проверять метод в обработчике через r.Method или использовать роутеры с привязкой к методам.
  2. Возвращать корректные статус-коды: 405 Method Not Allowed, если метод не поддерживается.
  3. Соблюдать идемпотентность и безопасность для GET, HEAD, OPTIONS, PUT, DELETE.
  4. Использовать семантически верные методы для чистой архитектуры API (например, не использовать GET для изменения данных).
// Пример роутинга с встроенным мультиплексором (с Go 1.22+)
http.HandleFunc("GET /users/{id}", getUserHandler)
http.HandleFunc("PUT /users/{id}", updateUserHandler)
http.HandleFunc("DELETE /users/{id}", deleteUserHandler)
http.HandleFunc("POST /users", createUserHandler)

Понимание HTTP методов — это фундамент для построения предсказуемых, масштабируемых и соответствующих стандартам веб-сервисов на Go. Правильное их использование напрямую влияет на безопасность, производительность и удобство сопровождения кода.

Какие знаешь HTTP методы? | PrepBro