← Назад к вопросам

На что делится HTTP?

1.2 Junior🔥 161 комментариев
#API и сетевые протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Структура 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:

  1. Request Line — метод + путь + версия
  2. Headers — метаинформация о запросе
  3. Empty line — разделитель
  4. Body — данные (опционально)

HTTP Response:

  1. Status Line — версия + код + описание
  2. Headers — метаинформация об ответе
  3. Empty line — разделитель
  4. Body — данные (опционально)

Эта структура одинакова для всех HTTP версий (1.0, 1.1, 2.0, 3.0), хотя в HTTP/2 и HTTP/3 есть оптимизации при передаче.

На что делится HTTP? | PrepBro