УЛЬТИМАТИВНЫЙ ГАЙД ПО HTTP СТРУКТУРА ЗАПРОСОВ И ОТВЕТ

Время на прочтение

Привет! Меня зовут Ивасюта Алексей, я техлид команды Bricks в Авито в кластере Architecture. Я решил написать цикл статей об истории и развитии HTTP, рассмотреть каждую из его версий и проблемы, которые они решали и решают сейчас.

Весь современный веб построен на протоколе HTTP. Каждый сайт использует его для общения клиента с сервером. Между собой сервера тоже часто общаются по этому протоколу. На данный момент существует четыре его версии и все они до сих пор используются. Поэтому статьи будут полезны инженерам любых уровней и специализаций, и помогут систематизировать знания об этой важной технологии.


УЛЬТИМАТИВНЫЙ ГАЙД ПО HTTP СТРУКТУРА ЗАПРОСОВ И ОТВЕТ

Что такое HTTP

HTTP — это гипертекстовый протокол передачи данных прикладного уровня в сетевой модели OSI. Его представил миру Тим Бернерс-Ли в марте 1991 года. Главная особенность HTTP — представление всех данных в нём в виде простого текста. Через HTTP разные узлы в сети общаются между собой. Модель клиент-серверного взаимодействия классическая: клиент посылает запрос серверу, сервер обрабатывает запрос и возвращает ответ клиенту. Полученный ответ клиент обрабатывает и решает: прекратить взаимодействие или продолжить отправлять запросы.

Ещё одна особенность: протокол не сохраняет состояние между запросами. Каждый запрос от клиента для сервера — отдельная транзакция. Когда поступают два соседних запроса, сервер не понимает, от одного и того же клиента они поступили, или от разных. Такой подход значительно упрощает построение архитектуры веб-серверов.

Как правило, передача данных по HTTP осуществляется через открытое TCP/IP-соединение1. Серверное программное обеспечение по умолчанию обычно использует TCP-порт 80 для работы веб-сервера, а порт 443 — для HTTPS-соединений.

HTTPS (HTTP Secure) — это надстройка над протоколом HTTP, которая поддерживает шифрование посредством криптографических протоколов SSL и TLS. Они шифруют отправляемые данные на клиенте и дешифруют их на сервере. Это защищает данные от чтения злоумышленниками, даже если им удастся их перехватить.

HTTP/0

В 1991 году была опубликована первая версия протокола с названием HTTP/0.9. Эта реализация была проста, как топор. От интернет-ресурса того времени требовалось только загружать запрашиваемую HTML-страницу и HTTP/0.9 справлялся с этой задачей. Обычный запрос к серверу выглядел так:

В протоколе был определен единственный метод GET и и указывался путь к ресурсу. Так пользователи получали страничку. После этого открытое соединение сразу закрывалось.

HTTP/1

Годы шли и интернет менялся. Стало понятно, что нужно не только получать странички от сервера, но и отправлять ему данные. В 1996 году вышла версия протокола 1.0.

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

Простой пример запроса:

GET /path HTTP/1.0
Content-Type: text/html; charset=utf-8
Content-Length: 4
X-Custom-Header: value

test

В первой строчке указаны метод запроса — GET, путь к ресурсу — /path и версия протокола —  HTTP/1.0.

Далее идёт блок заголовков. Заголовки — это пары ключ: значение, каждая из которых записывается с новой строки и разделяется двоеточием. Они передают дополнительные данные и настройки от клиента к серверу и обратно.

HTTP — это текстовый протокол, поэтому и все данные передаются в виде текста. Заголовки можно отделить друг от друга только переносом строки. Нельзя использовать запятые, точку с запятой, или другие разделители. Всё, что идет после имени заголовка с двоеточием и до переноса строки, будет считаться значением заголовка2.

В примере серверу передали три заголовка:

После блока заголовков идёт тело запроса, в котором передается текст test.

А так может выглядеть ответ от сервера:

HTTP/1.1 200 OK
Date: Thu, 29 Jul 2021 19:20:01 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

OK

В первой строке — версия протокола и статус ответа, например, 200 ОК. Далее идут заголовки ответа. После блока заголовков — тело ответа, в котором записан текст OK.

Статусы ответов

