Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. В этой записи ты узнаешь всё что можно про запросы HTTP протокола.  Для начала мы с тобой разберем структуру HTTP запроса, затем мы посмотрим, что собой представляет строка HTTP запроса, потом мы поговорим с тобой о методах HTTP запроса и ты узнаешь, собственно, что такое метод. Потом мы плавно перейдем к идентификаторам ресурса в HTTP запросе (Request-URI, если не совсем понятно), после чего мы с тобой разберем поля заголовков HTTP запроса и в конце этой записи мы с тобой разберем пару примеров HTTP запросов, которые, для закрепления прочитанного, ты можешь написать самостоятельно, как делает твой браузер, через который ты зашел на этот сайт.

HTTP запрос: заголовки HTTP запроса, методы HTTP запроса, строка HTTP запроса, ресурсы HTTP запроса, примеры запросов

HTTP запрос: заголовки HTTP запроса, методы HTTP запроса, строка HTTP запроса, ресурсы HTTP запроса, примеры запросов

Структура HTTP запроса

Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол.  HTTP запрос – это HTTP сообщение, которое клиент посылает HTTP серверу.  Обычно HTTP запрос содержит:

  • строку запроса, в которой указывается версия HTTP протокола и HTTP метод запроса;
  • ноль или несколько заголовков, разделенных между собой символом конца строки, в которых передаются другие HTTP праметры для успешного HTTP соединения;
  • пустую строку, чтобы отделить служебную информацию от тела сообщения;
  • необязательное тело сообщения.

Вот так выглядит общий синтаксис (общая структура HTTP запроса):

[php]

Request       = Request-Line              ;

*( general-header         ;

| request-header         ;

| entity-header )        ;

CRLF

[ message-body ]          ;

[/php]

В первой строке HTTP сообщения обычно содержится HTTP метод, который нужно применить к ресурсу, который запрашивает клиент, идентификатор ресурса (читай URI в HTTP) и версию HTTP протокола. Далее мы рассмотрим каждую часть HTTP запроса в отдельности и приведем пример HTTP запроса.

Строка HTTP запроса

Строка HTTP запроса начинается с маркера/метки метода, после которой следует URI запрашиваемого ресурса (если не понятно, читай про параметры HTTP протокола), версия HTTP протокола и символ CRLF, который означает конец строки HTTP запроса. Синтаксис строки HTTP запроса:

[php]

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

[/php]

Предлагаю рассмотреть в отдельности каждую часть строки HTTP запроса в отдельности.

HTTP метод запроса

Метод HTTP запроса указывает серверу, как нужно обращаться к запрашиваемому ресурсу, который указан в URI. Метод HTTP запроса чувствителен к регистру и его имя следует указывать только в верхнем регистре. Давайте перечислим все метода HTTP запроса, я сведу их в одну таблицу:

Номер HTTP метод запроса и его описание
1 GET

Метод HTTP запроса GET используется для получения информации с сервера по указанному URI. HTTP запросы, использующие метод GET должны получать только данные и не должны оказывать никакого влияния на эти данные.
2 HEAD

Принцип работы метода HEAD в HTTP запросе аналогичен методу GET, но метод HEAD не передает тело сообщения (HTTP объект).
3 POST

HTTP запрос POST используется для отправки данных на HTTP сервер, например, когда вы заполняете HTML форму на сайте.
4 PUT

HTTP запросы с методом PUT сохраняются под запрашиваемым URI. То есть метод PUT используется для замены контента.
5 DELETE

Метод DELETE при HTTP запросе позволяет запросить сервер удалить данные ресурса, указанного в URI.
6 CONNECT

HTTP запрос с методом CONNECT позволяет установить  туннель к серверу, который указан в URI.
7 OPTIONS

HTTP запрос с методом OPTION позволяет получить параметры для связи с ресурсом.
8 TRACE

При HTTP запросе с методом TRACE можно отследить то, что происходит с вашими запросами.

Список методов, которые можно применить к ресурсу, может быть указан в поле заголовка Allow. HTTP сервер всегда должен возвращать код состояния ответа, чтобы сообщить клиенту: допустим метод или нет.

URI HTTP запроса (Request-URI). Запрашиваемый URI

URI HTTP запроса (Request-URI) или запрашиваемый URI для нас в большинстве случаев это обычный URL, который дает однозначное понимание HTTP серверу к какому ресурсу мы хотим обратиться:

[php] Request-URI    = «*» | absoluteURI | abs_path [/php]

У URI, когда мы делаем HTTP запрос, есть три опции, которые зависят от характера запроса. Звездочка в предыдущем примере означает, что мы хотим обратиться не к какому-то ресурсу, а непосредственно к HTTP серверу. Такой способ допустим только в том случае, когда используемый метод HTTP запроса не обязательно обращается к ресурсу, например:

[php] OPTIONS * HTTP/1.1 [/php]

absoluteURI URI необходим при HTTP запросе в том случае, когда HTTP запрос производится при помощи прокси-сервера. Прокси-сервер может передать этот запрос HTTP серверу, а может дать ответ из своего кэша, пример absoluteURI в HTTP запросе:

[php] GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1 [/php]

Обращу ваше внимание на то, что в версии HTTP протокола 1.1 клиенты должны использовать absoluteURI только для обращений к прокси-серверам.

Рассмотрим третий вид URI в HTTP запросе, наиболее общую и часто встречаемую форму Request-URI, данную форму Request-URI используют для идентификации ресурса на конечном HTTP сервере, при этом абсолютный путь URI передается в HTTP запросе, как Request-URI, а вот сетевое расположение ресурса передается в поле Host HTTP заголовка. Пример:

[php]

GET /pub/WWW/TheProject.html HTTP/1.1

Host: www.w3.org

[/php]

Обратите внимание, что абсолютный путь не может быть пустым; если оригинальный URI пуст, то он должен запрашиваться как «/» (корневой каталог сервера). Первоначальный сервер должен декодировать Request-URI (кодирование в HTTP), чтобы правильно интерпретировать запрос. Серверам следует отвечать на недопустимые Request-URI соответствующим кодом состояния.

В запросах, которые передаются далее, прокси-сервера никогда не должны перезаписывать часть «abs_path» запрашиваемого URI (Request-URI), за исключением случая, отмеченного выше, когда пустой abs_path заменяется на «*», независимо от внутренней реализации прокси-сервера.

Первоначальные HTTP/1.1 сервера должны учитывать, что точный ресурс, идентифицированный интернет-запросом определяется как Request-URI, так и полем заголовка Host. Первоначальный сервер, который различает ресурсы, основанные на запрошенном хосте (иногда называемые виртуальными хостами или vanity hostnames) должен использовать следующие правила для определения запрошенного в HTTP/1.1 запросе ресурса:

  1. Если Request-URI — это absoluteURI, то хост — это часть Request-URI. Любое значение поля заголовка Host в запросе ДОЛЖНО игнорироваться (напомню про требования HTTP).
  2. Если Request-URI — не absoluteURI, а запрос содержит поле заголовка Host, то хост определяется значением поля заголовка Host.
  3. Если хоста, определенного правилами 1 или 2 не существует на сервере, код состояния ответа должен быть 400 (Испорченный Запрос, Bad Request).

Получатели HTTP/1.0 запроса, в котором недостает поля заголовка Host, могут пытаться использовать эвристику (например, исследовать путь в URI на предмет уникальности на каком-либо из хостов) чтобы определить какой точно ресурс запрашивается.

Поля заголовка HTTP запроса

Поля заголовка HTTP запроса дают возможность клиенту передавать дополнительную, уточняющую и служебную информацию о HTTP запросе и о самом себе любимом. Поля заголовка HTTP запроса это что-то вроде модификаторов HTTP запроса. Если вы изучали какой-нибудь язык программирования, то заголовки HTTP запроса можно сравнить с параметрами, которые мы передаем в функцию для ее вызова:

[php]

request-header = Accept

| Accept-Charset

| Accept-Encoding

| Accept-Language

| Authorization

| From

| Host

| If-Modified-Since

| If-Match

| If-None-Match

| If-Range

| If-Unmodified-Since

| Max-Forwards

| Proxy-Authorization

| Range

| Referer

| User-Agent

[/php]

Никто не запрещает вам ввести свои собственные поля заголовков HTTP запроса, если вы решите написать свой собственный клиент или HTTP сервер.

Примеры HTTP запросов

Давайте теперь разберем несколько примеров HTTP запросов. Пример HTTP запроса для получения простой HTML страницы: представим, что на сайте example.org лежит HTML документ, который называется hello.htm, http запрос для него будет выглядеть примерно следующим образом:

[php]

GET /hello.htm HTTP/1.1

User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

Host: www.example.com

Accept-Language: ru-ru

Accept-Encoding: gzip, deflate

Connection: Keep-Alive

[/php]

Этим запросом мы не посылаем никаких данных на сервер, потому что мы хотим получить простую HTML страницу с сервера. Давайте теперь посмотрим пример HTTP запроса, который отправляет данные HTML формы на сервер с помощью тела HTTP сообщения:

[php]

POST /cgi-bin/process.cgi HTTP/1.1

User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

Host: www.example.com

Content-Type: application/x-www-form-urlencoded

Content-Length: length

Accept-Language: ru-ru

Accept-Encoding: gzip, deflate

Connection: Keep-Alive

 

licenseID=string&content=string&/paramsXML=string

[/php]

В стартовой строке указан URL /cgi-bin/process.cgi – он будет использован для обработки данных, которые мы передадим серверу в запросе, на такой запрос мы даже получим от сервера ответ. Content-Type сообщает серверу о том, что данные, которые мы хотим передать серверу – это простая HTML форма.

Возможно, эти записи вам покажутся интересными


Выберете удобный для себя способ, чтобы оставить комментарий

This article has 6 comments

  1. darkmAn Reply

    Спасибо, очень просто и понятно написано. Одно единственное уточнение. На вашем блоге я ранее прочел про сообщения, чем они отличаются от HTTP запросов?

    • Кирилл Reply

      darkmAn, да в принципе ничем не отличается, нужно лишь понимать, что HTTP запрос — это частный случай HTTP сообщения. Под сообщениями можно еще понимать ответы сервера, а вот HTTP запросы — это такие сообщения, которые клиент отправляет серверу.

  2. Вик Reply

    А как же посложней примеры? Как насчет HTTP запросов к страницам с видео или музыкой?

    • Кирилл Reply

      Посложней пример можешь посмотреть, взяв HTTP сканер, например, в Firefox есть плагин для анализа HTTP, и зайти на страницу Ютьюба или контакта и посмотреть на HTTP запросы и, самое главное, HTTP ответы сервера. Уверяю, что ничего сверхнового ты не увидишь 🙂

  3. Dmitriy Reply

    А про метода отправки HTTP запросов когда статью ждать, уж очень доступно и понятно рассказываете, всё по полочкам так сказать расставляете.

    • Кирилл Reply

      Dmitry, через одну или две публикации в рубрике HTTP протокол я напишу про методы HTTP запросов более подробно. Надеюсь, это произойдет в ближайших 3-4 дня. Спасибо за интерес!

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Loading Disqus Comments ...