Какие методы 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-запросом?