Клиенту зачастую недостаточно просто отправить запрос на сервер. Во многих случаях надо дождаться ответа и понять, как сервер обработал запрос. Для этого были придуманы статусы ответов. Это трёхзначные числовые коды с небольшими текстовыми обозначениями. Их можно увидеть в терминале или браузере. Сами коды делятся на 5 классов:

Мы рассмотрим основные коды, которые чаще всего встречаются в реальных задачах. С остальными более подробно можно ознакомиться в реестре кодов состояния HTTP.

Информационные ответы

100 Continue — промежуточный ответ. Он указывает, что запрос успешно принят.  Клиент может продолжать присылать запросы или проигнорировать этот ответ, если запрос был завершён.

Этот код ответа доступен с версии HTTP/1.1.

101 Switching Protocol присылается в ответ на запрос, в котором есть заголовок Upgrade. Это означает, что сервер переключился на протокол, который был указан в заголовке. Такая методика используется, например, для переключения на протокол Websocket.

102 Processing — запрос получен сервером, но его обработка ещё не завершена.

Успешные ответы

200 OK — запрос принят и корректно обработан веб-сервером.

201 Created — запрос корректно обработан и в результате был создан новый ресурс. Обычно он присылается в ответ на POST запрос.

Редиректы

301 Moved Permanently — запрашиваемый ресурс на постоянной основе переехал на новый адрес. Тогда новый путь к ресурсу указывается сервером в заголовке Location ответа.

Клиент может изменить метод последующего запроса с POST на GET.

302 Found — указывает, что целевой ресурс временно доступен по другому URl. Адрес перенаправления может быть изменен в любое время, а клиент должен продолжать использовать действующий URI для будущих запросов. Тогда временный путь к ресурсу указывается сервером в заголовке Location ответа.

307 Temporary Redirect — имеет то же значение, что и код 302, за исключением того, что клиент не может менять метод последующего запроса.

308 Permanent Redirect — имеет то же значение, что и код 301, за исключением того, что клиент не может менять метод последующего запроса.

Клиентские ошибки

400 Bad Request — запрос от клиента к веб-серверу составлен некорректно. Обычно это происходит, если клиент не передаёт необходимые заголовки или параметры.

401 Unauthorized — получение запрашиваемого ресурса доступно только аутентифицированным пользователям.

403 Forbidden — у клиента не хватает прав для получения запрашиваемого ресурса. Например, когда обычный пользователь сайта пытается получить доступ к панели администратора.

404 Not Found — сервер не смог найти запрашиваемый ресурс.

405 Method Not Allowed — сервер знает о существовании HTTP-метода, который был указан в запросе, но не поддерживает его. В таком случае сервер должен вернуть список поддерживаемых методов в заголовке Allow ответа.

Серверные ошибки

500 Internal Server Error — на сервере произошла непредвиденная ошибка.

501 Not Implemented — метод запроса не поддерживается сервером и не может быть обработан.

502 Bad Gateway — сервер, действуя как шлюз или прокси, получил недопустимый ответ от входящего сервера, к которому он обращался при попытке выполнить запрос.

503 Service Unavailable — сервер не готов обработать запрос (например, из-за технического обслуживания или перегрузки). Обратите внимание, что вместе с этим ответом должна быть отправлена ​​удобная страница с объяснением проблемы. Этот ответ следует использовать для временных условий, а HTTP-заголовок Retry-After по возможности должен содержать расчётное время до восстановления службы.

504 Gateway Timeout — этот ответ об ошибке выдается, когда сервер действует как шлюз и не может получить ответ за отведенное время.

505 HTTP Version Not Supported — версия HTTP, используемая в запросе, не поддерживается сервером.

В HTTP из всего диапазона кодов используется совсем немного. Те коды, которые не используются для задания определенной логики в спецификации, являются неназначенными и могут использоваться веб-серверами для определения своей специфической логики. Это значит, что вы можете, например, придать коду 513 значение «Произошла ошибка обработки видео», или любое другое. Неназначенные коды вы можете посмотреть в реестре кодов состояния HTTP.3

Тело запроса и ответа

Тело запроса опционально и всегда отделяется от заголовков пустой строкой. А как понять, где оно заканчивается? Всё кажется очевидным: где кончается строка, там и заканчивается тело. Однако, два символа переноса строки в HTTP означают конец запроса и отправляют его на сервер. Как быть, если мы хотим передать в теле текст, в котором есть несколько абзацев с разрывами в две строки?

POST /path HTTP/1.1
Host: localhost

