Какие методы HTTP-запросов вы знаете?

JuniorHTTP #http #rest

Вопрос

Какие методы HTTP-запросов существуют и чем они отличаются?

Короткий ответ

HTTP-методы описывают намерение запроса к ресурсу: GET — получить, POST — создать/выполнить действие, PUT/PATCH — изменить, DELETE — удалить, HEAD/OPTIONS — служебные.

Подробный ответ

  • GET — получение ресурса. Не должен изменять состояние сервера (безопасный метод), может кэшироваться, параметры передаются в URL.
  • POST — создание нового ресурса или выполнение действия, не описываемого другими методами. Тело запроса произвольное.
  • PUT — полная замена ресурса по известному URL (идемпотентен: повторный вызов с теми же данными даёт тот же результат).
  • PATCH — частичное обновление ресурса (не обязан быть идемпотентным).
  • DELETE — удаление ресурса.
  • HEAD — как GET, но без тела ответа: используется, чтобы проверить существование ресурса или заголовки.
  • OPTIONS — узнать, какие методы поддерживает ресурс; браузер отправляет его автоматически как preflight-запрос перед "непростыми" CORS-запросами.

Важные свойства методов:

МетодБезопасныйИдемпотентныйТело запроса
GET✅✅нет
POST❌❌да
PUT❌✅да
PATCH❌❌да
DELETE❌✅обычно нет

Пример

// Получить список пользователей
await fetch('/api/users')

// Создать пользователя
await fetch('/api/users', {
  method: 'POST',
  body: JSON.stringify({ name: 'Alice' })
})

// Полностью заменить пользователя
await fetch('/api/users/1', {
  method: 'PUT',
  body: JSON.stringify({ name: 'Alice', age: 30 })
})

// Частично обновить пользователя
await fetch('/api/users/1', {
  method: 'PATCH',
  body: JSON.stringify({ age: 31 })
})

// Удалить пользователя
await fetch('/api/users/1', { method: 'DELETE' })

Дополнительные вопросы

  • Почему GET-запрос не должен иметь тело?
  • Что значит "идемпотентность" простыми словами?
  • Зачем браузер отправляет OPTIONS перед CORS-запросом?