Алекс Смит: Тестирование ПО с Нуля до Специалиста
January 31

7.3 HTTP протокол и его основные методы. Статус-кода

Что такое HTTP?

HTTP- «протокол передачи гипертекста») — протокол прикладного уровня передачи данных, изначально — в виде гипертекстовых документов в формате HTML.

Гипертекст – данные имеют вид текста и ссылок на какие-либо ресурсы.

Протокол – набор правил передачи информации. Мы регламентируем то, как будет передаваться в сети интернет наша информация.

Всё программное обеспечение для работы с протоколом HTTP разделяется на три большие категории:

  • Серверы - основные поставщики услуг хранения и обработки информации (обработка запросов по заданной логике);
  • Клиенты — конечные потребители услуг сервера.
    Мы с Вами уже говорили что это наш браузер или приложение установленное на нашем мобильном устройстве, так же сюда можно отнести специализированное ПО, например postman, jmeter, с помощью данных приложений можно отправлять запросы, мы так же будем рассматривать и их);
  • Прокси (посредники) - для выполнения транспортных служб, представляет собой приложение, установленное, например на сетевом адаптере, либо в роли прокси может выступать специализированное ПО в виде снифферов, например Charlies или Fiddler

Http-протокол и из чего он состоит:

HTTP-запрос (HTTPrequest):

Синтаксис http-запроса:

METHOD HTTP/VERSION
HOST

Где:

  1. METHOD — это как раз метод HTTP-запроса
  2. VERSION — версия протокола (на данный момент актуальна версия 1.1)
  3. Host— идентификатор ресурса

Пример:

GET /news/rubric/sport HTTPS/1.1
HOST: dzen.ru

Content-Type: text/html; charset-utf-8
Content-Lenght: 4

Протокол включает в себя:

Header(заголовки) – служебная информация которая характеризует нашу основную часть – может и не быть. Заголовки — это набор пар имя-значение, разделенных двоеточием. В заголовках передается различная служебная информация: кодировка сообщения, название и версия браузера, адрес, с которого пришел клиент и так далее.

Тело сообщения — это, собственно, передаваемые данные. В запросе, например, в теле сообщения передается содержимое файлов, загружаемых на сервер. Это дополнительная информация, которая передается вместе с нашим запросом. В отличии от ранее перечисленных данных, тело сообщения не является обязательным для http-запроса.

HTTP-ответ (HTTPresponse):

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

HTTP/1/0 200 OK
Server: nginx/0.6.31
Content-Language: ru
Content-Type: text/html; chatset=utf-8
Content-Length: 1234
Connection: close

Что можно понять из этого ответа:

  • Версия нашего протокола (HTTP/1.1)
  • Статус код (200, 201…..) – говорит о том как отвечает нам сервер – говорит об успешности нашего обращения на сервер
  • Статус сообщение (ок,….)
  • Дата, когда был дан ответ
  • Информация о сервере
  • Headers(заголовки) – служебная информация которая характеризует нашу основную часть

На данном примере прекрасно видно наши заголовка

Например, информацию по языку, или же

Content-Type — данный заголовок показывает, в каком формате будут передаваться данные в теле запроса или же ответа.

Content-Length — сообщает длину в теле запроса в байтах.

Метод HTTP (англ. HTTPMethod)

Метод HTTP (англ. HTTPMethod) — последовательность из любых символов, кроме управляющих и разделителей, указывающая на основную операцию над ресурсом. Методов много, но мы рассмотрим основные.

Сразу предупрежу, тема может показаться сложной, но в будущих уроках, на примере postman или jmeter, в зависимости от курса, все станет более понятнее.

Что такое CRUD?

Хотелось бы вспомнить такое понятие как CRUD – create, read, update, delete. То есть создание, чтение, изменение и удаление данных.

GET - запрос для получения статуса, получение какой либо информации от сервера

POST – отправка данных, файлов

PUT – изменение данных

DELETE – удаление данных

GET

Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса.

Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»:
GET /path/resource?param1=value1&param2=value2 HTTP/1.1

POST

Применяется для передачи пользовательских данных (например текст, медиа файл) заданному ресурсу, то есть на сервер. Например, в блогах или под каким либо видео на видео-хостинге, например YouTube, посетители обычно могут вводить свои комментарии к записям в HTML-форму (то есть форму на нашей странице), после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы на сервер.

PUT

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

DELETE

Удаляет указанный ресурс.

Идемпотентные методы

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

