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

Какие методы в http передают тело запроса?

2.2 Middle🔥 172 комментариев
#Браузер и сетевые технологии

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы HTTP, передающие тело запроса (body)

В протоколе HTTP не все методы предполагают передачу тела запроса. Тело (body) — это опциональная часть запроса, которая следует за заголовками и содержит данные, которые клиент отправляет серверу. Исторически сложилось, что семантика методов определяет, допустимо ли тело.

Методы, которые ОБЯЗАТЕЛЬНО или ЧАСТО передают тело

Эти методы предназначены для отправки данных на сервер, и наличие тела для них является стандартной практикой.

  1. POST — самый распространённый метод для отправки данных. Используется для создания новых ресурсов или выполнения действий, которые могут включать большие объёмы данных.

    POST /api/users HTTP/1.1
    Host: example.com
    Content-Type: application/json
    
    {
      "name": "Иван",
      "email": "ivan@example.com"
    }
    
  2. PUT — используется для полного обновления ресурса. Клиент отправляет новое представление ресурса, заменяя старое.

    PUT /api/articles/123 HTTP/1.1
    Host: example.com
    Content-Type: application/json
    
    {
      "title": "Новый заголовок",
      "content": "Полностью обновлённое содержимое статьи."
    }
    
  3. PATCH — применяется для частичного обновления ресурса. Тело запроса содержит инструкции (например, в формате JSON Patch) о том, какие изменения применить.

    PATCH /api/articles/123 HTTP/1.1
    Host: example.com
    Content-Type: application/json
    
    [
      { "op": "replace", "path": "/title", "value": "Исправленный заголовок" }
    ]
    

Методы, которые МОГУТ передавать тело, но это реже используется

Согласно последним спецификациям (например, RFC 7231 и RFC 7540), эти методы не запрещают передачу тела, однако серверы могут его игнорировать. Это область, где важно учитывать совместимость.

  1. DELETE — хотя традиционно тело не используется, спецификация не запрещает его. Иногда в теле передают сложные условия для удаления или аудит-информацию. Однако многие серверы, брандмауэры и библиотеки могут не поддерживать body для DELETE.

    DELETE /api/users/batch HTTP/1.1
    Host: example.com
    Content-Type: application/json
    
    {
      "ids": [101, 102, 103],
      "reason": "По требованию регулятора"
    }
    
  2. OPTIONS — метод для определения возможностей сервера или CORS-запросы. Тело допустимо, но на практике почти никогда не используется.

Ключевые технические аспекты передачи тела

  • Content-Type и Content-Length: При отправке тела критически важны заголовки Content-Type (указывает формат данных: application/json, application/x-www-form-urlencoded, multipart/form-data и др.) и Content-Length (или Transfer-Encoding: chunked для потоковой передачи).
  • GET, HEAD, CONNECT, TRACE: Для этих методов передача тела не имеет семантического смысла согласно стандарту. В частности, GET запросы, хотя технически в спецификации HTTP/1.1 явного запрета нет (RFC 7231 говорит, что тело у GET имеет неопределённую семантику), на практике подавляющее большинство серверов, прокси-серверов (например, NGINX по умолчанию отбрасывает тело GET) и клиентских библиотек (таких как fetch в браузерах или axios) его не поддерживают или игнорируют. Использование тела в GET считается антипаттерном, данные для получения ресурса должны передаваться в URL (query-параметры).

Практический совет для Frontend-разработчика

В повседневной работе с RESTful API или GraphQL (где используется POST) вы будете сталкиваться с body в основном в трёх контекстах:

  • Отправка данных форм (POST/PUT/PATCH с Content-Type: multipart/form-data).
  • Взаимодействие с JSON API (почти все POST, PUT, PATCH запросы используют Content-Type: application/json).
  • Загрузка файлов (часто через POST с multipart/form-data).

Пример на JavaScript с использованием Fetch API:

// Типичный POST-запрос с телом в формате JSON
async function createUser(userData) {
  const response = await fetch('https://api.example.com/users', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json', // Важнейший заголовок
      'Authorization': 'Bearer your_token'
    },
    body: JSON.stringify(userData) // Тело запроса
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }
  return await response.json();
}

// Использование
createUser({ name: 'Мария', role: 'admin' })
  .then(data => console.log('Пользователь создан:', data))
  .catch(error => console.error('Ошибка:', error));

Итог: Основными методами для целенаправленной передачи тела являются POST, PUT и PATCH. DELETE может его использовать в специфических сценариях, а GET — следует избегать. Всегда уделяйте внимание правильному установлению заголовка Content-Type на клиенте и его корректной обработке на сервере.