В каком виде передаются данные по протоколу HTTP?

«В каком виде передаются данные по протоколу HTTP?» — вопрос из категории Сети, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Данные в HTTP передаются в виде структурированного текстового сообщения, разделенного на **стартовую строку, заголовки (headers)** и опциональное **тело (body)**. В контексте C++ это часто означает работу с сырыми сокетами или библиотеками вроде libcurl. **Структура HTTP-запроса (клиент -> сервер):** ```http POST /api/v1/data HTTP/1.1rn <-- Стартовая строка (метод, URI, версия) Host: example.comrn <-- Заголовки (ключ: значение) Content-Type: application/jsonrn Content-Length: 23rn rn <-- Пустая строка - разделитель {"sensor": 42} <-- Тело сообщения (если есть) ``` **Структура HTTP-ответа (сервер -> клиент):** ```http HTTP/1.1 200 OKrn <-- Стартовая строка (версия, код статуса, фраза) Content-Type: text/htmlrn Content-Length: 21rn rn

Success

<-- Тело сообщения ``` **Ключевые моменты для C++ разработчика:** 1. **Формат текстовый, но тело — бинарное.** Заголовки — это текст в кодировке ASCII/UTF-8, разделенный `rn`. Тело (`body`) — это просто поток байтов, интерпретация которого задается заголовком `Content-Type` (JSON, protobuf, изображение). 2. **`Content-Length` или `Transfer-Encoding: chunked`.** Для определения границ тела. Без этого невозможно корректно прочитать ответ из сокета. 3. **Работа в C++:** На низком уровне это чтение/запись в сокет (`send()`, `recv()`) с буферизацией и парсингом строк. На практике используют библиотеки (Boost.Beast, libcurl, httplib), которые абстрагируют эту работу. ```cpp // Примерная логика (псевдокод) низкоуровневого чтения ответа: std::string readHttpResponse(Socket& sock) { std::string headers = readUntil(sock, "rnrn"); // Читаем до пустой строки size_t contentLength = extractContentLength(headers); // Парсим заголовок std::vector body(contentLength); sock.read(body.data(), contentLength); // Читаем ровно столько байт тела return std::string(body.begin(), body.end()); } ```