Первая строка

Вторая строка после разрыва

По логике работы HTTP соединение отправится сразу после второй пустой строки и сервер получит в качестве данных только строку Первая строка. Описанную проблему решает специальный заголовок Content-Length. Он указывает на длину контента в байтах. Обычно клиенты (например, браузеры) автоматически считают длину передаваемых данных и добавляют к запросу заголовок с этим значением. Когда сервер получит запрос, он будет ожидать в качестве контента ровно столько байт, сколько указано в заголовке.

Однако, этого недостаточно для того, чтобы передать данные на сервер. Поведение зависит от реализации сервера, но для большинства из них необходимо также передать заголовок Content-Type. Он указывает на тип передаваемых данных. В качестве значения для этого заголовка используют MIME-типы.4

MIME (Multipurpose Internet Mail Extensions, многоцелевые расширения интернет-почты) — стандарт, который является частью протокола HTTP. Задача MIME — идентифицировать тип содержимого документа по его заголовку. К примеру, текстовый файл имеет тип text/plain, а HTML-файл — text/html.

Для передачи данных в формате обычного текста надо указать заголовок Content-Type: text/plain, а для JSON — Content-Type: application/json.

Можно ли передать тело с GET-запросом?

Популярный вопрос на некоторых собеседованиях: «Можно ли передать тело с GET-запросом?». Правильный ответ — да. Тело запроса не зависит от метода. В стандарте не описана возможность принимать тело запроса у GET-метода, но это и не запрещено. Технически вы можете отправить данные в теле, но скорее всего веб-сервер будет их игнорировать.

Представим, что на абстрактном сайте есть форма аутентификации пользователя, в которой есть всего два поля: email и пароль.

Запрос на отправку данных будет выглядеть так:

Тут есть небольшая особенность. Как понять, где заканчивается ключ и начинается его значение, если в пароле будет присутствовать знак «=» ?

В этом случае сервер не сможет понять, как разбить строку на параметры и их значения. На самом деле значения кодируются при помощи механизма url encoding.5 При использовании этого механизма знак «=» будет преобразован в код %3D .

Тогда наш запрос приобретёт такой вид:

Query string

Данные на сервер можно передавать через тело запроса и через так называемую строку запроса Query String. Это параметры формата ключ=значение, которые располагаются в пути к ресурсу:

GET /files?key=value&key2=value2 HTTP/1.0

При этом параметры можно передавать прямо от корня домена:

GET /?key=value&key2=value2 HTTP/1.0

Query String имеет такой же формат, как и тело запроса с MIME application/x-www-form-urlencoded, только первая пара значений отделяется от адреса вопросительным знаком.

Некоторые инженеры ошибочно полагают, что Query String являются параметрами GET-запроса и даже называют их GET-параметрами, но на самом деле это не так. Как и тело запроса, Query String не имеет привязки к HTTP-методам и может передаваться с любым типом запросов.

Обычно параметры Query String используются в GET-запросах, чтобы конкретизировать получаемый ресурс. Например, можно получить на сервере список файлов, имена которых будут начинаться с переданного значения.

GET-запросы по своей идеологии должны быть идемпотентными. Это значит, что множественный вызов метода с одними и теми же параметрами должен приводить к одному и тому же результату. Например, поисковые боты перемещаются по сайту только по ссылкам и делают только GET-запросы, потому что исходя из семантики они не смогут таким образом изменить данные на сайте и повлиять на его работу.

На этом я закончу говорить про версию протокола 1.0, структуру ответов и запросов. В следующей статье я расскажу, что такое Cookies, для чего нужен CORS и как это всё работает. А пока напоследок оставлю полезные ссылки, которые упомянул в тексте:

Следующая статья: Ультимативный гайд по HTTP. Cookies и CORS

Как подготовиться к собеседованию на вакансию QA? Как обычно, информации можно найти очень много, в этой статье постарались собрать “самый сок” знаний для того , чтоб начать развиваться в сфере тестирования.


УЛЬТИМАТИВНЫЙ ГАЙД ПО HTTP СТРУКТУРА ЗАПРОСОВ И ОТВЕТ

Именно в этом порядке программное обеспечение подвергается испытанием.

Все виды тестирования программного обеспечения, можно условно разделить на следующие группы:

