Ответ
Основные 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
). - Свойства: Безопасный, Идемпотентный.
- Назначение: Запрос информации о доступных опциях для ресурса, например, какие HTTP-методы он поддерживает (заголовок
// Пример создания 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))
}