Комментарии (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 или httpsHost: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-Key | Custom заголовок для API ключа | secret-key-12345 |
X-Request-ID | ID для трейсирования | abc-123-def |
Referer | С какой страницы пришел запрос | https://example.com/page |
Cookie | Сохраненные cookies | session=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 запрос состоит из:
- Request Line — метод, URL, версия
- Headers — метаинформация
- Empty Line — разделитель
- Body — данные (опционально)
В тестировании нужно понимать эту структуру, чтобы:
- Формировать корректные API запросы
- Проверять и валидировать ответы
- Мокировать API в тестах
- Отлаживать сетевые проблемы