15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
31.10.2024

Понимание HTTP запросов в Linux: структура, методы и практические примеры

HTTP (Hypertext Transfer Protocol) — это основной коммуникационный уровень современной сети. Каждый раз, когда браузер загружает страницу, выполняется вызов API или сервер получает удалённый ресурс, в основе этого взаимодействия лежит HTTP-запрос. Для администраторов Linux, разработчиков и инженеров DevOps глубокое понимание структуры HTTP-запросов, выбора методов и создания или анализа запросов из командной строки — это не просто полезно, это необходимо.

Это подробное руководство разбирает анатомию HTTP-запроса, объясняет все основные HTTP-методы с примерами из реальной жизни и проводит вас через самые мощные инструменты Linux, доступные для отправки, отладки и анализа HTTP-трафика. Независимо от того, управляете ли вы окружением VPS Hosting, запускаете веб-приложения на выделенном сервере или просто изучаете основы веб-коммуникации, эта статья укрепит вашу техническую базу.

Что такое HTTP-запрос?

HTTP-запрос — это сообщение, отправляемое клиентом (например, веб-браузером, мобильным приложением или инструментом командной строки) на сервер с просьбой выполнить определённое действие с ресурсом. Сервер затем обрабатывает запрос и возвращает HTTP-ответ.

Этот обмен между клиентом и сервером регулируется спецификацией HTTP, в настоящее время наиболее широко развёрнуты HTTP/1.1 и HTTP/2, а HTTP/3 (на основе QUIC) быстро набирает популярность.

Анатомия HTTP-запроса

Каждый HTTP-запрос состоит из трёх основных частей: строки запроса, заголовков и необязательного тела сообщения. Понимание каждого компонента критически важно для отладки проблем, создания API и правильной настройки веб-серверов.

1. Строка запроса

Строка запроса всегда является первой строкой HTTP-запроса. Она содержит три элемента, разделённые пробелами:

  • HTTP-метод — действие, которое необходимо выполнить (например, GET, POST, DELETE)
  • Request-URI — путь к целевому ресурсу (например, /index.html или /api/users)
  • HTTP-версия — используемая версия протокола (например, HTTP/1.1)

Пример:

GET /index.html HTTP/1.1

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

Заголовки содержат метаданные о запросе. Они информируют сервер о возможностях клиента, формате отправляемых данных, учётных данных для аутентификации, предпочтениях кеширования и многом другом. Каждый заголовок — это пара ключ-значение, разделённая двоеточием.

Распространённые заголовки и их назначение:

ЗаголовокНазначение
HostУказывает доменное имя сервера
User-AgentИдентифицирует клиентское программное обеспечение, выполняющее запрос
AcceptСообщает серверу, какие типы контента может обрабатывать клиент
Content-TypeОписывает формат тела запроса
Content-LengthУказывает размер тела запроса в байтах
AuthorizationСодержит учётные данные для аутентификации
Accept-EncodingПеречисляет алгоритмы сжатия, поддерживаемые клиентом
ConnectionКонтролирует, остаётся ли соединение открытым после запроса

Примеры заголовков:

Host: www.example.com
User-Agent: Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

3. Тело запроса

Не все HTTP-запросы включают тело. Методы GET и DELETE обычно не содержат тело. Методы POST, PUT и PATCH используют тело для передачи данных на сервер — например, отправка форм, JSON-полезных нагрузок или загрузка файлов.

Полный пример HTTP-запроса

Ниже приведён полный, реалистичный HTTP-запрос к конечной точке входа, которая принимает JSON-учётные данные:

POST /login HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36
Content-Type: application/json
Content-Length: 57
Accept: application/json
Connection: keep-alive

{
  "username": "exampleUser",
  "password": "examplePassword"
}

Разбирая это:

  • POST /login HTTP/1.1 — строка запроса
  • Блок пар ключ-значение — заголовки запроса
  • JSON-объект внизу — тело запроса

HTTP-методы объяснены

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

GET — получить ресурс

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

Характеристики:

  • Безопасен — не изменяет состояние сервера
  • Идемпотентен — многократный вызов даёт одинаковый результат
  • Параметры передаются через строку запроса URL
  • Никогда не должен использоваться для отправки конфиденциальных данных

Пример:

GET /api/users?id=123 HTTP/1.1
Host: api.example.com
Accept: application/json

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

POST — отправить данные на сервер

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

Характеристики:

  • Не идемпотентен — отправка одного и того же запроса дважды может создать дублирующиеся записи
  • Данные отправляются в теле запроса
  • Обычно используется для отправки форм и создания ресурсов API

Пример:

POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 51

{
  "name": "John Doe",
  "email": "john@example.com"
}

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

PUT — заменить или создать ресурс

Назначение: полностью заменить существующий ресурс или создать его, если он ещё не существует, по указанному URI.

Характеристики:

  • Идемпотентен — отправка одного и того же PUT-запроса несколько раз всегда приводит к одному и тому же состоянию ресурса
  • Заменяет весь ресурс (в отличие от PATCH, который является частичным)

