← Назад к вопросам

В чем разница между видами запросов?

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 (понимаемость для других разработчиков)
В чем разница между видами запросов? | PrepBro