Основы 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" в исходном коде формы: