Тема 7: Определение методов HTTP (HTTP Method Definitions). Методы HTTP запросов
Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе…
Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. Сегодня мы с тобой поговорим про HTTP сообщения их структуру и синтаксис. Из статьи ты узнаешь: про структуру HTTP сообщений и про каждый элемент HTTP сообщения в отдельности: про начальную строку сообщения HTTP, про заголовки и тело HTTP сообщений, а так же мы с тобой разберем, как приложения определяют длину HTTP сообщения.
Содержание статьи:
Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол. HTTP сообщение – это способ общения между клиентом и сервером по средствам HTTP протокола. Соответственно, HTTP сообщения делятся на два вида: HTTP сообщения запросы, которые посылает клиент и HTTP сообщения ответы, которые посылает сервер HTTP. В основе формата сообщений HTTP лежит формат IMF, который вы можете найти в RFC 822. Общая структура HTTP сообщений выглядит следующим образом:
Пример HTTP сообщения мы рассмотрим в конце данной записи, сейчас стоит сказать, что по требованиям HTTP серверам следует игнорировать все пустые строки перед начальной строкой HTTP сообщения.
Общий синтаксис начальной строки HTTP сообщения выглядит следующим образом:
[php]
Start-line = Request-Line | Status-Line
[/php]
Когда мы начнем разговор про HTTP запросы и HTTP ответы мы поговорим более подробно о Request-Line и Status-Line, а сейчас давайте приведем пример начальной строки HTTP сообщения:
[php]
GET /hello.htm HTTP/1.1 (этот запрос посылает клиент)
HTTP/1.1 200 OK (таким запросом отвечает сервер)
[/php]
Сразу стоить отметить, что все HTTP заголовки имеют одинаковый формат. Общие заголовки, заголовки ответов и запросов, заголовки объектов у всех у них единый и обобщенный формат. Любое поле заголовка в HTTP сообщение имеет единый синтаксис: имя_заголовка : значение. Имена полей в заголовках HTTP сообщений не чувствительны к регистру символов.
Порядок HTTP заголовков, в котором они получаются, не имеет значения. Однако правилом хорошего тона считается следующий порядок заголовков в HTTP сообщениях: общие заголовки, заголовки запроса или заголовки ответа и последними идут заголовки объекта.
Давайте теперь рассмотрим область применения заголовков в HTTP сообщениях:
Давайте рассмотрим общий синтаксис заголовков в HTTP сообщениях:
[php]
message-header = field-name «:» [ field-value ]
[/php]
А теперь приведем несколько примеров заголовков в HTTP сообщениях:
[php]
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: «34aa387-d-1568eb00»
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
[/php]
Вот так нехитро реализованы заголовки в HTTP сообщениях. Кстати, иногда значения в заголовках могут указываться через запятую.
Тело HTTP сообщения необязательная составляющая HTTP сообщения. Тело HTTP сообщения используется для передачи тела объекта запроса или тела объекта ответа. Между телом объекта и телом HTTP сообщения есть разница только в том случае, когда используется кодирование передачи, кодирование передачи указывается специальным полем Transfer-Encoding. Данное поле является частью HTTP сообщения, а не передаваемого объекта, поэтому его может удалить любая из общающихся сторон. Присутствие тела HTTP сообщения обозначается заголовками Content-Length и Transfer-Encoding.
Общий синтаксис тела HTTP сообщения выглядит так:
[php]
message-body = entity-body
| <entity-body закодированно согласно
Transfer-Encoding>
[/php]
А вот пример тела HTTP сообщения:
[php]
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
[/php]
Если присутствует тело HTTP сообщения, то его длину следует определять одним из следующих методов по порядку:
HTTP сообщения не должны одновременно включать и поле заголовка Content-Length и применять кодирование передачи типа «chunked». Если поступило HTTP сообщение с полем Content-Length и закодированное с применением кодирования передачи «chunked», то поле Content-Length должно игнорироваться.
Если поле Content-Length присутствует в HTTP сообщении, которое допускает наличие тела сообщения, то значение поля должно точно соответствовать числу байтов в теле сообщения. Клиенты версии HTTP/1.1 должны информировать пользователя в случае получения и обнаружения недопустимой длины.
В HTTP есть несколько полей заголовка, которые являются общими для всех типов сообщений HTTP. Эти поля не применяются к передаваемому объекту, а применяются только к сообщению HTTP:
[php]
general-header = Cache-Control ;
| Connection ;
| Date ;
| Pragma ;
| Transfer-Encoding ;
| Upgrade ;
| Via ;
[/php]
Имена общих полей заголовка HTTP сообщений могут быть расширены только с появлением новой версии стандарта HTTP.
Напоследок приведу наглядный пример HTTP сообщения:
На рисунке четко видно, где идет начальная строка HTTP сообщения, где идут заголовки HTTP сообщения, так же показан разделитель HTTP сообщения и тело сообщения. И хочу заметить, что в примере используется HTTP ответ сервера, так как в статусной строке используется код состояния 200, относящийся к успешным кодам состояния. А вот если бы в статусной строке был HTTP метод, то это был бы запрос клиента, у которого были бы другие поля.
Всегда считал что HTTP протокол это что-то хитрое и сложное. Даже в этом убеждаться начал когда читал предыдущие твои посты, но могу сказать что почитав про HTTP сообщения и посмотрев примеры HTTP сообщений я понял что хитрого здесь ничего нет.
Да не, HTTP протокол — это ничего хитрого. Просто логика, придуманная умными дядьками из ЦЕРНа, по которой работают клиенты и сервера. А структура HTTP сообщений действительна простая, все будет кристально ясно и прозрачно в дальнейшем, когда начну разбирать заголовки HTTP сообщений.
А вот сообщения, которые посылает Apache и сообщения, которые посылает IIS — это разные сообщения?
Добрый день!
Если смотреть на эти сообщения со стороны HTTP протокола, то это HTTP сообщения ответа сервера. Если посмотреть на сообщения Apache и на сообщения IIS, то легко можно заметить, что набор заголовков у HTTP сообщений разный и значения могут быть разные. Надеюсь, ответил на ваш вопрос 🙂
Да, спасибо, ответили! А еще один можно?))
http сообщения могут нанести вред моему компьютеру или сайту?
Нет, сами по себе HTTP сообщения не нанесут ни вашему компьютеру, ни вашему сайту никакого вреда. Но, содержимое http сообщений может навредить вашему компьютеру и, есть определенные методы http сообщений, которые позволяют узнать подноготную информацию о вашем сайте, такие методы лучше запрещать в настройках вашего HTTP сервера, но об этом я постараюсь написать в дальнейшем на своем сайте, потому что в комментарий такую простыню текста умещать не хочется.
Добрый день! Спасибо за статью!
Полагаю, произошла описка (последнее слово цитаты):
«Давайте теперь рассмотрим область применения заголовков в HTTP сообщениях:
общие заголовки – общие заголовки получили своё название из-за того, что используются и HTTP сообщениях запросов и в HTTP сообщениях ответов;
заголовки запросов – получили свое название из-за того, что используются в HTTP сообщениях ответов;»