Давайте рассмотрим пример, метод Get, при повторной отправке данного метода, например на yandex.ru, мы будем получать один и тот же ответ.

Тоже касается метода Put и Delete. Предположим у нас есть запрос, для редактирования данных в карточке клиента, предположим что у клиента указан номер телефона +79123456789, и он решил его заменить на точно такой же, то есть запрос Put будет содержать в себе точно такое же тело сообщения, с тем же номером. Система получит данный запрос, и заменит данные в карточке нашего клиента. В результате чего страница останется идентичной. Но это все при условии, что каждый раз при отправке данного запроса, мы используем идентичный запрос и данные.

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

Например, у нас есть метод DELETE, который удаляет пользователя с определённым идентификатором, и если мы удалили нашего пользователя с id=2, то при повторной отправке запроса по удалению данного пользователя, запрос уйдет и вне зависимости от того есть он или нет, удалит его.

Но может быть иначе, предположим метод delete будет удалять не конкретно пользователя с id 2, а самого последнего в списке в нашей базе данных, то есть с каждой отправкой данного запроса, будет удаляться пользователь. Тем самым мы будем менять состояние на сервере и можем удалить всех пользователей. В таком случае, данный метод, даже если данные запроса не будут меняться, не будет идемпотентным. Данный запрос является не правильным, ведь delete – это идемпотентный метод, и не должен влиять на состояние сервера, требуется обратиться к руководству, для того, чтоб разработчик изменил данные по методу, и сменил delete на post. Post это не идемпотентный метод, он может менять состояние сервера.

Коды состояния запроса

Поговорим о кодах состояния, очень важная тема, ведь как правило именно по нему мы можем определить успешно ли прошел наш запрос или нет

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

В настоящее время выделено пять классов кодов состояния.

100-е – это информационный код состояния, дает информационные сообщения. Под сотыми понимается все что начинается с цифры 1и далее еще 2 символа

200-е – информируют нас об успешной отработке запроса

300-е – это перенаправление, то есть, к примеру, когда был изменен url и нужно идти на другой. Так же это можно увидеть, к примеру, когда мы работаем с сайтом, на котором размещены для скачивания медиа файлы, например музыка, так вот, при скачивании музыки, у нас идет 300-й запрос, если не ошибаюсь 304, с помощью которого мы идем на другой ресурс, и оттуда уже скачиваем нужным нам медиа файл. Это снимает нагрузку с нашего сервера, чтоб он не хранил там тонны гигабайт медиа файлов

400-е – обозначают что на стороне клиента есть ошибка. Самый популярный 400-й статус код, это, разумеется, 404. Например если Вы указали не существующий URL или пользователя

500-е – это ошибка на стороне сервера. Например, когда на нем неправильно отработала какая-либо логика или сервер долго обрабатывает наш запрос.

Здесь представлен список самых популярных статус-кодов:

200 – все прошло успешно, на стороне клиента и сервера

300 – информацию сервер вернул, но нашел в другом месте

301 – клиент обратился к странице, которая перемещена и находится на другом адресе.

304 – говорит о том, что информация о нашем сайте хранится в кэше, в таком случае он может вернуть эту ошибку и забрать полезную нагрузку с нашего локального компьютера

400 – ошибка на клиенте, запрос не смог был обработан сервером и необходимо скопировать всю информацию о нашем запросе в баг-репорт

401 – характеризует ошибку в авторизации (не правильный логин и пароль)

403 - даже при правильной авторизации система ввела какие-то ограничения доступа – нет прав и т.д

404 – клиент обращается к ресурсу, которого уже нет на сервере

500 – ошибка сервера

http и https.

В чем же различие. HTTPS – S – значит Secure – то есть защищенный. Это защита нашего протокола посредством криптографических протоколов SSL и TSL. Перед отправкой наши данные шифруются, это обеспечивает им большую защиту. Поэтому если Вы видите сайт, в URI которого стоит HTTP, то стоит насторожиться.

Передача протокола осуществляется по Модели TCP/IP.

Данная модель включает в себя несколько уровней Уровни TCP/IP:

  • сетевые интерфейсы – передаются физические импульсы (оптоволокно) (протокол Ethernet)
  • сетевой – происходит передача физических сигналов, основной протокол –IP, но также есть протоколы ARP, ICMP, IGMP
  • транспортный – транспортные взаимодействия в нашей сети:

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

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

  • application(прикладной) – специфический уровень для нашего приложения (HTTP, FTTP, Telnet, NTP, DHCP, PING)