← Назад к вопросам
В чем разница между видами запросов?
1.3 Junior🔥 251 комментариев
#Браузер и сетевые технологии
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между видами HTTP запросов (методами)
Основные HTTP методы
HTTP определяет несколько методов для выполнения различных операций над ресурсами. Каждый метод имеет свою семантику и используется для определённых целей.
GET — получение данных
// Получить данные с сервера БЕЗ изменений
fetch('/api/users/123')
.then(res => res.json())
.then(user => console.log(user));
// Характеристики:
// - Безопасный (не изменяет состояние)
// - Идемпотентный (100 запросов = 1 запрос)
// - Данные в URL (видны в браузере, логах, истории)
// - Ограничение размера (обычно 2-8 KB URL)
// - Кэшируется браузером
// - НИКОГДА не используй для чувствительных данных
// ✓ Использовать для:
GET /api/users // Получить всех пользователей
GET /api/users/123 // Получить пользователя по ID
GET /api/search?q=keyword // Поиск
GET /api/users?page=1 // Пагинация
POST — создание новых данных
// Создать новый ресурс
fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'John', email: 'john@example.com' })
})
.then(res => res.json())
.then(newUser => console.log(newUser));
// Характеристики:
// - НЕ безопасный (изменяет состояние сервера)
// - НЕ идемпотентный (100 запросов = 100 новых ресурсов!)
// - Данные в теле запроса (не видны в URL)
// - Нет ограничения размера (можно отправить много данных)
// - НЕ кэшируется браузером
// - Безопаснее для чувствительных данных
// ✓ Использовать для:
POST /api/users // Создать нового пользователя
POST /api/comments // Добавить комментарий
POST /api/auth/login // Логин
POST /api/files/upload // Загрузить файл
POST /api/orders // Создать заказ
PUT — полное обновление (замена)
// ПОЛНОСТЬЮ заменить ресурс
fetch('/api/users/123', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: 'Jane',
email: 'jane@example.com',
age: 28,
country: 'USA'
// ВСЕ поля обязательны!
})
})
.then(res => res.json())
.then(updatedUser => console.log(updatedUser));
// Характеристики:
// - НЕ безопасный (изменяет состояние)
// - Идемпотентный (100 запросов = 1 ресурс)
// - Требует ВСЕ поля (полная замена)
// - Если отправить неполные данные — остальные поля будут удалены
// - Если ресурса нет — может его создать (опционально)
// ✓ Использовать для:
PUT /api/users/123 // Полностью обновить пользователя
PUT /api/settings/123 // Заменить настройки
// ❌ НЕ использовать для:
// Частичного обновления (используй PATCH)
// Создания без ID (используй POST)
PATCH — частичное обновление
// Обновить ТОЛЬКОнекоторые поля
fetch('/api/users/123', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'new@example.com' // Только email меняется!
// Остальные поля СОХРАНЯЮТСЯ
})
})
.then(res => res.json())
.then(updatedUser => console.log(updatedUser));
// Характеристики:
// - НЕ безопасный (изменяет состояние)
// - НЕ всегда идемпотентный (зависит от логики)
// - Требует только изменяемые поля
// - Остальные поля остаются неизменными
// - Более гибкий чем PUT
// ✓ Использовать для:
PATCH /api/users/123 // Обновить некоторые поля пользователя
PATCH /api/profile // Обновить профиль
PATCH /api/settings // Изменить одну настройку
// Пример: обновить только пароль
PATCH /api/users/123
body: { password: "newPassword123" }
DELETE — удаление ресурса
// Удалить ресурс
fetch('/api/users/123', {
method: 'DELETE'
})
.then(res => res.status === 204 ? console.log('Deleted') : res.json());
// Характеристики:
// - НЕ безопасный (изменяет состояние)
// - Идемпотентный (100 удалений = 1 удаление)
// - Обычно возвращает 204 No Content
// - Или 200 OK с телом ответа
// - Может требовать подтверждение
// ✓ Использовать для:
DELETE /api/users/123 // Удалить пользователя
DELETE /api/comments/456 // Удалить комментарий
DELETE /api/files/789 // Удалить файл
DELETE /api/sessions/abc // Выход из системы (удалить сессию)
HEAD — получение метаданных (без тела)
// Как GET, но сервер возвращает ТОЛЬКО заголовки
fetch('/api/users/123', { method: 'HEAD' })
.then(res => {
console.log(res.headers.get('Content-Length')); // Размер без загрузки
console.log(res.headers.get('Last-Modified')); // Время изменения
});
// Характеристики:
// - Безопасный (не изменяет состояние)
// - Идемпотентный
// - Нет тела ответа
// - Используется для проверки доступности ресурса
// ✓ Использовать для:
HEAD /api/users/123 // Проверить, существует ли ресурс
HEAD /files/large.zip // Получить размер файла без загрузки
OPTIONS — получение доступных методов
// Узнать, какие методы поддерживает ресурс
fetch('/api/users/123', { method: 'OPTIONS' })
.then(res => {
console.log(res.headers.get('Allow')); // GET, POST, PUT, DELETE
});
// Характеристики:
// - Безопасный
// - Используется для CORS preflight запросов
// - Браузер отправляет автоматически перед сложными запросами
// Браузер автоматически отправляет OPTIONS перед:
// - POST запросами с нестандартными заголовками
// - PUT/PATCH запросами
// - Запросами с custom Content-Type
// Пример: браузер отправляет OPTIONS сам
// OPTIONS /api/users HTTP/1.1
// Origin: http://example.com
// Access-Control-Request-Method: POST
Сравнение методов
┌────────┬──────────────┬──────────────┬─────────────────────────┐
│ Метод │ Безопасный │ Идемпотентный│ Кэшируется │
├────────┼──────────────┼──────────────┼─────────────────────────┤
│ GET │ ✓ (да) │ ✓ (да) │ ✓ (да, по умолчанию) │
│ POST │ ✗ (нет) │ ✗ (нет) │ ✗ (нет) │
│ PUT │ ✗ (нет) │ ✓ (да) │ ✗ (нет) │
│ PATCH │ ✗ (нет) │ ✗ (может) │ ✗ (нет) │
│ DELETE │ ✗ (нет) │ ✓ (да) │ ✗ (нет) │
│ HEAD │ ✓ (да) │ ✓ (да) │ ✓ (да) │
│ OPTIONS│ ✓ (да) │ ✓ (да) │ ✗ (нет) │
└────────┴──────────────┴──────────────┴─────────────────────────┘
• Безопасный = не изменяет состояние сервера
• Идемпотентный = 100 запросов = 1 запрос
• Кэшируется = браузер может сохранить ответ
Коды ответов
// Успешные ответы (2xx)
GET /api/users // 200 OK
POST /api/users // 201 Created
DELETE /api/users/1 // 204 No Content
// Редирект (3xx)
GET /api/old-url // 301 Moved Permanently
// Ошибка клиента (4xx)
GET /api/users/999 // 404 Not Found
POST /api/login // 401 Unauthorized
POST /api/admin // 403 Forbidden
POST /api/data // 400 Bad Request
// Ошибка сервера (5xx)
GET /api/crash // 500 Internal Server Error
GET /api/busy // 503 Service Unavailable
Практический пример: REST API для TODO
// ПОЛУЧИТЬ все задачи
GET /api/todos
// Ответ: 200 OK
// [{ id: 1, title: "Learn", done: false }, ...]
// ПОЛУЧИТЬ одну задачу
GET /api/todos/1
// Ответ: 200 OK
// { id: 1, title: "Learn", done: false }
// СОЗДАТЬ новую задачу
POST /api/todos
// Body: { title: "Read docs", done: false }
// Ответ: 201 Created
// { id: 2, title: "Read docs", done: false }
// ПОЛНОСТЬЮ обновить задачу
PUT /api/todos/1
// Body: { title: "Learn React", done: true }
// Ответ: 200 OK
// { id: 1, title: "Learn React", done: true }
// ЧАСТИЧНО обновить задачу
PATCH /api/todos/1
// Body: { done: true } (только одно поле)
// Ответ: 200 OK
// { id: 1, title: "Learn", done: true }
// УДАЛИТЬ задачу
DELETE /api/todos/1
// Ответ: 204 No Content
Best Practices
// ✅ ПРАВИЛЬНО: использовать методы по назначению
POST /api/users // Создать
GET /api/users/123 // Получить
PUT /api/users/123 // Полностью обновить
PATCH /api/users/123 // Частично обновить
DELETE /api/users/123 // Удалить
// ❌ НЕПРАВИЛЬНО: не следовать REST
GET /api/deleteUser/123 // DELETE, не GET!
GET /api/createUser // POST, не GET!
POST /api/getUser/123 // GET, не POST!
// ✅ ПРАВИЛЬНО: использовать идемпотентность
GET /api/data // Вызовешь 100 раз = 100 одинаковых ответов
DELETE /api/data/1 // Удалишь 100 раз = 1 удаление, остальное не найдено
// ❌ НЕПРАВИЛЬНО: нарушать идемпотентность
POST /api/data // Каждый вызов создаёт новый ресурс
fetch('/api/data', { method: 'POST', body: {...} });
fetch('/api/data', { method: 'POST', body: {...} });
fetch('/api/data', { method: 'POST', body: {...} });
// 3 разных ресурса создано!
Итог
GET — получить данные (безопасно, идемпотентно, кэшируется) POST — создать новый ресурс (изменяет состояние, не идемпотентно) PUT — полностью заменить ресурс (требует все поля, идемпотентно) PATCH — частично обновить (требует только изменяемые поля) DELETE — удалить ресурс (идемпотентно) HEAD — получить метаданные без тела OPTIONS — получить доступные методы
Выбор метода влияет на:
- Безопасность (изменяет ли состояние)
- Идемпотентность (безопасно ли повторять)
- Кэширование (сохранит ли браузер)
- Семантику API (понимаемость для других разработчиков)