Назовите основные HTTP-методы и объясните их назначение и свойства (идемпотентность, безопасность).

Ответ

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

Ключевые свойства:

  • Безопасный (Safe): Метод не изменяет состояние сервера. Повторные вызовы не приводят к побочным эффектам (например, GET, HEAD).
  • Идемпотентный (Idempotent): Повторный вызов метода с теми же параметрами приводит к тому же результату, что и одиночный. Состояние сервера после первого и последующих запросов будет одинаковым (например, GET, PUT, DELETE).

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

  • GET

    • Назначение: Запрос представления ресурса. Используется для получения данных.
    • Свойства: Безопасный, Идемпотентный.
  • POST

    • Назначение: Отправка данных на сервер для обработки. Чаще всего используется для создания нового ресурса (например, нового пользователя или заказа).
    • Свойства: Небезопасный, Неидемпотентный (два одинаковых POST-запроса создадут два одинаковых ресурса с разными ID).
  • PUT

    • Назначение: Полная замена существующего ресурса или создание нового по известному URI.
    • Свойства: Небезопасный, Идемпотентный (повторный PUT с теми же данными просто перезапишет ресурс тем же самым).
  • PATCH

    • Назначение: Частичное изменение ресурса. В теле запроса передаются только изменяемые поля.
    • Свойства: Небезопасный, Неидемпотентный (в общем случае, т.к. PATCH /users/1 { op: "increment", field: "age" } при повторном вызове изменит состояние).
  • DELETE

    • Назначение: Удаление указанного ресурса.
    • Свойства: Небезопасный, Идемпотентный (повторное удаление уже удаленного ресурса вернет 404 Not Found, но состояние сервера не изменится).
  • HEAD

    • Назначение: Аналогичен GET, но сервер возвращает только заголовки, без тела ответа. Используется для проверки метаданных ресурса (дата изменения, размер) без скачивания всего содержимого.
    • Свойства: Безопасный, Идемпотентный.
  • OPTIONS

    • Назначение: Запрос информации о доступных опциях для ресурса, например, какие HTTP-методы он поддерживает (заголовок Allow).
    • Свойства: Безопасный, Идемпотентный.
// Пример создания POST-запроса в Go для отправки JSON
package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    // Данные, которые мы хотим отправить
    jsonData := []byte(`{"name": "Gopher", "job": "Mascot"}`)

    // Создаем новый запрос с методом POST
    req, err := http.NewRequest("POST", "https://httpbin.org/post", bytes.NewBuffer(jsonData))
    if err != nil {
        panic(err)
    }

    // Устанавливаем заголовок, чтобы сервер знал, что мы отправляем JSON
    req.Header.Set("Content-Type", "application/json")

    // Выполняем запрос
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // Читаем и выводим ответ
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println("Response Status:", resp.Status)
    fmt.Println("Response Body:", string(body))
}