October 17, 2020

Основы HTTP

Протокол передачи гипертекста (HTTP) является основой передачи данных во всемирной паутине, а, следовательно, и самым популярным прикладным протоколом, используемым в Интернете.
Он функционирует как асимметричный протокол асимметричного запроса-ответа. Клиент HTTP отправляет серверу сообщение с запросом HTTP. Сервер возвращает клиенту ответное сообщение:

Структура URL-адреса

Ресурсы HTTP уникально идентифицируются по URL (Унифицированные идентификаторы ресурсов) в виде http и https URL (Унифицированные идентификаторы ресурсов).
URL-адреса имеют следующий синтаксис:
protocol://hostname: port/path-and-resource-name

  • Протокол - Протокол приложения. Обычно https или http в Web API.
  • Hostname (Имя хоста) - доменное имя для идентификации компьютера-хоста (веб-сервера).
  • Port (Порт) - номер TCP-порта, на котором хост прослушивает запросы клиентов. Если его опустить, то будет 443 для https-запросов и 80 для http-запросов по умолчанию.
  • Путь и имя ресурса - состоит из последовательности сегментов пути, разделенных прямой косой чертой (/), и имени запрашиваемого ресурса, и может включать в себя расширение файла

Пример: https://www.utest.com/academy/tracks/1 где:

  • https - протокол
  • www.utest.com является доменом
  • `/academy/tracks/1` - это "путь и имя ресурса" - компонент.
  • Так как порт не указан явно, клиент (т.е. веб-браузер) по умолчанию устанавливает его в 443, в данном случае

Структура HTTP-запроса и ответа

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

Пример HTTP-запроса:

В строке запроса указано:

  • HTTP-метод
  • Ресурс ("/")
  • HTTP-версия ("1.1").

Распространенные методы HTTP:

  • GET - для запроса определенного ресурса, как показано в примере выше.
  • POST - размещать содержимое на сервере
  • HEAD - запрашивать только http-заголовки запроса, опуская тело ответного сообщения. Это может быть использовано для получения определенных конфигурационных опций
  • OPTIONS - чтобы запросить описание вариантов взаимодействия с целевым ресурсом, сервер должен ответить со списком поддерживаемых HTTP методов.
  • PUT - еще один способ (среди 'POST') отправки содержимого на сервер. POST чаще используется на веб-страницах, в то время как PUT более распространен в API
  • DELETE - инструктировать веб-сервер по удалению определенного ресурса или контента.

Пример ответа HTTP:

Строка состояния показывает, был ли запрос успешным, а также показывает HTTP-версию и включает в себя код состояния http:

  • 200 ОК ... запрос был успешным
  • 302 Found ... Инструктирует клиента посмотреть (просмотреть) другой URL-адрес
  • 400 Bad Request ... Сервер не может или не будет обрабатывать запрос из-за ошибки клиента (например, синтаксическая ошибка, размер, формат сообщения).
  • 501 Not Implemented ... Сервер не может выполнить запрос или не распознает метод запроса

Коды статуса ответа HTTP разделены на пять категорий, где первая цифра кода статуса определяет класс ответа:

  • 1xx (информационный)
  • 2хх (Успешный)
  • 3xx (перенаправление)
  • 4xx (Ошибка клиента)
  • 5xx (Ошибка сервера)

Заголовки запросов

Поля заголовков HTTP являются составной частью заголовочной секции запросов и ответных сообщений. Они могут определять широкий спектр рабочих параметров HTTP-транзакции:

  • Host: www.utest.com
    Доменное имя сервера
  • User-Agent: Mozilla/5.0
    Строка агента пользователя браузера
  • Accept: текст/html,*/*
    Часть материалов, обсуждаемых в ходе переговоров; приемлемые типы средств массовой информации для получения ответа
  • Accept-Language: en-US, en
    Список приемлемых человеческих языков для ответа (контент-переговоры)
  • Connection: близко
    Опции управления для текущего соединения

Заголовки ответа

Поля заголовков (также в заголовках запросов) разделены двоеточиями "пары ключ-значение".

  • Пример "Подключение: закрыть".
    "Подключение" - это ключ
    " закрыть " - это значение

Давайте разобьем этот пример заголовков:

  • Date: Fri, 06 сентября 2019 06:42:56 GMT
    HTTP-дата определяет дату и время отправки сообщения ("Время сервера"!).
  • Content-Type: text/html; charset=UTF-8
    MIME-тип содержимого в теле ответного сообщения.
  • Connection: закрыть
    Опции управления для текущего соединения. "закрыть" означает, что соединение будет закрыто после завершения ответа. Единственная возможная опция - "keep-alive", указывающая на то, что могут быть и другие сообщения, следующие за ней, и поэтому клиент должен поддерживать постоянное соединение.
  • Cache-Control: no-cache
    Это говорит всем механизмам кэширования от сервера к клиенту, могут ли они кэшировать это сообщение. Другим возможным значением будет, например: "Cache-Control: max-age=3600", измеряется в секундах. Указание на то, что объект не может быть кэширован дольше x секунд.
  • Expires: Ту, 01 января 1970 00:00:01 по Гринвичу.
    HTTP-дата, после которой ответ считается просроченным
  • Content-Length: 3761
    Длина тела ответа в байтах

Есть десятки других возможных заголовков запросов и ответов. Многие из них объяснимы сами по себе.

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

Существует множество вариантов передачи данных на веб-сервер в HTTP-запросах. На веб-сайтах наиболее распространенными способами являются сквозные:

  • Строки запроса
  • JSON в фоновых запросах (без перезагрузки страницы)
  • Многокомпонентные POST-запросы

В API данные часто передаются через XML или JSON вместо форм. Эти методы будут рассмотрены позже в этом курсе.
Рассмотрим сначала "традиционный" способ передачи данных формы со строками запроса:

  • GET-запрос будет выглядеть так:

На скриншоте выше показана простая html-форма с двумя полями ввода и кнопкой отправки. Метод формы определяется как "GET", который также является значением по умолчанию, если атрибут оставлен без изменений.
После отправки входные данные будут отправлены в указанное место "/test/demo_form.php" текущего хоста (где находится форма): https://www.example.com/test/demo_form.php?name1=value&name2=value2.
Как видите, содержимое формы передается в URL GET-запроса, в виде строки запроса. Состоит из строки пар имя/значение, добавляемой к целевой странице после вопросительного знака. Отдельные пары имя/значение (name1=значение1 и name2=значение2) разделены амперсандом &. Целевая страница определяется в параметре формы "action".

  • Тот же самый запрос при изменении метода на POST будет выглядеть следующим образом:

Та же самая пара ключ/значение "name1=value1&name2=value2" теперь передается в теле запроса внизу запроса, под пустой строкой, отделяющей его от заголовка сообщения.

Заголовок типа "Контент

Контент-тип: application/x-www-form-urlencoded

Выделенный заголовок типа содержимого говорит серверу о том, что данные закодированы в url-кодировке. Это означает, что все не-ASCII символы будут преобразованы. Например, символ пробела становится +, "@" становится "%40" и так далее.

  • Та же самая форма, передаваемая в виде многокомпонентных/формальных данных, определяя атрибут "enctype", будет выглядеть следующим образом:

Теперь значения разделены "boundary", которая будет автоматически установлена браузером. Каждое значение имеет один или несколько дополнительных атрибутов. Этот метод обычно используется для форм загрузки файлов на веб-сайтах.
Обратите внимание на добавленный атрибут "enctype" в исходном коде формы: