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

Из чего состоит http запрос

1.0 Junior🔥 191 комментариев
#Сети и протоколы

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

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

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

# Из чего состоит HTTP запрос

HTTP запрос — это сообщение, которое отправляет клиент серверу. Структура стандартизирована RFC 7231.

Общая структура

[Request Line]
[Headers]
[Empty Line]
[Body]

1. Request Line (Первая строка)

Описывает что клиент хочет сделать.

Формат: METHOD URL HTTP-VERSION

Пример:

GET /api/users/123 HTTP/1.1
POST /api/login HTTP/1.1
PUT /api/users/123 HTTP/1.1
DELETE /api/users/123 HTTP/1.1

Компоненты Request Line

a) HTTP Method (глагол)

  • GET — получить ресурс
  • POST — создать новый ресурс
  • PUT — заменить существующий ресурс
  • PATCH — частичное обновление
  • DELETE — удалить ресурс
  • HEAD — как GET, но без тела ответа
  • OPTIONS — получить допустимые методы

b) URL (Resource Path + Query Parameters)

Структура URL:

https://api.example.com:8080/api/v1/users?page=2&limit=10
       └─────────────────────┬──────────────────────┘
              Protocol + Host        Path + Query
  • Protocol: http или https
  • Host: example.com (+ port если не стандартный)
  • Path: /api/v1/users (путь к ресурсу)
  • Query parameters: ?page=2&limit=10 (фильтры и параметры)

Примеры:

GET /api/users HTTP/1.1                    # Простой путь
GET /api/users?id=123 HTTP/1.1             # С параметром
GET /api/users/123/posts HTTP/1.1          # Nested resource
GET /api/users/123?sort=name&order=asc HTTP/1.1  # Несколько параметров

c) HTTP Version

  • HTTP/1.0 — старая версия
  • HTTP/1.1 — стандарт (поддержка keep-alive, chunking)
  • HTTP/2 — более быстрая (multiplexing, compression)
  • HTTP/3 — новейшая (QUIC protocol)

2. Headers (Заголовки)

Метаинформация о запросе. Формат: Key: Value

Host: api.example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
Content-Length: 256
Authorization: Bearer token123
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: no-cache
X-API-Key: secret-key-12345

Стандартные Headers

HeaderНазначениеПример
HostХост сервера (обязателен)api.example.com
User-AgentИнформация о клиентеMozilla/5.0 (Windows NT 10.0)
Content-TypeФормат тела запросаapplication/json
Content-LengthРазмер тела в байтах256
AuthorizationДанные аутентификацииBearer eyJhbGc...
AcceptКакие форматы ответа приниматьapplication/json
Accept-LanguageПредпочитаемые языкиen-US, en;q=0.9
Accept-EncodingПоддерживаемые сжатияgzip, deflate, br
ConnectionУправление соединениемkeep-alive
Cache-ControlКэшированиеno-cache, no-store
X-API-KeyCustom заголовок для API ключаsecret-key-12345
X-Request-IDID для трейсированияabc-123-def
RefererС какой страницы пришел запросhttps://example.com/page
CookieСохраненные cookiessession=abc123; user=john

Content-Type примеры

Content-Type: application/json
Content-Type: application/x-www-form-urlencoded
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
Content-Type: text/plain
Content-Type: text/xml
Content-Type: text/html

3. Empty Line

Пустая строка разделяет Headers и Body.

[Headers end]

[Body starts]

4. Body (Тело запроса)

Данные, которые отправляются серверу. Присутствует только в POST, PUT, PATCH запросах (не в GET).

JSON Body

{
  "name": "John Doe",
  "email": "john@example.com",
  "age": 30,
  "address": {
    "city": "New York",
    "zip": "10001"
  },
  "tags": ["developer", "python", "qa"]
}

Form URL Encoded Body

name=John+Doe&email=john@example.com&age=30

Multipart/Form-Data (файлы)

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="profile.jpg"
Content-Type: image/jpeg

