Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Структура HTTP запроса и ответа
HTTP делится на две основные части:
1. HTTP Request (Запрос от клиента)
Любой HTTP запрос состоит из четырёх компонентов:
A. Request Line (Строка запроса)
Первая строка запроса, содержит метод, путь и версию:
GET /api/users/123 HTTP/1.1
GET— HTTP метод/api/users/123— путь (URI)HTTP/1.1— версия протокола
B. Request Headers (Заголовки запроса)
Метаинформация о запросе в формате key: value:
Host: api.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGc...
User-Agent: Mozilla/5.0
Accept: application/json
Accept-Language: ru-RU
Cache-Control: no-cache
Важные заголовки:
// Аутентификация
Authorization: Bearer <token>
Authorization: Basic <base64(user:pass)>
// Формат данных
Content-Type: application/json
Content-Type: application/x-www-form-urlencoded
Content-Type: multipart/form-data
// Что клиент ожидает в ответе
Accept: application/json
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU, en;q=0.9
// Управление кэшем
Cache-Control: no-cache
If-Modified-Since: Wed, 01 Jan 2020 12:00:00 GMT
If-None-Match: "abc123" // ETag
// Размер тела
Content-Length: 256
// Источник запроса (CORS)
Origin: https://example.com
// Информация о браузере
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
// Cookies
Cookie: sessionId=abc123; userId=456
C. Empty Line (Пустая строка)
Отделяет заголовки от тела:
[заголовки выше]
[тело ниже]
D. Request Body (Тело запроса)
Данные, которые отправляет клиент. Может быть пустым для GET:
{
"name": "John",
"email": "john@example.com",
"age": 30
}
Полный пример HTTP запроса:
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 43
Authorization: Bearer token123
{
"name": "John",
"email": "john@example.com"
}
2. HTTP Response (Ответ от сервера)
Ответ сервера тоже состоит из четырёх частей:
A. Status Line (Строка состояния)
Первая строка ответа, содержит версию протокола, код и описание:
HTTP/1.1 200 OK
HTTP/1.1— версия протокола200— код состоянияOK— описание кода
Коды состояния:
// 1xx — информационные (редко)
100 Continue
// 2xx — успех
200 OK // Успешный запрос
201 Created // Ресурс создан
202 Accepted // Запрос принят, обработка в процессе
204 No Content // Успех, но данных нет (часто для DELETE)
206 Partial Content // Partial upload (video streaming)
// 3xx — редирект
301 Moved Permanently // URL навсегда переехал
302 Found // Временный редирект
304 Not Modified // Клиент может использовать кэш
307 Temporary Redirect // Временный редирект, методом не меняется
// 4xx — ошибка клиента
400 Bad Request // Неверный синтаксис запроса
401 Unauthorized // Требуется аутентификация
403 Forbidden // Нет прав доступа
404 Not Found // Ресурс не найден
409 Conflict // Конфликт (например при создании дубликата)
429 Too Many Requests // Rate limiting
// 5xx — ошибка сервера
500 Internal Server Error
502 Bad Gateway // Ошибка в upstream сервере
503 Service Unavailable // Сервис недоступен
504 Gateway Timeout // Timeout при обращении к upstream
B. Response Headers (Заголовки ответа)
Метаинформация об ответе:
Content-Type: application/json
Content-Length: 256
Cache-Control: max-age=3600
ETag: "abc123"
Set-Cookie: sessionId=xyz789; Path=/; HttpOnly; Secure
Access-Control-Allow-Origin: *
Важные заголовки ответа:
// Формат данных
Content-Type: application/json; charset=utf-8
Content-Length: 1024
// Кэширование
Cache-Control: max-age=3600 // кэшируй 1 час
Cache-Control: no-cache // всегда проверяй с сервером
Cache-Control: no-store // не кэшируй вообще
ETag: "abc123" // идентификатор версии
Last-Modified: Wed, 01 Jan 2020
Expires: Wed, 01 Jan 2021
// Сжатие
Content-Encoding: gzip
// CORS
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 86400
// Безопасность
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000
// Куки (для сессий)
Set-Cookie: sessionId=abc123
Set-Cookie: sessionId=abc123; Path=/; Domain=.example.com; HttpOnly; Secure; SameSite=Strict
// Редирект
Location: https://example.com/new-path
// Другое
Server: nginx/1.18.0
Date: Wed, 01 Jan 2020 12:00:00 GMT
C. Empty Line (Пустая строка)
Отделяет заголовки от тела
D. Response Body (Тело ответа)
Данные, которые отправляет сервер:
{
"id": 123,
"name": "John",
"email": "john@example.com",
"createdAt": "2020-01-01T12:00:00Z"
}
Полный пример HTTP ответа:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 78
Cache-Control: max-age=3600
Set-Cookie: sessionId=abc123; HttpOnly; Secure
Access-Control-Allow-Origin: https://example.com
{
"id": 123,
"name": "John",
"email": "john@example.com"
}
На что делится HTTP в коде
В Express.js:
app.post('/api/users', (req, res) => {
// REQUEST
console.log(req.method); // POST (из Request Line)
console.log(req.path); // /api/users
console.log(req.headers); // все заголовки запроса
console.log(req.body); // тело запроса
// RESPONSE
res.status(201); // код состояния
res.setHeader('Content-Type', 'application/json'); // заголовок
res.json({ id: 123 }); // тело ответа
});
Raw HTTP пример:
=== REQUEST ===
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 43
{"name": "John", "email": "john@example.com"}
=== RESPONSE ===
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 78
Location: /api/users/123
{"id": 123, "name": "John", "email": "john@example.com"}
Практический пример в Node.js
import http from 'http';
const server = http.createServer((req, res) => {
// REQUEST части
console.log(`Метод: ${req.method}`); // POST
console.log(`Путь: ${req.url}`); // /api/users
console.log(`Версия: ${req.httpVersion}`); // 1.1
console.log(`Заголовки:`, req.headers); // все headers
// Читаем тело запроса
let body = '';
req.on('data', chunk => {
body += chunk;
});
req.on('end', () => {
const data = JSON.parse(body);
// RESPONSE части
res.writeHead(201, { // Status Line + Headers
'Content-Type': 'application/json',
'X-Custom-Header': 'value'
});
res.end(JSON.stringify({ // Body
id: 123,
...data
}));
});
});
server.listen(3000);
Итого: На что делится HTTP
HTTP Request:
- Request Line — метод + путь + версия
- Headers — метаинформация о запросе
- Empty line — разделитель
- Body — данные (опционально)
HTTP Response:
- Status Line — версия + код + описание
- Headers — метаинформация об ответе
- Empty line — разделитель
- Body — данные (опционально)
Эта структура одинакова для всех HTTP версий (1.0, 1.1, 2.0, 3.0), хотя в HTTP/2 и HTTP/3 есть оптимизации при передаче.