Чтобы ответить на этот вопрос надо разобраться в определениях. И так нагрузочное тестирование – это автоматизированные испытания приложения, которые имитируют нагрузочные модели, с целью комплексной оценки производительности, проверки качественной и бесперебойной работы системы, а также проверки соответствия требованиям, предъявляемым к конкретному объекту тестирования. А стресс-тестирование используется для определения устойчивости системы в условиях превышения пределов нормального функционирования. Итого, нагрузочное – это тестирование в пределах значений нагрузки, которые должна выдерживать система, а стрессовое – это тестирования за ее пределами.

Всё зависит от доступа к коду программного обеспечения.

Литературы по тестированию множество и вам всё не перечитать, это и не нужно! Выбирайте книгу более современную и тоньше.

Что такое web приложение? Однозначно, это клиент-серверное приложение, в котором клиент взаимодействует с веб-сервером при помощи браузера. Поэтому не избежать вопросов про сетевые протоколы взаимодействия. Могут быть общие вопросы:

На собеседование достаточно будет рассказать про основные протоколы, углубляться в эту тему не следует. Наиболее известные протоколы:

Но основная часть вопросов будет про http и https:

Как же ответить на вопрос “в чем отличия?”, ответ кроется в их определении, а именно: https не является отдельным протоколом передачи данных, а представляет собой расширение протокола http с надстройкой шифрования; передаваемые по протоколу http данные не защищены, https обеспечивает конфиденциальность информации путем ее шифрования.

HTTP определяет множество методов запроса, которые указывают, какое желаемое действие выполнится для данного ресурса.

Отвечая на этот вопрос можете перечислить только основные методы.

Не пугайтесь этого вопроса, здесь следует упомянуть только про основные части http запроса: строка запроса, заголовки, тело сообщения. Нужно обратить внимание, что между заголовками и телом сообщения находится пустая строка (в качестве разделителя), она представляет собой символ перевода строки. При получении ответного запроса от сервера, тело сообщения обычно представляет собой содержимое веб-страницы.

Для расширения кругозора рекомендую прояснить понятия “Транспортный уровень”, “Уровень сети интернет”, “Канальный уровень”.


УЛЬТИМАТИВНЫЙ ГАЙД ПО HTTP СТРУКТУРА ЗАПРОСОВ И ОТВЕТ

Основы Web-программирования

Веб-приложение — клиент-серверное приложение, в котором клиент взаимодействует с веб-сервером при помощи браузера. Поэтому вопросы на собеседовании по этой теме обязательно будут!

При ответе на вопрос необходимо уточнить, что у пользователя устойчивое интернет соединение. Даны следующие вводные: пользователь заходит на популярный ресурс с новостями, нажимает на “Срочная новость!”, но страница не открывается. Самый простой способ разобраться в причине, это воспользоваться браузерной консолью. Открыли консоль, выбрали элемент с гиперссылкой, и анализируем какой веб-адрес указан. Самая популярная ошибка, которую находят тестировщики, это неверно указанный веб-адрес.

Посмотреть цвет кнопки можно аналогичным способом через браузерную панель, и сравнить кодировки цвета.

Самый важный инструмент в жизни web-тестировщика – это браузерная консоль, большинство проблем можно диагностировать благодаря ей, поэтому следует обратить внимание на основные панели:

Если у вас есть основы знаний HTML, CSS, JS это будет огромным плюсом, хотя бы следует развиваться в этом направлении, чтобы стать хорошим специалистом!

А что же с API?

Сложность тестирования API (программный интерфейс приложения) заключается в отсутствии пользовательского интерфейса. Поэтому нужно настроить с необходимым набором параметров среду тестирующую API, а затем проанализировать результаты теста. Какие же вопросы могут таиться:

Отвечая на этот вопрос, опирайтесь на свой опыт. Список самых популярных инструментов: SoapUI, Postman, REST-Assured, Fiddler, Karate, JMeter.

Информации по API в свободном доступе огромное количество, поэтому вы сможете разобраться в этом разделе.

Как быть с автоматизацией?

Во многих компаниях активно используется автоматическое тестирование. Часто разбором результатов прогонов и анализом занимаются ручники. Поэтому нужно иметь небольшое представление, как строится процесс автоматизации и какие инструменты используются.

Если раньше в работе сталкивались с автоматизацией, то расскажите подробнее какой использовался технический стек, как происходил разбор тестов, и какой был алгоритм действий, если автотест падал с ошибкой.

