--- title: Сообщения HTTP slug: Web/HTTP/Messages tags: - HTTP - Веб Механика - Руководство translation_of: Web/HTTP/Messages --- <div>{{HTTPSidebar}}</div> <p class="summary">HTTP сообщения - это обмен данными между сервером и клиентом. Есть два типа сообщений: <em><strong>запросы</strong></em>, отправляемые клиентом, чтобы инициировать реакцию со стороны сервера, и <em><strong>ответы </strong></em>от сервера.</p> <p>Сообщения HTTP состоят из текстовой информации в кодировке ASCII, записанной в несколько строк. В HTTP/1.1 и более ранних версиях они пересылались в качестве обычного текста. В HTTP/2 текстовое сообщение разделяется на фреймы, что позволяет выполнить оптимизацию и повысить производительность.</p> <p>Веб разработчики не создают текстовые сообщения HTTP самостоятельно - это делает программа, браузер, прокси или веб-сервер. Они обеспечивают создание HTTP сообщений через конфигурационные файлы (для прокси и серверов), APIs (для браузеров) или другие интерфейсы.</p> <p><img alt="From a user-, script-, or server- generated event, an HTTP/1.x msg is generated, and if HTTP/2 is in use, it is binary framed into an HTTP/2 stream, then sent." src="https://mdn.mozillademos.org/files/13825/HTTPMsg2.png" style="height: 538px; width: 1174px;"></p> <p>Механизм бинарного фрагментирования в HTTP/2 разработан так, чтобы не потребовалось вносить изменения в имеющиеся APIs и конфигурационные файлы: он вполне прозрачен для пользователя.</p> <p>HTTP запросы и ответы имеют близкую структуру. Они состоят из:</p> <ol> <li>Стартовой строки, описывающей запрос, или статус (успех или сбой). Это всегда одна строка.</li> <li>Произвольного набора <em>HTTP заголовков,</em> определяющих запрос или описывающих тело сообщения.</li> <li>Пустой строки, указывающей, что вся мета информация отправлена.</li> <li>Произвольного тела, содержащего пересылаемые с запросом данные (например, содержимое HTML-формы ) или отправляемый в ответ документ. Наличие тела и его размер определяется стартовой строкой и заголовками HTTP.</li> </ol> <p>Стартовую строку вместе с заголовками сообщения HTTP называют <em>головой</em> запроса, а его данные - <em>телом</em>.</p> <p><img alt="Requests and responses share a common structure in HTTP" src="https://mdn.mozillademos.org/files/13827/HTTPMsgStructure2.png" style="height: 368px; width: 1239px;"></p> <h2 id="Запросы_HTTP">Запросы HTTP</h2> <h3 id="Стартовая_строка">Стартовая строка</h3> <p>HTTP запросы - это сообщения, отправляемые клиентом, чтобы инициировать реакцию со стороны сервера. Их стартовая строка состоит из трёх элементов:</p> <ol> <li> <p><em><a href="/ru/docs/Web/HTTP/Methods">Метод HTTP</a></em>, глагол (например, {{HTTPMethod("GET")}}, {{HTTPMethod("PUT")}} или {{HTTPMethod("POST")}}) или существительное (например, {{HTTPMethod("HEAD")}} или {{HTTPMethod("OPTIONS")}}), описывающие требуемое действие. Например, <code>GET</code> указывает, что нужно доставить некоторый ресурс, а <code>POST</code> означает отправку данных на сервер (для создания или модификации ресурса, или генерации возвращаемого документа).</p> </li> <li><em>Цель запроса</em>, обычно {{glossary("URL")}}, или абсолютный путь протокола, порт и домен обычно характеризуются контекстом запроса. Формат цели запроса зависит от используемого HTTP-метода. Это может быть <ul> <li>Абсолютный путь, за которым следует <code>'?'</code> и строка запроса. Это самая распространённая форма, называемая <em>исходной формой</em> (<em>origin form</em>) . Используется с методами <code>GET</code>, <code>POST</code>, <code>HEAD</code>, и <code>OPTIONS</code>.<br> <code>POST / HTTP 1.1<br> GET /background.png HTTP/1.0<br> HEAD /test.html?query=alibaba HTTP/1.1<br> OPTIONS /anypage.html HTTP/1.0</code></li> <li>Полный URL<em> - абсолютная форма</em> (<em>absolute form</em>) , обычно используется с <code>GET</code> при подключении к прокси.<br> <code>GET http://developer.mozilla.org/ru/docs/Web/HTTP/Messages HTTP/1.1</code></li> <li>Компонента URL "authority", состоящая из имени домена и (необязательно) порта (предваряемого символом <code>':'</code>), <em>называется authority form</em>. Используется только с методом <code>CONNECT</code> при установке туннеля HTTP.<br> <code>CONNECT developer.mozilla.org:80 HTTP/1.1</code></li> <li>Форма звёздочки (<em>asterisk form)</em>, просто "звёздочка" (<code>'*'</code>) используется <code>с методом OPTIONS</code> и представляет сервер.<br> <code>OPTIONS * HTTP/1.1</code></li> </ul> </li> <li><em>Версия HTTP</em>, определяющая структуру оставшегося сообщения, указывая, какую версию предполагается использовать для ответа.</li> </ol> <h3 id="Заголовки">Заголовки</h3> <p><a href="/ru/docs/Web/HTTP/Headers">Заголовки запроса HTTP</a> имеют стандартную для заголовка HTTP структуру: не зависящая от регистра строка, завершаемая (<code>':'</code>) и значение, структура которого определяется заголовком. Весь заголовок, включая значение, представляет собой одну строку, которая может быть довольно длинной.</p> <p>Существует множество заголовков запроса. Их можно разделить на несколько групп:</p> <ul> <li><em>Основные заголовки (General headers</em>), например, {{HTTPHeader("Via")}}, относящиеся к сообщению в целом</li> <li><em>Заголовки запроса (Request headers</em>), например, {{HTTPHeader("User-Agent")}}, {{HTTPHeader("Accept-Type")}}, уточняющие запрос (как, например, {{HTTPHeader("Accept-Language")}}), придающие контекст (как {{HTTPHeader("Referer")}}), или накладывающие ограничения на условия (like {{HTTPHeader("If-None")}}).</li> <li><em>Заголовки сущности</em>, например {{HTTPHeader("Content-Length")}}, относящиеся к телу сообщения. Как легко понять, они отсутствуют, если у запроса нет тела.</li> <li><img alt="Example of headers in an HTTP request" src="https://mdn.mozillademos.org/files/13821/HTTP_Request_Headers2.png" style="height: 280px; width: 872px;"></li> </ul> <h3 id="Тело">Тело</h3> <p>Последней частью запроса является его тело. Оно бывает не у всех запросов: запросы, собирающие (fetching) ресурсы, такие как <code>GET</code>, <code>HEAD</code>, <code>DELETE</code>, или <code>OPTIONS</code>, в нем обычно не нуждаются. Но некоторые запросы отправляют на сервер данные для обновления, как это часто бывает с запросами <code>POST</code> (содержащими данные HTML-форм).</p> <p>Тела можно грубо разделить на две категории:</p> <ul> <li>Одноресурсные тела (Single-resource bodies), состоящие из одного отдельного файла, определяемого двумя заголовками: {{HTTPHeader("Content-Type")}} и {{HTTPHeader("Content-Length")}}.</li> <li><a href="https://developer.mozilla.org/ru/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data">Многоресурсные тела (Multiple-resource bodies</a>), состоящие из множества частей, каждая из которых содержит свой бит информации. Они обычно связаны с <a href="/ru/docs/Web/Guide/HTML/Forms">HTML-формами </a>.</li> </ul> <h2 id="Ответы_HTTP">Ответы HTTP</h2> <h3 id="Строка_статуса_Status_line">Строка статуса (Status line)</h3> <p>Стартовая строка ответа HTTP, называемая строкой статуса, содержит следующую информацию:</p> <ol> <li><em>Версию протокола</em>, <code>обычно HTTP/1.1</code>.</li> <li><em>Код состояния (status code)</em>, показывающая, был ли запрос успешным. Примеры: {{HTTPStatus("200")}}, {{HTTPStatus("404")}} или {{HTTPStatus("302")}}</li> <li><em>Пояснение (status text</em>). Краткое текстовое описание кода состояния, помогающее пользователю понять сообщение HTTP..</li> </ol> <p>Пример строки статуса: <code>HTTP/1.1 404 Not Found.</code></p> <h3 id="Заголовки_2">Заголовки</h3> <p><a href="/ru/docs/Web/HTTP/Headers">Заголовки ответов HTTP</a> имеют ту же структуру, что и все остальные заголовки: не зависящая от регистра строка, завершаемая двоеточием (<code>':'</code>) и значение, структура которого определяется типом заголовка. Весь заголовок, включая значение, представляет собой одну строку.</p> <p>Существует множество заголовков ответов. Их можно разделить на несколько групп:</p> <ul> <li><em>Основные заголовки (General headers</em>), например, {{HTTPHeader("Via")}}, относящиеся к сообщению в целом.</li> <li><em>Заголовки ответа (Response headers</em>), например, {{HTTPHeader("Vary")}} и {{HTTPHeader("Accept-Ranges")}}, сообщающие дополнительную информацию о сервере, которая не уместилась в строку состояния.</li> <li><em>Заголовки сущности (Entity headers</em>), например, {{HTTPHeader("Content-Length")}}, относящиеся к телу ответа. Отсутствуют, если у запроса нет тела.</li> </ul> <p><img alt="Example of headers in an HTTP response" src="https://mdn.mozillademos.org/files/13823/HTTP_Response_Headers2.png" style="height: 344px; width: 805px;"></p> <h3 id="Тело_2">Тело</h3> <p>Последней частью ответа является его тело. Оно есть не у всех ответов: у ответов с кодом состояния, например, {{HTTPStatus("201")}} или {{HTTPStatus("204")}}, оно обычно отсутствует.</p> <p>Тела можно разделить на три категории:</p> <ul> <li>Одноресурсные тела (Single-resource bodies), состоящие из отдельного файла известной длины, определяемые двумя заголовками: {{HTTPHeader("Content-Type")}} и {{HTTPHeader("Content-Length")}}.</li> <li>Одноресурсные тела (Single-resource bodies), состоящие из отдельного файла неизвестной длины, разбитого на небольшие части (chunks) с заголовком {{HTTPHeader("Transfer-Encoding")}}, значением которого является <code>chunked</code>.</li> <li><a href="https://developer.mozilla.org/ru/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data">Многоресурсные тела (Multiple-resource bodies)</a>, состоящие из многокомпонентного тела, каждая часть которого содержит свой сегмент информации. Они относительно редки.</li> </ul> <h2 id="Фреймы_HTTP2">Фреймы HTTP/2</h2> <p>Сообщения HTTP/1.x имеют несколько недостатков в отношении производительности:</p> <ul> <li>Заголовки, в отличие от тел, не сжимаются.</li> <li>Заголовки, которые зачастую практически совпадают у идущих подряд сообщений, приходится передавать по отдельности.</li> <li>Мультиплексность невозможна. Приходится открывать соединение для каждого сообщения, а тёплые (warm) соединения TCP эффективнее холодных (cold).</li> </ul> <p>HTTP/2 переходит на новый уровень: он делит сообщения HTTP/1.x на фреймы, которые внедряются в поток. Фреймы данных из заголовков отделены друг от друга, что позволяет сжимать заголовки. Несколько потоков можно объединять друг с другом - такой процесс называется мультиплексированием - что позволяет более эффективно использовать TCP-соединения.</p> <p><img alt="HTTP/2 modify the HTTP message to divide them in frames (part of a single stream), allowing for more optimization." src="https://mdn.mozillademos.org/files/13819/Binary_framing2.png" style="height: 735px; width: 810px;"></p> <p>Фреймы HTTP сейчас прозрачны для веб-разработчиков. Это дополнительный шаг, который HTTP/2 делает по отношению к сообщениям HTTP/1.1 и лежащему в основе транспортному протоколу. Для реализации фреймов HTTP веб-разработчикам не требуется вносить изменения в имеющиеся APIs; если HTTP/2 доступен и на сервере, и на клиенте, он включается и используется.</p> <h2 id="Заключение">Заключение</h2> <p>Сообщения HTTP играют ключевую роль в использовании HTTP; они имеют простую структуру и хорошо расширяемы. Механизм фреймов в HTTP/2 добавляет ещё один промежуточный уровень между синтаксисом HTTP/1.x и используемым им транспортным протоколом, не проводя фундаментальных изменений: создаётся надстройка над уже зарекомендовавшими себя методами.</p>