Открыть сервис

POST

POST — это HTTP-метод, предназначенный для отправки данных на сервер с целью создания или изменения ресурса. В отличие от метода GET, который используется для получения данных, POST передаёт информацию в теле запроса, что позволяет отправлять большие объёмы данных, включая файлы, и не ограничивает длину передаваемой строки. POST является одним из наиболее распространённых методов в протоколе HTTP и лежит в основе работы веб-форм, API-интерфейсов и многих других сетевых взаимодействий.

История

Метод POST был определён в первой спецификации HTTP (HTTP/0.9) в 1991 году, однако его функционал был существенно расширен в последующих версиях. В HTTP/1.0 (1996 год) POST стал одним из трёх основных методов наряду с GET и HEAD. В спецификации HTTP/1.1 (1999 год) были детально описаны семантика и правила обработки POST-запросов, включая требования к идемпотентности (отсутствию гарантии, что повторный запрос не приведёт к изменению состояния сервера). С развитием веб-приложений и REST-архитектуры POST стал основным методом для создания ресурсов, а также для выполнения операций, не подпадающих под стандартные CRUD-операции (Create, Read, Update, Delete).

Семантика и поведение

Согласно стандарту HTTP, метод POST не является идемпотентным. Это означает, что повторная отправка одного и того же POST-запроса может привести к различным результатам (например, созданию нескольких одинаковых записей в базе данных). В отличие от PUT, который также используется для отправки данных, POST не предполагает, что клиент знает точный URI создаваемого ресурса — сервер часто сам назначает адрес новому объекту.

Отличия от других методов

  • GET — предназначен только для получения данных, не изменяет состояние сервера, является идемпотентным и кэшируемым.
  • PUT — используется для полной замены ресурса по известному URI, идемпотентен.
  • PATCH — применяется для частичного обновления ресурса, не обязательно идемпотентен.
  • DELETE — удаляет ресурс, идемпотентен.

POST является единственным методом, который стандартно не гарантирует ни идемпотентности, ни безопасности (отсутствия побочных эффектов), что делает его универсальным, но требующим осторожного применения.

Структура POST-запроса

POST-запрос состоит из нескольких частей:

  1. Стартовая строка — содержит метод (POST), URI ресурса и версию HTTP (например, POST /api/users HTTP/1.1).
  2. Заголовки — передают метаинформацию о запросе, такую как тип содержимого (Content-Type), длина тела (Content-Length), аутентификационные данные и т.д.
  3. Тело запроса — содержит передаваемые данные. Формат тела определяется заголовком Content-Type.

Основные типы содержимого (Content-Type)

  • application/x-www-form-urlencoded — данные кодируются как пары ключ=значение, разделённые символом &. Используется в стандартных HTML-формах.
  • multipart/form-data — применяется для отправки файлов и бинарных данных. Каждая часть сообщения имеет свои заголовки.
  • application/json — данные передаются в формате JSON. Широко используется в REST API.
  • text/plain — текст без специального форматирования.
  • application/xml — данные в формате XML.

Пример POST-запроса

Ниже приведён пример POST-запроса для создания нового пользователя в гипотетическом REST API:

``` POST /api/users HTTP/1.1 Host: example.com Content-Type: application/json Content-Length: 52

{ "name": "Иван Петров", "email": "ivan@example.com" } ```

Сервер в ответ может вернуть HTTP-статус 201 Created и в теле ответа — данные созданного ресурса с присвоенным идентификатором.

Применение

Веб-формы

Наиболее распространённое использование POST — отправка данных из HTML-форм. При установке атрибута method="post" в теге <form> браузер формирует POST-запрос, передавая значения полей формы в теле запроса. Это позволяет безопасно передавать пароли, личные данные и большие объёмы текста, не отображая их в URL.

REST API

В архитектуре REST метод POST используется для создания новых ресурсов. Например, POST-запрос на /api/articles создаёт новую статью, а POST на /api/orders — новый заказ. POST также применяется для выполнения действий, не укладывающихся в стандартные CRUD-операции (например, отправка письма, запуск расчёта).

