Какая структура у HTTP-запроса?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Какая структура у HTTP-запроса?
HTTP запрос состоит из трёх основных частей: Request Line, Headers и Body. Это фундаментальная концепция, которая определяет, как клиент взаимодействует с сервером.
Структура HTTP запроса
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 27
Authorization: Bearer token123
Accept: application/json
{"name": "John", "email": "j@example.com"}
Компонент 1: Request Line
Request Line — первая строка, которая содержит метод, путь и версию HTTP.
Формат:
[METHOD] [URI] [HTTP_VERSION]
Пример:
POST /api/v1/users HTTP/1.1
GET /products?page=1&limit=10 HTTP/1.1
PUT /articles/123 HTTP/1.1
Компоненты:
- METHOD — HTTP метод (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, TRACE)
- URI — адрес ресурса относительно сервера (может содержать query параметры)
- HTTP_VERSION — версия протокола (HTTP/1.0, HTTP/1.1, HTTP/2, HTTP/3)
Компонент 2: Headers (Заголовки)
Headers — ключ-значение пары, которые предоставляют дополнительную информацию о запросе.
Формат:
Header-Name: Header-Value
Обязательные заголовки:
// Host — обязателен в HTTP/1.1
Host: api.example.com
// Content-Length — размер body в байтах (для методов с body)
Content-Length: 145
// Content-Type — тип данных в body
Content-Type: application/json
Часто используемые заголовки:
// Авторизация
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Authorization: Basic dXNlcjpwYXNz
Authorization: ApiKey sk-12345678
// Контент и кодировка
Content-Type: application/json
Content-Type: application/x-www-form-urlencoded
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
Content-Encoding: gzip
Accept-Encoding: gzip, deflate, br
// Кэширование
Cache-Control: no-cache, no-store, must-revalidate
If-Modified-Since: Wed, 29 Mar 2023 12:00:00 GMT
If-None-Match: "abc123"
// Прочие
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Referer: https://example.com/page
Cookie: session_id=abc123; theme=dark
Accept: application/json
Accept-Language: en-US,en;q=0.9
Важно: Headers заканчиваются двумя переносами строк (CRLF CRLF: \r\n\r\n), которые отделяют их от body.
Компонент 3: Body (Тело запроса)
Body — опциональный компонент, который содержит данные для сервера (JSON, XML, форма, файл и т.д.).
Когда body нужен:
- POST — создание нового ресурса
- PUT — полное обновление ресурса
- PATCH — частичное обновление ресурса
Когда body не нужен:
- GET — получение данных
- DELETE — удаление ресурса (хотя технически можно отправить)
- HEAD — аналог GET, но без body в ответе
Полный пример HTTP запроса
Пример 1: GET запрос (без body)
GET /api/v1/users/123?include=posts HTTP/1.1
Host: api.example.com
Accept: application/json
Authorization: Bearer token123
User-Agent: MyApp/1.0
Пример 2: POST запрос (с JSON body)
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 48
Authorization: Bearer token123
{"name": "John Doe", "email": "john@example.com"}
Пример 3: PATCH запрос (частичное обновление)
PATCH /api/v1/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 22
Authorization: Bearer token123
{"status": "active"}
Пример 4: Multipart (загрузка файла)
POST /api/v1/upload HTTP/1.1
Host: api.example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 345
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg
[binary image data]
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="title"
My Photo
------WebKitFormBoundary7MA4YWxkTrZu0gW--
HTTP методы
| Метод | Назначение | Body | Безопасный | Идемпотентный |
|---|---|---|---|---|
| GET | Получить ресурс | Нет | Да | Да |
| POST | Создать ресурс | Да | Нет | Нет |
| PUT | Заменить ресурс | Да | Нет | Да |
| PATCH | Обновить ресурс | Да | Нет | Нет |
| DELETE | Удалить ресурс | Нет | Нет | Да |
| HEAD | Как GET, без body | Нет | Да | Да |
| OPTIONS | Получить методы | Нет | Да | Да |
| TRACE | Трассировка | Нет | Да | Да |
HTTP версии
HTTP/1.0 — каждый запрос требует нового соединения
GET / HTTP/1.0
Host: example.com
HTTP/1.1 — поддерживает Keep-Alive (переиспользование соединения)
GET / HTTP/1.1
Host: example.com
Connection: keep-alive
HTTP/2 — бинарный протокол, мультиплексирование, сжатие заголовков
:method: GET
:path: /
:scheme: https
:authority: example.com
HTTP/3 — QUIC протокол, быстрее, улучшенная надежность
Как выглядит HTTP запрос в Node.js
Использование fetch API:
const response = await fetch('/api/v1/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token123',
'Accept': 'application/json'
},
body: JSON.stringify({ name: 'John', email: 'john@example.com' })
});
const data = await response.json();
Использование axios:
const axios = require('axios');
const response = await axios.post('/api/v1/users',
{ name: 'John', email: 'john@example.com' },
{
headers: {
'Authorization': 'Bearer token123',
'Content-Type': 'application/json'
}
}
);
Использование Express (на стороне сервера):
app.post('/api/v1/users', (req, res) => {
// req.method => 'POST'
// req.url => '/api/v1/users'
// req.headers => все заголовки
// req.body => распарсенное body (при использовании middleware)
console.log(req.method); // POST
console.log(req.headers['content-type']); // application/json
console.log(req.body); // { name: 'John', ... }
});
Лучшие практики
- Всегда устанавливай Content-Type при отправке body
- Включай Authorization если запрос требует аутентификации
- Используй правильный метод (GET для чтения, POST для создания и т.д.)
- Проверяй Content-Length при отправке большого body
- Обрабатывай ошибки и проверяй статусы ответов
- Используй HTTPS для защиты данных при передаче
Понимание структуры HTTP запроса — это фундамент для работы с REST API и веб-разработкой в целом.