НейроАгент

Параметры HTTP POST: Полное руководство

Узнайте, как параметры HTTP POST-запросов отправляются в теле запроса, а не в URL. Изучите различные форматы тела запроса, такие как form-urlencoded, multipart/form-data и JSON. Полное руководство для разработчиков.

Вопрос

Как параметры отправляются в 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-запросе

HTTP POST-запросы отправляют свои параметры в теле запроса, а не в URL. Это принципиально отличается от GET-запросов, которые добавляют параметры в виде строк запроса к URI.

Основные компоненты HTTP POST-запроса:

  1. Строка запроса (метод, URI, версия HTTP)
  2. Заголовки (включая Content-Type и Content-Length)
  3. Тело (содержащее фактические параметры/данные)

Согласно Mozilla Developer Network, в теле запроса содержатся данные, отправляемые на сервер, в то время как заголовки предоставляют метаданные о самом запросе.

Форматы тела запроса

Формат тела запроса зависит от заголовка Content-Type. Вот наиболее распространенные форматы:

application/x-www-form-urlencoded

Это формат по умолчанию для HTML-форм. Данные отправляются в виде пар “ключ-значение”, разделенных символом &, с URL-кодированием ключей и значений.

Пример:

http
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

Этот формат используется при отправке файлов или двоичных данных вместе с данными формы. Каждая часть отделяется строкой-разделителем.

Пример:

http
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-объект.

Пример:

http
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

javascript
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 с данными формы

python
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-форма с загрузкой файла

javascript
const formData = new FormData();
formData.append('username', 'john');
formData.append('avatar', fileInput.files[0]);

fetch('https://api.example.com/upload', {
  method: 'POST',
  body: formData
});

Лучшие практики

  1. Используйте подходящий Content-Type: Сопоставьте формат с типом данных
  2. Включайте Content-Length: Помогает при обработке запроса
  3. Проверяйте ввод: Всегда проверяйте на стороне сервера, независимо от проверки на стороне клиента
  4. Используйте HTTPS: Особенно для конфиденциальных данных
  5. Учитывайте размер файла: Для больших файлов используйте кодировку с чанковой передачей (chunked transfer encoding)

Источники

  1. Метод POST запроса - HTTP | MDN
  2. Как отправляются параметры в HTTP POST-запросе? | Sentry
  3. HTTP запросы, тело, параметры, заголовки и данные - Stack Overflow
  4. application/x-www-form-urlencoded и multipart/form-data - RESTfm Support
  5. Изучение синтаксиса HTTP запросов | JetBrains

Заключение

HTTP POST-запросы отправляют свои параметры в теле запроса, а не в URI, что значительно отличается от GET-запросов. Формат тела зависит от заголовка Content-Type, при этом основными форматами являются application/x-www-form-urlencoded (для простых данных формы), multipart/form-data (для файлов и двоичных данных) и application/json (для API). Понимание этих форматов и случаев их использования является ключевым для эффективной веб-разработки и интеграции API.