Аутентификация и авторизация

POST часто используется для передачи учётных данных (логин и пароль) на сервер при входе в систему. В этом случае тело запроса может содержать данные в формате JSON или form-urlencoded. Ответ сервера обычно содержит токен доступа или сессионный идентификатор.

Загрузка файлов

Для отправки файлов используется тип содержимого multipart/form-data. POST-запрос может включать как файлы, так и обычные текстовые поля. Загрузка аватаров, документов, изображений — типичные примеры использования POST.

Веб-хуки (Webhooks)

POST является стандартным методом для отправки уведомлений между сервисами. Когда в одном сервисе происходит событие (например, новый заказ), он отправляет POST-запрос с данными о событии на заранее заданный URL другого сервиса.

Безопасность и ограничения

CSRF-атаки

Поскольку POST-запросы могут изменять состояние сервера, они являются целью межсайтовой подделки запросов (CSRF). Для защиты используются CSRF-токены, проверка заголовка Origin или Referer, а также использование SameSite-куки.

Повторная отправка

Из-за неидемпотентности POST повторная отправка запроса (например, при обновлении страницы с результатом отправки формы) может привести к дублированию данных. Для предотвращения этого применяются механизмы редиректа после POST (Post/Redirect/Get, PRG), а также идемпотентные ключи.

Размер данных

Хотя стандарт HTTP не устанавливает жёстких ограничений на размер тела POST-запроса, на практике серверы и прокси могут ограничивать его (например, 1–10 МБ для веб-серверов). Для передачи больших объёмов данных (например, видеофайлов) часто используются другие протоколы или методы (например, chunked transfer encoding).

Шифрование

POST-запросы, как и любые другие HTTP-запросы, могут быть перехвачены при передаче по незащищённому каналу. Для обеспечения конфиденциальности используется протокол HTTPS, который шифрует всё содержимое запроса, включая тело.

POST в веб-разработке

Обработка на стороне сервера

В большинстве серверных языков программирования (PHP, Python, Java, Node.js, Ruby) POST-данные доступны через специальные объекты или массивы. Например, в PHP данные из POST-запроса попадают в суперглобальный массив $_POST, а загруженные файлы — в $_FILES.

RESTful-контроллеры

В современных фреймворках (Django, Laravel, Spring, Express.js) POST-запросы обрабатываются через маршрутизацию. Обычно для каждого ресурса создаётся отдельный обработчик, который принимает данные, валидирует их, сохраняет в базу данных и возвращает ответ.

Тестирование

Для тестирования POST-запросов используются инструменты, такие как cURL, Postman, Insomnia, а также встроенные средства браузеров (инструменты разработчика). Пример команды cURL для отправки POST-запроса:

`` curl -X POST https://api.example.com/users \ -H "Content-Type: application/json" \ -d '{"name":"Иван","email":"ivan@example.com"}' ``

Интересные факты

  • Метод POST может использоваться для отправки запросов, которые не создают ресурс, а выполняют какое-либо действие (например, POST /api/calculate). В таких случаях говорят о «процедурном» использовании POST.
  • В спецификации HTTP/2 и HTTP/3 метод POST сохранил свою семантику, но передача данных стала более эффективной благодаря мультиплексированию и сжатию заголовков.
  • Некоторые веб-серверы (например, Nginx) имеют специальные директивы для ограничения размера POST-запроса (client_max_body_size).
  • В протоколе HTTP/1.1 метод POST может использоваться с заголовком Expect: 100-continue, который позволяет клиенту сначала узнать, готов ли сервер принять тело запроса, и только затем отправлять его.

Источники

  • RFC 7231 — Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
  • RFC 7540 — Hypertext Transfer Protocol Version 2 (HTTP/2)
  • MDN Web Docs: HTTP request methods — POST
  • Fielding, R. T. (2000). Architectural Styles and the Design of Network-based Software Architectures (диссертация, вводит понятие REST)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →