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-запрос состоит из нескольких частей:
- Стартовая строка — содержит метод (POST), URI ресурса и версию HTTP (например,
POST /api/users HTTP/1.1). - Заголовки — передают метаинформацию о запросе, такую как тип содержимого (
Content-Type), длина тела (Content-Length), аутентификационные данные и т.д. - Тело запроса — содержит передаваемые данные. Формат тела определяется заголовком
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 →