[BINARY IMAGE DATA HERE]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

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

Запрос 1: GET

GET /api/users/123 HTTP/1.1
Host: api.example.com
User-Agent: Python-Requests/2.28.1
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Connection: keep-alive

(Нет тела)

Запрос 2: POST с JSON

POST /api/users HTTP/1.1
Host: api.example.com
User-Agent: Python-Requests/2.28.1
Content-Type: application/json
Content-Length: 89
Authorization: Bearer token123
Connection: keep-alive

{
  "name": "Alice Smith",
  "email": "alice@example.com",
  "password": "securepass123"
}

Запрос 3: PUT (обновление)

PUT /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 45
Authorization: Bearer token123

{
  "name": "Alice Johnson",
  "email": "alice.johnson@example.com"
}

Запрос 4: DELETE

DELETE /api/users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer token123
Connection: keep-alive

(Нет тела)

Запрос 5: POST с файлом (multipart)

POST /api/upload HTTP/1.1
Host: api.example.com
Content-Type: multipart/form-data; boundary=----Boundary123
Content-Length: 2048
Authorization: Bearer token123

------Boundary123
Content-Disposition: form-data; name="file"; filename="document.pdf"
Content-Type: application/pdf

[BINARY PDF DATA]
------Boundary123
Content-Disposition: form-data; name="description"

My important document
------Boundary123--

Как это выглядит в коде

Python requests

import requests

# GET запрос
response = requests.get(
    "https://api.example.com/api/users/123",
    headers={
        "Authorization": "Bearer token123",
        "Accept": "application/json"
    },
    params={"include": "posts"}  # Query parameters
)

# POST запрос с JSON
response = requests.post(
    "https://api.example.com/api/users",
    json={
        "name": "Alice",
        "email": "alice@example.com"
    },
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer token123"
    }
)

# PUT запрос
response = requests.put(
    "https://api.example.com/api/users/123",
    json={"name": "Alice Smith"},
    headers={"Authorization": "Bearer token123"}
)

# DELETE запрос
response = requests.delete(
    "https://api.example.com/api/users/123",
    headers={"Authorization": "Bearer token123"}
)

# Upload файл
with open("document.pdf", "rb") as f:
    files = {"file": f}
    response = requests.post(
        "https://api.example.com/api/upload",
        files=files,
        data={"description": "My document"},
        headers={"Authorization": "Bearer token123"}
    )

Python httpx (более современный)

import httpx

async with httpx.AsyncClient() as client:
    response = await client.get(
        "https://api.example.com/api/users/123",
        headers={"Authorization": "Bearer token123"}
    )
    print(response.status_code)
    print(response.json())

Практический пример в тестировании

import pytest
import requests
from requests_mock import Mocker

def test_create_user():
    # Подготовка
    url = "https://api.example.com/api/users"
    payload = {
        "name": "Test User",
        "email": "test@example.com"
    }
    headers = {
        "Content-Type": "application/json",
        "Authorization": "Bearer test-token"
    }
    
    # Запрос
    response = requests.post(url, json=payload, headers=headers)
    
    # Проверка
    assert response.status_code == 201
    data = response.json()
    assert data["name"] == "Test User"
    assert data["id"] is not None

def test_with_mock(requests_mock):
    # Mock API ответ
    requests_mock.post(
        "https://api.example.com/api/users",
        json={"id": 1, "name": "Test User"},
        status_code=201
    )
    
    response = requests.post(
        "https://api.example.com/api/users",
        json={"name": "Test User", "email": "test@example.com"}
    )
    
    assert response.status_code == 201

Заключение

HTTP запрос состоит из:

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

В тестировании нужно понимать эту структуру, чтобы:

  • Формировать корректные API запросы
  • Проверять и валидировать ответы
  • Мокировать API в тестах
  • Отлаживать сетевые проблемы
Из чего состоит http запрос | PrepBro