Введение в HTTP
Дмитрий БахтенковЗдравствуй, дорогой читатель. Сегодня мы поговорим о протоколе HTTP - что он из себя представляет, как работает и зачем вообще нужен. Для разработчика эти знания просто необходимы, причём независимо от специализации - с этой технологией мы сталкиваемся постоянно.

Определение
Любой протокол - это набор определённых правил и соглашений, очерёдности действий. Эти правила задают единообразный способ передачи сообщений и обработки ошибок.
HTTP (Hyper Text Transfer Protocol - протокол передачи гипертекста) - это протокол прикладного уровня передачи данных. Изначально он использовался для передачи документов формата html, однако сейчас его можно использовать с произвольными данными
Основой HTTP является технология "клиент-сервер", которая подразумевает существование неких потребителей (клиентов), которые инициируют соединение и посылают запрос и поставщиков (серверов), которые ожидают соединения для получения запроса, выполняют по запросу некоторые действия и возвращают ответ.
Что внутри?
Рассмотрим, из чего состоят запросы и ответы в протоколе HTTP.
Каждое http-сообщение, как запрос, так и ответ, состоит из трёх частей:
- Стартовая строка - определяют тип запроса
- Заголовки - это некие метаданные, которые могут описывать тело сообщения, авторизационные данные, информацию о хосте и др.
- Тело сообщения - это данные, которые мы передаём в запросе. Тело может отсутствовать.
Стартовая строка
Стартовая строка запроса строится по следующему шаблону:
METHOD PATH HTTP/Version
Например, попробуем представить то, что делает браузер, когда мы запрашиваем страницу группы в вк:
GET /flexiblecoding HTTP/1.0 Host: <https://vk.com>
Здесь указан метод GET, который указывает, что мы собираемся получить какие-то данные (о методах ещё поговорим ниже), путь к ресурсу - это та часть адреса, которая идёт после адреса хоста, и версия http 1.0. Также добавлен заголовок "Host", где мы указываем адрес, на который посылаем запрос.
В ответ нам приходит стартовая строка следующего вида:
HTTP/Version StatusCode ReasonPhrase
Первая часть строки это версия протокола http. Она такая же, как и в запросе.
Далее идёт код состояния (Status Code) - некое целое число, характеризующее ответ сервера. На основе этого кода определяется содержимое и дальнейшее поведение клиента.
В конце строки находится пояснение (Reason Phrase) - это короткая строка, поясняющая код состояния.
Ответом на запрос, созданный выше может быть следующая строка:
HTTP/1.0 200 OK
Подробнее о статусных кодах мы поговорим ниже.
Заголовки
Как уже было сказано раннее, заголовки определяют некоторые метаданные для него. Мы уже использовали заголовок Host, однако помимо него есть и другие, например:
- Accept - список допустимых форматов ресурса, например
Accept: text/plain - Accept-Charset - перечень поддерживаемых кодировок, например
Accept-Charset: utf-8 - Authorization - данные авторизации, например
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== - Content-Length - длина передаваемого содержимого в байтах, например
Content-Length: 2342 - Content-Type - формат и способ представления данных в запросе, например
Content-Type: text/html;charset=utf-8
Существует также множество других заголовков, которые можно посмотреть, например, в википедии.
Тело сообщения
В http-сообщении могут быть какие-либо данные. Например, когда мы переходим на какой-либо сайт, на его адрес выполняется GET-запрос и мы получаем ответ, в теле которого содержится отображаемый html-код. В теле запроса передаются данные на сервер при заполнении различных форм или просто какие-либо данные. Это активно используется для создания API веб-приложений и при взаимодействии фронтенда с бэкэндом (где фронтенд является клиентом, а бэкэнд - сервером).
Телом сообщения ответа может быть html, если мы обращаемся к веб-странице, или формат XML или JSON, если мы обращаемся по API к какому-либо сервису. Существуют следующие типы представления данных в теле сообщения:
- application/json - тип JavaScript Object Notation (JSON) - представляет из себя набор пар ключ-значение, поддерживает массивы и вложенность. Очень часто он применяется для передачи данных между клиентом и сервером, или для API приложений. Пример json:
{
"firstName": "Иван",
"lastName": "Иванов",
"address": {
"streetAddress": "Московское ш., 101, кв.101",
"city": "Ленинград",
"postalCode": 101101
},
"phoneNumbers": [
"812 123-1234",
"916 123-4567"
]
}
- application/xml - eXtensible Markup Language - ещё один распространённый формат передачи данных. Он состоит из тегов и атрибутов, и разрабатывался как понятный человеку язык разметки. На данный момент применяется редко, гораздо чаще используется формат json. Пример xml, описывающий такой же объект, как в примере выше.
<person>
<firstName>Иван</firstName>
<lastName>Иванов</lastName>
<address>
<streetAddress>Московское ш., 101, кв.101</streetAddress>
<city>Ленинград</city>
<postalCode>101101</postalCode>
</address>
<phoneNumbers>
<phoneNumber>812 123-1234</phoneNumber>
<phoneNumber>916 123-4567</phoneNumber>
</phoneNumbers>
</person>
- text/html - стандартный формат языка разметки html
- application/x-www-form-urlencoded - это формат данных, при котором в http-запросе отправляется большая строка, представляющая набор пар ключ-значение, разделённые знаком "&", например:
MyVariableOne=ValueOne&MyVariableTwo=ValueTwo - multipart/form-data - набор двоичных данных, которые также представляют набор пар ключ-значение. С помощью этого формата также можно передавать различные файлы. Каждое значение посылается как блок данных ("body part"), с заданными пользовательским клиентом разделителем ("boundary"), разделяющим каждую часть. Эти ключи передаются в заголовки Content-Disposition каждой части. Например:
POST /test.html HTTP/1.1 Host: example.org Content-Type: multipart/form-data;boundary="boundary" --boundary Content-Disposition: form-data; name="firstName" Andrew --boundary Content-Disposition: form-data; name="file"; filename="example.txt" --boundary--
Методы
Когда приложения взаимодействуют друг с другом по API или клиент работает с сервером, помимо запросов на получение каких-то данных, может быть ещё и обновление данных, и их создание/удаление. Для того, чтобы можно было определить, какую операцию производит запрос, были созданы методы - короткие английские слова, написанные в заглавном регистре. Рассмотрим методы подробнее:
POST- метод, используемый для создания объекта в системе или просто передачи туда данных. Например, представим ВКонтакте. Когда мы создаём новую запись у себя на странице, на бэкэнд вк отправляется post-запрос с данными теле, которые есть в нашем посте: музыка, фото, текст и т.д.GET- метод, описывающий получение данных. Обычно не содержит тела, а различные параметры могут передаваться прямо в строке, напримерhttp://example.com?variable=12. Используется для получения html-страниц, объектов из API и т.д.PUT- метод, используемый для обновления данных. Например, когда мы решили отредактировать запись в нашем посте в вк, на сервер отправляется put-запрос с новыми данными.PATCH- метод, используемый для обновления какого-либо фрагмента ресурса. Применяется достаточно редко.DELETE- метод, используемый для удаления объекта из системы. Например, удаление своего поста на странице в вк.
Статусные коды ответа
При отправке http-запроса мы получаем ответ с определённым статусом. Как уже говорилось ранее, у каждого статуса есть свой код и короткая поясняющая фраза - Reason Phrase.
Ответы на успешные запросы начинаются с цифры 2. Рассмотрим основные статусы:
- 200 (Ok) - успешное завершение операции
- 201 (Created) - в результате выполнения операции был создан новый объект
- 204 (No Content) - сервер успешно обработал запрос, но в ответе ничего нет.
Ошибки клиента начинаются с 4:
- 400 (Bad Request) - сервер обнаружил в запросе клиента ошибку
- 401 (Unauthorized) - отказано в авторизации. Клиент пытается получить доступ к ресурсу, где требуется авторизация.
- 403 (Forbidden) - у клиента недостаточно прав для выполнения данного запроса
- 404 (Not Found) - сервер не нашёл запрашиваемого клиентом ресурса
- 405 (Not Allowed) - указанный клиентом метод нельзя применить к ресурсу. Возникает из-за неверного выбора метода в запросе.
Ошибки сервера начинаются с 5:
- 500 (Internal Server Error) - внутренняя ошибка сервера
- 503 (Service Unavailable) - сервер временно не имеет возможности обрабатывать запросы по техническим причинам
Здесь указаны далеко не все статусные коды. Полный список можно посмотреть, например, тут.
Вывод
Протокол HTTP - это протокол прикладного уровня, используемый для передачи данных. Чаще всего на его основе строится взаимодействие между клиентом и сервером, или другими приложениями.
Запрос состоит из стартовой строки, заголовка и тела. В ответе нам приходит статусный код и, возможно, какие-либо данные в теле. Существует множество методов и ответов, каждый из которых имеет своё значение.
Все запросы выполняются либо браузером, например на получение html-кода страницы, либо их выполнение прописывается в коде приложения.
Спасибо за внимание!
С вами был Flex Code.