Введение в HTTP

Введение в HTTP

Дмитрий Бахтенков

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

Определение

Любой протокол - это набор определённых правил и соглашений, очерёдности действий. Эти правила задают единообразный способ передачи сообщений и обработки ошибок.

HTTP (Hyper Text Transfer Protocol - протокол передачи гипертекста) - это протокол прикладного уровня передачи данных. Изначально он использовался для передачи документов формата html, однако сейчас его можно использовать с произвольными данными

Основой HTTP является технология "клиент-сервер", которая подразумевает существование неких потребителей (клиентов), которые инициируют соединение и посылают запрос и поставщиков (серверов), которые ожидают соединения для получения запроса, выполняют по запросу некоторые действия и возвращают ответ.

Что внутри?

Рассмотрим, из чего состоят запросы и ответы в протоколе HTTP.

Каждое http-сообщение, как запрос, так и ответ, состоит из трёх частей:

  1. Стартовая строка - определяют тип запроса
  2. Заголовки - это некие метаданные, которые могут описывать тело сообщения, авторизационные данные, информацию о хосте и др.
  3. Тело сообщения - это данные, которые мы передаём в запросе. Тело может отсутствовать.

Стартовая строка

Стартовая строка запроса строится по следующему шаблону:

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.

Report Page