Как параметры отправляются в HTTP POST запросе?
В HTTP GET запросе параметры отправляются в виде строки запроса:
http://example.com/page?parameter=value&also=another
В HTTP POST запросе параметры не отправляются вместе с URI.
Где находятся значения? В заголовке запроса? В теле запроса? Как это выглядит?
В HTTP POST-запросе параметры отправляются в теле запроса (request body), а не в URI, как в GET-запросах. Тело запроса содержит данные, отформатированные в соответствии со спецификацией заголовка Content-Type, с распространенными форматами, включая application/x-www-form-urlencoded, multipart/form-data и application/json.
Содержание
- Понимание расположения параметров в HTTP POST-запросе
- Форматы тела запроса
- Заголовки запроса в POST-запросах
- Сравнение с GET-запросами
- Практические примеры
- Лучшие практики
Понимание расположения параметров в HTTP POST-запросе
HTTP POST-запросы отправляют свои параметры в теле запроса, а не в URL. Это принципиально отличается от GET-запросов, которые добавляют параметры в виде строк запроса к URI.
Основные компоненты HTTP POST-запроса:
- Строка запроса (метод, URI, версия HTTP)
- Заголовки (включая Content-Type и Content-Length)
- Тело (содержащее фактические параметры/данные)
Согласно Mozilla Developer Network, в теле запроса содержатся данные, отправляемые на сервер, в то время как заголовки предоставляют метаданные о самом запросе.
Форматы тела запроса
Формат тела запроса зависит от заголовка Content-Type. Вот наиболее распространенные форматы:
application/x-www-form-urlencoded
Это формат по умолчанию для HTML-форм. Данные отправляются в виде пар “ключ-значение”, разделенных символом &, с URL-кодированием ключей и значений.
Пример:
POST /test HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
field1=value1&field2=value2
Как объясняется в документации MDN, “Медиа-тип по умолчанию в POST-запросе — application/x-www-form-urlencoded. Это формат для кодирования пар “ключ-значение”. Ключи могут быть дублированными. Каждая пара “ключ-значение” разделяется символом &, а каждый ключ отделяется от его значения символом =.”
multipart/form-data
Этот формат используется при отправке файлов или двоичных данных вместе с данными формы. Каждая часть отделяется строкой-разделителем.
Пример:
POST /test HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary="delimiter12345"
Content-Length: 125
--delimiter12345
Content-Disposition: form-data; name="field1"
value1
--delimiter12345
Content-Disposition: form-data; name="field2"; filename="example.txt"
Content-Type: text/plain
value2
--delimiter12345--
В документации MDN отмечается, что “multipart/form-data используется, когда форма включает файлы или большие объемы данных. Это тело запроса разделяет каждую часть формы с помощью строки-разделителя.”
application/json
Этот формат широко используется с REST API и современными веб-приложениями. Тело содержит JSON-объект.
Пример:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 85
{
"name": "John Doe",
"email": "john@example.com",
"age": 30
}
Как показано в документации Sentry, этот формат широко используется для API-запросов.
Другие форматы тела запроса
- text/plain: Простые текстовые данные
- application/xml: Данные в формате XML
- application/octet-stream: Двоичные данные
Например, вы можете использовать text/plain для отправки простого текстового сообщения в теле POST-запроса.
Заголовки запроса в POST-запросах
Хотя параметры находятся в теле, заголовки играют важную роль в POST-запросах:
- Content-Type: Указывает формат тела запроса
- Content-Length: Указывает размер тела запроса
- Authorization: Содержит учетные данные для аутентификации
- User-Agent: Идентифицирует клиентское программное обеспечение
Согласно документации HTTP-сообщений, “Заголовки — это метаданные, отправляемые вместе с запросом после стартовой строки и перед телом.”
Сравнение с GET-запросами
| Аспект | GET-запрос | POST-запрос |
|---|---|---|
| Расположение параметров | Строка запроса URI | Тело запроса |
| Ограничения по размеру | Ограничена длиной URL | Ограничена конфигурацией сервера |
| Кэширование | Может кэшироваться | Обычно не кэшируется |
| Закладки | Можно добавить в закладки | Нельзя добавить в закладки с параметрами |
| Безопасность | Параметры видны в URL | Параметры не видны в URL |
Практические примеры
JavaScript fetch() с JSON
const login = await fetch('https://www.example.com/api/auth/login', {
method: 'POST',
body: JSON.stringify({
email: 'bob@example.com',
password: '123',
}),
headers: {
'Content-Type': 'application/json',
},
});
Python requests с данными формы
import requests
response = requests.post(
'https://api.example.com/submit',
data={'key': 'value'}, # application/x-www-form-urlencoded
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
Multipart-форма с загрузкой файла
const formData = new FormData();
formData.append('username', 'john');
formData.append('avatar', fileInput.files[0]);
fetch('https://api.example.com/upload', {
method: 'POST',
body: formData
});
Лучшие практики
- Используйте подходящий Content-Type: Сопоставьте формат с типом данных
- Включайте Content-Length: Помогает при обработке запроса
- Проверяйте ввод: Всегда проверяйте на стороне сервера, независимо от проверки на стороне клиента
- Используйте HTTPS: Особенно для конфиденциальных данных
- Учитывайте размер файла: Для больших файлов используйте кодировку с чанковой передачей (chunked transfer encoding)
Источники
- Метод POST запроса - HTTP | MDN
- Как отправляются параметры в HTTP POST-запросе? | Sentry
- HTTP запросы, тело, параметры, заголовки и данные - Stack Overflow
- application/x-www-form-urlencoded и multipart/form-data - RESTfm Support
- Изучение синтаксиса HTTP запросов | JetBrains
Заключение
HTTP POST-запросы отправляют свои параметры в теле запроса, а не в URI, что значительно отличается от GET-запросов. Формат тела зависит от заголовка Content-Type, при этом основными форматами являются application/x-www-form-urlencoded (для простых данных формы), multipart/form-data (для файлов и двоичных данных) и application/json (для API). Понимание этих форматов и случаев их использования является ключевым для эффективной веб-разработки и интеграции API.