Большим плюсом будет опыт работы с GIT и с базами данных.

HTTP означает протокол передачи гипертекста, который в основном применим и отвечает за обработку запросов и ответов через Интернет. Эти запросы и ответы выполняются между веб-сервером и веб-браузером. H TTP подпадает под протокол прикладного уровня, который является верхним уровнем над TCP. Это помогает передавать данные между двумя конечными точками, такими как клиент и сервер. Он поддерживает контент в таких форматах, как HTML, CSS, JSON и т. д.

Основные функции HTTP:

Архитектура HTTP

Для простоты понимания, вот архитектура HTTP, которая показывает, где она находится:

На рисунке выше HTTP является мостом между клиентом и сервером.

Методы получения и отправки являются наиболее распространенными методами запроса HTTP. Помимо получения и публикации, другими методами запроса являются Head, Put, Delete, Connect, Trace, Patch и Options.

Когда клиент запрашивает что-то у сервера, он возвращает коды состояния, такие как 200 (если все в порядке), иначе 404 (страница не найдена), или это могут быть и другие коды состояния.

Код состояния HTTP можно разделить на пять категорий:

Когда браузер отправляет запросы на сервер, сервер отвечает клиенту, и этот ответ называется ответом HTTP. Ответ, который получает клиент, предлагает различные ресурсы запроса, а позже также уведомляет, был ли запрос завершен или нет.

HTTPS — безопасный протокол передачи гипертекста. Это тоже HTTP-версия, но расширенная. Он сообщает браузеру обеспечить шифрование TLS (безопасность уровня передачи) для защиты трафика при передаче данных. Таким образом, соединение становится безопасным.

Различия между HTTP и HTTPS:

400 — это ошибка, которая является кодом состояния HTTP. Это означает, что запрос клиента не может быть удовлетворен из-за какой-то ошибки на стороне клиента.

Эта ошибка возникает, когда веб-сайт испытывает перегрузку сервера.

Обычно существует три типа согласования содержимого HTTP:

Поле заголовка является посредником между клиентом и сервером для обмена информацией запроса и ответа. Поля заголовков бывают четырёх типов:

Проверка личности или машины называется аутентификацией.

Когда один и тот же запрос задается много раз, но результаты не меняются, это называется идемпотентным методом. Методы Put и Delete относятся только к идемпотентным.

Когда состояние сервера не изменяется каким-либо методом HTTP, он считается безопасным. В этом случае выполняются только операции чтения. Поэтому Head, Get, Options и Trace называются безопасными методами, поскольку они не изменяют сообщение.

Uri означает универсальный идентификатор ресурса.

Синтаксис Uri содержит пять компонентов

Также читайте «Письмо с запросом информации: что вам нужно знать»

1. Что такое протокол Http?

Форма спецификации для передачи данных между клиентом и сервером устройства сокращенно называется «протокол передачи гипертекста».

2. Что такое протокол HTTP без сохранения состояния? Как решить протокол HTTP без сохранения состояния?(Однажды я спросил о стартапе)

3. Поговорим о статусе 302 в Http-протоколе(Часто спрашивает Али)

4. Каков состав протокола Http?

Сообщение запроса состоит из трех частей:

Ответное сообщение состоящее из трех частей:

Поговорим о процессе передачи по сети

УЛЬТИМАТИВНЫЙ ГАЙД ПО HTTP СТРУКТУРА ЗАПРОСОВ И ОТВЕТ

5. Какие существуют методы запроса в протоколе Http?

6. В чем разница между Http1.0 и 1.1 в протоколе Http?

7. Какая разница между запросом на получение и отправкой?(Необходимые вопросы для младших программистов)

9. Общий статус протокола Http?

10. Что такое поле протокола заголовка Http?

а. Поле общего заголовка (поле заголовок, Используемое в сообщениях запроса и ответа)

б. Поле заголовка запроса (поле заголовка, Используемое сообщение по запросу)

гр. Поле заголовка ответа (поле заголовка, Используемое в ответном сообщении)

д. Поле заголовка объекта (поле заголовка, используемая часть сообщения запроса и сообщения ответа)

11. Каковы преимущества и недостатки Http и Https?

12. Оптимизация http

13. Каковы характеристики протокола Http?

1. Поддержка модели клиента/сервера, 2. Простота и скорость, 3. Гибкость, 4. Отсутствие соединений, 5. Без сохранения состояния.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *