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 preflight
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 — аналіз пакетів GUI

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

Wireshark дозволяє вам:

  • Реконструювати повні HTTP-розмови
  • Фільтрувати трафік за протоколом, IP, портом або вмістом
  • Визначити вузькі місця продуктивності та помилки
  • Виявити підозрілі або шкідливі закономірності трафіку

ngrep — Network 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. Якщо ви зіткнулися з пом

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати