В этом виде мы рассмотрим, что такое протокол HTTP, его структура запросов и ответа, рассмотрим виды НТТР запросов, посмотрим виды кодов HTTP ответов, рассмотрим основные заголовки, а также поймем, что такое URI, что такое URL и чем они между собой отличаются. HTTP это протокол прикладного уровня для передачи гипертекста. Все взаимодействия HTTP происходит между клиентом и сервером. Клиент это конечный потребитель услуг сервера, сервер это поставщик услуг хранения обработки информации. То есть клиенту необходимо получить какие-то данные, он делает запрос к серверу, сервер как-то подготавливает эти данные и отдает клиенту. Рассмотрим HTTP сеанс, HTTP работает поверх протокола TCP. Собственно для начала необходимо установить соединение с сервером, после этого клиент формирует запрос и передает его на сервер, сервер как-то обрабатывает этот запрос, подготавливает данные, формирует ответ и отправляет этот ответ клиенту. Клиент его получает и закрывает HTTP соединение. Из этого следует, что протокол не хранит информацию о предыдущих запросах клиентов и ответах, то есть сервер не знает, что следующий запрос также произошёл от вас. Для этого существуют другие механизмы в HTTP, которые мы рассмотрим позже. Для того чтобы получить какие-то данные, нужно знать куда за ними сходить, для этого существует понятие URL. Для начала рассмотрим, что такое URI. Это Uniform Resource Identifier. Он представляет собой последовательность символов, которая идентифицирует какой то ресурс. URI не указывает на то, как получить ресурс, а только его идентифицирует [inaudible]. URL является подмножеством URI, а, собственно, URL, это Uniform Resource Locator, который именно указывает однозначно, где находится ресурс и как его получить. Он имеет общую структуру, такую как: сначала идет схема, например, HTTP или FTP, потом идет :// необязательные поля логин и пароль, они требуется в каких-то протоколах, в каких-то не требуются, в случае НТТР это опускается. После этого идёт хост и порт, к которым нужно обратиться и после этого идёт URL путь, путь к нашему ресурсу. Теперь рассмотрим структуру HTTP запроса. HTTP запрос состоит из стартовой строки и заголовков. Совокупность стартовой строки и заголовков будем называть заголовком запроса. После заголовка запроса идет пустая строка и после пустой строки идет тело запроса. Рассмотрим, что же содержится в стартовой строке. Стартовая строка всегда обязательна и в любом запросе она участвует. Сначала идет метод HTTP запроса, потом идет URL путь и после этого идет версия HTTP протокола. Рассмотрим методы. Собственно get используется для получения какой-то информации. Когда мы делаем запрос в браузере, то он направляет get запрос, то есть мы запрашиваем какие-то данные. Head это аналогично get запросу, только мы говорим, выполны get запрос, но не присылай нам тела этого запроса. post служит для того, чтобы отсылать от клиента данные на сервер, то есть мы как бы постим эти данные и отправляем их на сервер. patch служит для того, чтобы каким-то образом изменять отправленные данные, то есть постом мы отправили, например, какую-то информацию, она сохранилась на сервере, после этого нам понадобилось все изменить и мы patch-ем отправляем какие-то изменения. С delete-м мы обращаемся к серверу с необходимостью удалить какие-то данные. После этого идут поля заголовка, после стартовой строки. Заголовки эта пара, состоящая из имя этого заголовка и его значения, они служат для того, чтобы уточнить запрос и придать серверу какую-то дополнительную информацию. Рассмотрим заголовки HTTP запроса. host, это доменное имя или IP адрес узла, к которому обращается клиент. Referer это URL, откуда пришел клиент, например, если мы из google.com переходим на docs.google.com, то в referer-е запрос docs.google.com будет указывать только google.com. Accept это типы данных, которые могут обрабатываться клиентом. Accept-Charset это перечень поддерживаемых кодировок, Content-Type это тип данных которые содержат тело HTTP, запроса Content-Length это число символов, которое содержит тело запроса, conection это директива, которая управляет TCP соединением. Если указать conection типа live, то соединение не будет закрыто и будет использоваться для дальнейших запросов и юзер агент эта информация о клиентах, например, если мы делаем запрос google chromе, то в юзер агенте передастся информация, что мы делаем запрос с хрома, если там Сафари, то в юзер агенте укажется, что мы и делаем запрос сафари. Рассмотрим, что такое MIME. Это Multipurpose Internet Mail Extension. Изначально он был разработан для того, чтобы обеспечить передачу различных форматов данных в письмах, но он оказался настолько успешным, что его начали применять и в протоколе HTTP. Собственно MIME используют для определения формата тип и подтип. Собственно тип указывает некий класс данных, а подтип указывает именно формат, например, в случае HTML, это тег/HTML, в случае картинки в формате PNG это img/png. Данный спецификатор позволяет передавать от клиента к серверу различные типы данных. После того как мы отправили запрос серверу, он как-то его обработал и ему нужно сформировать ответ. Рассмотрим структуру HTTP ответа. Он также состоит из строки состояния, после строки состояния идут заголовки HTTP ответа. В совокупности называется заголовком ответа. После этого идет пустая строка, после пустой строки идет тело ответа. Строка состояния состоит из версий протокола и статуса HTTP ответа и расшифровки этого ответа. Рассмотрим коды ответов или статусы. Существует пять классов ответов. Первый это специальный класс сообщений, который называется информационным и обеспечивает говорит, что сервер продолжает работу. Например, мы работали по протоколу HTTP, а сервер нас переключил на работу по протоколу веб сокета и для этого он отправляет статус 101 свичем протокола. Следующий класс это класс начинающийся с двойки. Эти ответы означают успешную обработку запроса клиентам. Это например 200, такой статус мы получаем когда обращаемся гугл.ком, и нам отдается страница или например 201, это мы отправили серверу какие-то данные, он их принял, сохранил и ответил 201 created. Коды, которые начинаются с тройки, это перенаправление запроса. Например, мы обращались к какому-то ресурсу, этот ресурс куда-то переехал, на другой адрес, нам сервер ответит 301 move permanently [inaudible]. В случае, если он также переехал на какое-то время, то нам ответят 302 или, например, мы находились на /логин, ввели корректный имайл и корректный пароль, он нас зарегистрировал и отправил на главное, это будет 302. Коды, которые начинаются с 400, это ошибка клиента. Например, клиент отправил некорректный HTTP запрос, в этом случае ему сервер ответит 400 Bad Request. Или у клиента недостаточно прав для доступа к ресурсу и ему в этом случае ответят 403. Или, например, обратился к ресурсу, которого не существует, в этом случае ему ответит 404 и так далее. И пятый класс это ошибки начинающийся с пятерки, это ошибки сервера, например, в случае если бизнес логика сервера как-то некорректно отработала, то в ответ мы получим 500. В случае, например, если вы сделали такую систему, которую сначала клиент обращается к промежуточному серверу, а потом к вашему серверу приложений и ваш сервер приложений по какой-то причине не отвечает, то промежуточный сервер в таком случае ответит вам 502. Рассмотрим поля заголовка ответа. Это Server, это имя и номер версии сервера, который обрабатывает HTTP запрос, например [inaudible] апач и так далее. Allow, это список методов, которые доступны для данного ресурса. Content-Type это тип данных, которые содержится в теле, Content-lengths это их длина. Last-Modifief это дата и время последнего изменения ресурса. Expires это дата, когда информация устареет. Location это расположение ресурса, данный заголовок используется, когда нам сервер прислал, например, статус 302 и говорит нам переместиться на другой ресурс. Собственно оттуда браузер возьмет информацию и перейдет на другой ресурс. Кэш-контроль эта директива, которая управляет кэшированием, если указать кэш-контроль на у-кэш, то данные, которые приходят с сервера, никогда не будут сохранены или закэшированы. Теперь посмотрим на примере как работает протокол HTTP. Давайте попробуем получить страницу екзампл.ком. Для этого сделаем get запрос на этот ресурс. Так же как и в лекции по сетям, мы использоваем утилиту телнет, чтобы открыть [inaudible] ТСР соединение с нашим сервером и попытаемся сформировать HTTP запрос и получить ответ. Собственно пишем телнет, example.com и обращаемся 80 восьмидесятый порт. У нас открывается соединение и мы можем передать ему данные: метод, путь и версия протокола HTTP /1.1. Нажимаем перенос строки и еще раз, чтобы отправить запрос. Что мы видим в итоге? Нам пришел HTTP ответ 400 Bad Request, то есть веб-сервер посчитал, что у нас запрос некорректный, у нас не хватает данных и нам об этом сообщил. Давайте отправим корректный HTTP запрос. Для этого я подготовил файл специальный. реквест.текст, посмотрим что внутри него находится. Собственно также GET/HTTP, то есть стартовая строка, указали хост, указали директива conection, указали кэш контроль, указали user agent и типы данных, которые мы можем принимать. Давайте его скопируем и уже отправим эти данные на наш веб-сервер. Собственно повторно открываем HTTP соединение с example.com, Отправляем ранее сформированный запрос и отправляем пустую строку. Что в итоге мы видим? У нас пришёл успешный HTTP ответ со статусом 200 и с данными длиной 1270 символов и контент-тайпом HTML, то есть мы получили HTML страницу и смотрим в тело нашего ответа, видим там HTML стили и, собственно, информацию, которой мы видим в браузере. А теперь попробуем то же самое сделать в браузере, пишем example.com, перейдем, видим ту же страницу, которую мы получили из консоли. Итого, сегодня мы рассмотрели что такое HTTP, как он работает, его структуру, структура запрос, структура ответа, посмотрели какие бывает виды запросов, какие бывают коды ответов и посмотрели основные заголовки запросов и ответов. Также рассмотрели что такое URI, что такое URL и чем они отличаются.