В этой статье рассмотрим методы протокола HTTP и их функционал с позиции тестировщика. Рассмотрим также менее популярные (и используемые) методы, как: OPTIONS, TRACE, HEAD, CONNECT.
Протокол HTTP
В настоящий момент HTTP-протокол широко используется для обеспечения работы клиент-серверной архитектуры. Есть клиент (обычно это браузер), который запрашивает информацию у сервера, а сервер, в свою очередь, обрабатывает запрос и дает ответ согласно протоколу. Благодаря наличию протокола клиент и сервер имеют четкую структуру, которым должны соответствовать запросы клиента и ответа сервера.
HTTP - это протокол прикладного уровня, который находится на вершине “пирамиды уровней”, как в сетевой модели TCP/IP, так и в модели OSI. Данный уровень регламентирует взаимодействие пользователя и сети.
Другие протоколы аналогичного уровня:
FTP - предназначен для передачи файлов
SMTP - используется для отправки электронной почты
POP3 - используется для получения электронной почты
DNS - применяется для работы системы доменных имен (поиска IP-адреса по “человекопонятному” имени веб-сайта)
HTTP - запрос и его структура
Взаимодействие клиента с сервером осуществляется посредством запроса по протоколу HTTP. У него следующая структура: стартовая строка, заголовки и тело.
Стартовая строка сообщает ключевую информацию о запросе и состоит из метода запроса (да, дойдем и до темы статьи), URL (Uniform Resource Locator) и версии протокола.
Пример стартовой строки:
GET <https://www.aviasales.ru/?params=SVX1> HTTP/1.1
GET - метод запроса
URL - [<https://www.aviasales.ru/?params=SVX1>](<https://www.aviasales.ru/?params=SVX1>)
Версия HTTP - HTTP/1.1
Заголовки:
Основные заголовки
Среди них есть такие, как Date (показывает дату и время, когда был создан запрос), Cache-Control (дает инструкции по кэшированию) и Connection (указывает нужно ли закрывать соединение после завершения запроса).
Заголовки запроса
Здесь часто можно встретить User-Agent (указывает на окружение, из которой был отправлен запрос; браузер, ОС), Accept-Language (человеческие языки, которые понимает клиент), Referer (URL ресурса, с которого был переход на текущую страницу), а Accept-Encoding (описывает кодировку данных, которую клиент может понимать; например, частый вариант gzip deflate поясняет, что клиент принимает данные, сжатые методом gzip по алгоритму deflate).
Заголовок Accept, в свою очередь, указывает те типы контента, которые клиент способен понять, к примеру: text/html, application/xml.
Cookie - необязательный заголовок, который передает куки, которые сохранены для данного сервера.
If-Modified-Since - содержит дату и время версии запрашиваемого ресурса, с которыми сравнивается текущая версия. Только в случае, если эти даты не совпадают и ресурс был обновлен после указанной даты, сервер отправляет клиенту текущую версию ресурса. Иначе отправляется ответ 304 (Not Modified) и заголовок ответа Last-Modified будет содержать данные последнего обновления.
Authorization - содержит данные для подтверждения возможности доступа клиента к ресурсу, нужен для проверки подлинности агента. Заголовок является необязательным.
Заголовки сущности
Content-Length: размер отправленного запроса в байтах.
Content-Type: указывает на формат отправляемых данных (POST-запрос, например), содержит информацию по кодировкам (charset=UTF-8, как вариант).
Тело запроса:
В теле запроса передаются данные, которые клиент хочет передать на сервер. Тело - необязательный элемент запроса, обычно только запросы POST, PUT, PATCH отправляют данные в body. Здесь могут передаваться, например, данные в формате JSON / XML в качестве параметров для частичного или полного обновления информации, для создания новых записей в базе данных через сервер.
HTTP-методы
*Если метод кэшируемый, то ответ сервера можно сохранять для дальнейшего использования, не выполняя повторных запросов. GET, HEAD кэшируются, POST и PATCH - только при соблюдении определенных условий.
**Метод называется идемпотентным, если при выполнении одинакового запроса больше одного раза, получается один и тот же результат, состояние ресурса не меняется.
GET
Пожалуй, самый известный метод HTTP-запроса, предназначенный для получения информации с сервера. Из-за того, что у GET-запроса нет тела, параметры мы можем передать после знака вопроса в конце URL. Задаются они по схеме ключ=значение и разделяются между собой амперсандом (&). Но именно поэтому запрос GET является менее безопасным, чем POST, так как передаваемая информация видна в URL. В ответе возвращается информация в формате, указанном в заголовке ответа Content-type.
Из нюансов: у запроса нет тела, метод кэшируемый* и идемпотентный**.
HEAD
Метод похож на облегченный метод GET, так как он также запрашивает информацию с ресурса, но в ответ от сервера не приходит тело ответа, хотя заголовки ответа возвращаются. Пригодится, чтобы проверить, что ресурс доступен, с него можно получить информацию, если нужно, а также увидеть дополнительные сведения, как дату последнего изменения или тип возвращаемого контента, например.
Метод идемпотентный и кэшируемый.
POST
Используется для отправки информации на ресурс. Запрос приводит к изменениям на сервере, многократное применение запроса POST может привести к дублировании записей в БД, в отличие от запроса PUT, который полностью перезаписывает данные на ресурсе, не создавая новую сущность. Содержит тело, которое может быть в виде xml / html / json или в в простом текстовом формате.
Не является идемпотентным, обычно не кэшируется.
PUT
Предназначен для изменения данных на ресурсе, отправка запроса с методом PUT полностью обновить запись на ресурсе. У запроса всегда присутствует тело, где передается информация для ресурса. В случае, если записи не существует, то создастся новая запись, как при POST.
Метод является идемпотентным, но не кэшируемым.
PATCH Благодаря отправке запроса с методом PATCH можно частично изменять указанный ресурс. У запроса обязательно должно быть тело, где передаются параметры для корректировки данных на стороне сервера (форматы возможны, как в теле POST). Если вы любите аналогии, то знайте, что Mozilla Docs говорит нам, что PATCH похож на UPDATE в концепции CRUD для работы с базами данных.
Метод не является ни кэшируемым, ни идемпотентным.
DELETE
Метод позволяет отправить запрос на удаление указанной сущности. У запроса может быть тело, но оно необязательно. В нем можно указать параметры для поиска записи в базе данных и ее последующего удаления.
Метод не кэшируется, но он идемпотентен.
OPTIONS
Данный HTTP-метод позволяет получить сведения о деталях соединения с ресурсом. Благодаря данному методу можно узнать какие другие методы допустимы при обращении к ресурсу (передается в ответе в хэдере Allow). Если в стартовой строке вместо URI передается звездочка (*), то запрос направлен ко всему серверу, а не к конкретному ресурсу.
Запрос с подобным методом идемпотентен, не кэшируется, у запроса нет тела.
CONNECT
Метод дает возможность установить связь с ресурсом, организовывает своеобразный “туннель”. Может использоваться для установления соединения с ресурсами, которые применяют шифрование соединения по SSL. Клиент отправляет запрос прокси-сервер, который устанавливает зашифрованное соединение с сервером, устанавливая канал, по которому клиент и сервер могут безопасно обмениться сообщениями.
У запроса CONNECT нет тела, данный метод не является ни идемпотентным, ни кэшируемым.
TRACE
Позволяет следить за тем, что происходит с запросом на пути к целевому ресурсу, как изменяется запрос промежуточными серверами, например, прокси-серверами. Метод предназначен прежде всего для целей диагностики. Если метод доступен для ресурса, то в ответ на запрос TRACE сервер “отразит” в ответ сам запрос в изначальном виде, который был получен.
Запрос не имеет тела, метод идемпотентен, кэшируется.
Резюме
Из рассмотренных выше методов самыми часто встречающимися в работе тестировщика являются GET, POST, PUT, DELETE и PATCH. Остальные методы являются более техническими и обслуживающими, поэтому не используется регулярно в повседневной работе. Знание методов, их предназначения пригодятся при тестировании веб-сайтов, API и важны для формирования понимания того, как изнутри устроена структура HTTP-запросов.
Ресурсы для статьи:
https://developer.mozilla.org/ru/docs/Web/HTTP/Methods
https://ru.wikipedia.org/wiki/HTTP