Пример:

PUT /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 52

{
  "name": "Jane Doe",
  "email": "jane@example.com"
}

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

DELETE — удалить ресурс

Назначение: удалить указанный ресурс с сервера.

Характеристики:

  • Идемпотентен — удаление ресурса, который больше не существует, всё равно возвращает успешный (или 404) ответ без дополнительных побочных эффектов
  • Обычно не содержит тело запроса

Пример:

DELETE /api/users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Варианты использования: удаление учётных записей пользователей, удаление записей, очистка ресурсов.

PATCH — частичное обновление ресурса

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

Характеристики:

  • Не обязательно идемпотентен — в зависимости от реализации повторные вызовы могут иметь разные эффекты
  • Более экономичен по пропускной способности, чем PUT для небольших обновлений

Пример:

PATCH /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 34

{
  "email": "jane.doe@example.com"
}

Варианты использования: обновление одного поля (например, адреса электронной почты), переключение флага статуса.

Другие примечательные HTTP-методы

МетодНазначение
HEADТо же, что GET, но возвращает только заголовки, без тела — полезно для проверки существования ресурса или метаданных
OPTIONSВозвращает HTTP-методы, поддерживаемые сервером для конкретного URL — используется в предварительных запросах CORS
CONNECTУстанавливает туннель к серверу (используется для HTTPS через прокси)
TRACEВозвращает полученный запрос обратно клиенту — в основном для диагностических целей

Создание HTTP-запросов в Linux: инструменты и примеры

Linux предлагает богатую экосистему инструментов командной строки для создания, отправки и анализа HTTP-запросов. Вот самые важные из них, которые должен знать каждый администратор и разработчик.

1. curl — швейцарский нож HTTP

curl — это наиболее широко используемый инструмент командной строки для передачи данных по HTTP, HTTPS, FTP и десяткам других протоколов. Он предустановлен практически на всех дистрибутивах Linux и незаменим для тестирования API, написания скриптов и автоматизации.

Базовый GET-запрос:

curl -X GET https://api.example.com/users

GET-запрос с подробным выводом (показывает заголовки):

curl -v https://api.example.com/users

POST-запрос с JSON-телом:

curl -X POST https://api.example.com/users 
  -H "Content-Type: application/json" 
  -d '{"name": "John Doe", "email": "john@example.com"}'

PUT-запрос для обновления ресурса:

curl -X PUT https://api.example.com/users/123 
  -H "Content-Type: application/json" 
  -H "Authorization: Bearer YOUR_TOKEN" 
  -d '{"name": "Jane Doe", "email": "jane@example.com"}'

DELETE-запрос:

curl -X DELETE https://api.example.com/users/123 
  -H "Authorization: Bearer YOUR_TOKEN"

PATCH-запрос:

curl -X PATCH https://api.example.com/users/123 
  -H "Content-Type: application/json" 
  -d '{"email": "jane.doe@example.com"}'

Сохранить ответ в файл:

curl -o output.html https://www.example.com

Автоматически следовать перенаправлениям:

curl -L https://www.example.com

Ключевые флаги curl, которые нужно знать:

ФлагОписание
-XУказывает HTTP-метод
-HДобавляет заголовок запроса
-dОтправляет данные в теле запроса
-oСохраняет вывод в файл
-vВключает подробный режим (показывает полный запрос/ответ)
-IПолучает только заголовки (HEAD-запрос)
-LСледует HTTP-перенаправлениям
-uПредоставляет имя пользователя и пароль для базовой аутентификации
--insecureПропускает проверку SSL-сертификата (используйте только для тестирования)

2. wget — загрузка файлов и страниц

wget в основном предназначен для загрузки файлов и зеркалирования веб-сайтов. Хотя он менее универсален, чем curl для работы с API, он отлично справляется с рекурсивными загрузками и возобновлением прерванных передач.

Загрузить файл:

wget https://www.example.com/files/archive.zip

Возобновить прерванную загрузку:

wget -c https://www.example.com/files/large-file.iso

Загрузить файл в фоновом режиме:

wget -b https://www.example.com/files/large-file.iso

Зеркалировать весь веб-сайт:

wget --mirror --convert-links --adjust-extension --page-requisites https://www.example.com

Отправить POST-запрос с wget:

wget --post-data='{"name":"John"}' 
  --header='Content-Type: application/json' 
  -O response.json 
  https://api.example.com/users

3. HTTPie — удобный для пользователя HTTP-клиент

HTTPie — это современный, удобный для пользователя инструмент командной строки HTTP, предназначенный для взаимодействия с API максимально интуитивно. Его чистый синтаксис и цветной, отформатированный вывод делают его любимцем разработчиков.

Установить HTTPie:

# Debian/Ubuntu
sudo apt install httpie

# RHEL/CentOS/Fedora
sudo dnf install httpie

GET-запрос:

http GET https://api.example.com/users

POST-запрос с JSON (автоматическое определение типа контента):

http POST https://api.example.com/users 
  name="John Doe" 
  email="john@example.com"

PUT-запрос с аутентификацией:

http PUT https://api.example.com/users/123 
  Authorization:"Bearer YOUR_TOKEN" 
  name="Jane Doe"

DELETE-запрос:

http DELETE https://api.example.com/users/123 
  Authorization:"Bearer YOUR_TOKEN"

HTTPie автоматически форматирует JSON-ответы с подсветкой синтаксиса, что значительно облегчает чтение ответов API по сравнению с необработанным выводом curl.

4. Telnet — необработанные HTTP-запросы для обучения

Хотя telnet непрактичен для использования в производстве, это отличный образовательный инструмент для понимания того, как выглядит HTTP-запрос на необработанном уровне TCP. Он подключается непосредственно к порту 80 и позволяет вам вводить HTTP-запросы вручную.

Подключиться к серверу:

telnet www.example.com 80

Затем введите следующий запрос (нажмите Enter дважды после последней строки):

GET / HTTP/1.1
Host: www.example.com
Connection: close

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

> Примечание: для HTTPS-соединений используйте openssl s_client вместо telnet, так как telnet не может обрабатывать TLS-шифрование.

Необработанный HTTPS-запрос с использованием OpenSSL:

openssl s_client -connect www.example.com:443 -quiet

Затем введите:

GET / HTTP/1.1
Host: www.example.com
Connection: close

5. Python — написание скриптов для HTTP-запросов

Для автоматизации и написания скриптов библиотека requests Python — один из самых популярных инструментов для создания HTTP-запросов программным способом в Linux.

Установить библиотеку requests:

pip install requests

GET-запрос:

import requests

response = requests.get('https://api.example.com/users')
print(response.status_code)
print(response.json())

POST-запрос:

import requests

payload = {"name": "John Doe", "email": "john@example.com"}
response = requests.post('https://api.example.com/users', json=payload)
print(response.status_code)
print(response.json())

Анализ HTTP-трафика в Linux

Помимо создания запросов, Linux предоставляет мощные инструменты для захвата и анализа HTTP-трафика — важные навыки для отладки, оптимизации производительности и анализа безопасности.

tcpdump — захват сетевых пакетов

tcpdump — это анализатор пакетов командной строки, который захватывает необработанный сетевой трафик. Он доступен практически на каждой системе Linux и требует привилегий root или sudo.

Захватить весь HTTP и HTTPS-трафик:

sudo tcpdump -i any -A 'tcp port 80 or tcp port 443'

Захватить трафик на конкретном интерфейсе и сохранить в файл:

sudo tcpdump -i eth0 -w capture.pcap 'tcp port 80'

Прочитать сохранённый файл захвата:

sudo tcpdump -r capture.pcap

Фильтровать трафик по хосту:

sudo tcpdump -i any host www.example.com

Wireshark — анализ пакетов с графическим интерфейсом

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

Wireshark позволяет вам:

  • Восстанавливать полные HTTP-беседы
  • Фильтровать трафик по протоколу, IP, порту или содержимому
  • Выявлять узкие места производительности и ошибки
  • Обнаруживать подозрительные или вредоносные паттерны трафика

ngrep — сетевой grep

ngrep объединяет мощь tcpdump с поиском по шаблонам в стиле grep, что облегчает поиск конкретных строк в сетевом трафике.

Поиск HTTP GET-запросов:

sudo ngrep -d any 'GET' 'tcp port 80'

Поиск конкретного хоста в трафике:

sudo ngrep -d any 'example.com' 'tcp port 80 or tcp port 443'

HTTP-коды состояния: понимание ответов сервера

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

Диапазон кодовКатегорияРаспространённые примеры
1xxИнформационный100 Continue, 101 Switching Protocols
2xxУспех200 OK, 201 Created, 204 No Content
3xxПеренаправление301 Moved Permanently, 302 Found, 304 Not Modified
4xxОшибка клиента400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xxОшибка сервера500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable

Защита HTTP-запросов: HTTPS и SSL/TLS

В производственных окружениях весь HTTP-трафик должен быть зашифрован с использованием HTTPS (HTTP через TLS/SSL). Отправка учётных данных, токенов API или любых конфиденциальных данных по простому HTTP подвергает их перехвату кем-либо на пути сети.

При работе с curl всегда используйте https://-URL. Если вы столкнулись с ошибками SSL-сертификата при разработке, вы можете временно обойти проверку с помощью --insecure, но никогда не делайте это в производстве.

Для проверки SSL-сертификата сервера из командной строки:

curl -vI https://www.example.com 2>&1 | grep -A 10 "SSL certificate"

Или используйте OpenSSL напрямую:

openssl s_client -connect www.example.com:443 -showcerts

Если вы размещаете веб-приложения и нуждаетесь в защите их доверенным SSL-сертификатом, AlexHost предлагает

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать