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

Для чего нужен заголовок (header) в http запросе?

1.0 Junior🔥 171 комментариев
#REST API и HTTP

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

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

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

HTTP Заголовки (Headers)

Заголовки (headers) в HTTP запросах — это метаинформация о запросе, которая помогает серверу правильно обработать данные и ответить клиенту.

Основные функции заголовков

1. Идентификация клиента и формата данных

import requests

# Заголовок Content-Type указывает формат отправляемых данных
headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
}

response = requests.post(
    'https://api.example.com/users',
    json={'name': 'Alice'},
    headers=headers
)

2. Аутентификация и авторизация

# Отправка токена для проверки доступа
headers = {
    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIs...',
}

response = requests.get(
    'https://api.example.com/profile',
    headers=headers
)

# Или с API ключом
headers = {
    'X-API-Key': 'your-secret-api-key',
}

3. Кэширование

# Server говорит клиенту как долго кэшировать ответ
headers_from_server = {
    'Cache-Control': 'max-age=3600',  # Кэшировать 1 час
    'ETag': '"33a64df551425fcc55e4d42a148795d9f25f89d4"'  # Версия ресурса
}

# Клиент проверяет, изменился ли ресурс
headers_to_server = {
    'If-None-Match': '"33a64df551425fcc55e4d42a148795d9f25f89d4"'
}

Основные заголовки запроса

Host — доменное имя сервера

headers = {'Host': 'api.example.com'}
# Необходим для виртуальных хостов на одном IP

User-Agent — информация о клиенте

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
# Помогает серверу оптимизировать ответ под клиента

Content-Type — тип отправляемых данных

headers = {
    'Content-Type': 'application/json',  # JSON
    # 'Content-Type': 'application/x-www-form-urlencoded',  # Форма
    # 'Content-Type': 'multipart/form-data',  # Файлы
}

Accept — какой формат ответа ожидает клиент

headers = {
    'Accept': 'application/json, text/plain, */*',
}

Authorization — данные для аутентификации

headers = {
    'Authorization': 'Bearer token123',  # OAuth
    # 'Authorization': 'Basic dXNlcjpwYXNzd29yZA==',  # Basic Auth
}

Custom Headers — пользовательские заголовки

headers = {
    'X-Request-ID': 'abc-123-def',  # Отслеживание запроса
    'X-API-Version': 'v2',  # Версия API
    'X-Client-Name': 'mobile-app',  # Идентификация клиента
}

Основные заголовки ответа

response = requests.get('https://api.example.com/users')

# Тип контента
print(response.headers['Content-Type'])  # 'application/json'

# Размер ответа
print(response.headers['Content-Length'])  # '1234'

# Статус кэширования
print(response.headers['Cache-Control'])  # 'max-age=3600'

# Версия ресурса
print(response.headers['ETag'])  # '"33a64df551425fcc55e4d42a148795d9f25f89d4"'

# Информация о сервере
print(response.headers['Server'])  # 'nginx/1.19.0'

# Тип кодирования
print(response.headers['Content-Encoding'])  # 'gzip'

# CORS (кроссориджинные запросы)
print(response.headers['Access-Control-Allow-Origin'])  # '*' или домен

Практические примеры

Пример 1: API с аутентификацией

import requests
from datetime import datetime

class APIClient:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = 'https://api.example.com'
    
    def _get_headers(self) -> dict:
        """Формирование заголовков для каждого запроса"""
        return {
            'Authorization': f'Bearer {self.api_key}',
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'X-Request-Date': datetime.now().isoformat(),
        }
    
    def get_user(self, user_id: int) -> dict:
        response = requests.get(
            f'{self.base_url}/users/{user_id}',
            headers=self._get_headers()
        )
        response.raise_for_status()
        return response.json()

client = APIClient('your-api-key')
user = client.get_user(123)

Пример 2: Обработка кэширования

import requests
from datetime import datetime, timedelta

class CachedAPIClient:
    def __init__(self):
        self.cache = {}
        self.cache_times = {}
    
    def get_with_cache(self, url: str, cache_minutes: int = 60) -> dict:
        # Проверяем кэш
        if url in self.cache:
            cache_time = self.cache_times[url]
            if datetime.now() - cache_time < timedelta(minutes=cache_minutes):
                print(f'Возвращаем из кэша: {url}')
                return self.cache[url]
        
        # Запрашиваем с заголовками для условной загрузки
        headers = {}
        if url in self.cache:
            headers['If-None-Match'] = self.etags.get(url)
        
        response = requests.get(url, headers=headers)
        
        if response.status_code == 304:  # Not Modified
            print('Ресурс не изменился')
            return self.cache[url]
        
        # Сохраняем в кэш
        self.cache[url] = response.json()
        self.cache_times[url] = datetime.now()
        self.etags = response.headers.get('ETag')
        
        return self.cache[url]

client = CachedAPIClient()
data = client.get_with_cache('https://api.example.com/users')

Пример 3: Загрузка файлов с правильными заголовками

import requests
import mimetypes

def upload_file(filepath: str, url: str):
    with open(filepath, 'rb') as f:
        # Определяем MIME тип
        mime_type, _ = mimetypes.guess_type(filepath)
        
        files = {
            'file': (filepath, f, mime_type or 'application/octet-stream')
        }
        
        headers = {
            'X-Upload-Token': 'token123',
        }
        
        response = requests.post(url, files=files, headers=headers)
        return response.json()

upload_file('document.pdf', 'https://api.example.com/upload')

Пример 4: FastAPI сервер, работающий с заголовками

from fastapi import FastAPI, Header, Response
from typing import Optional

app = FastAPI()

@app.get('/users/{user_id}')
async def get_user(
    user_id: int,
    x_request_id: Optional[str] = Header(None),
    authorization: Optional[str] = Header(None),
    response: Response = Response
):
    # Проверка авторизации
    if not authorization:
        return {'error': 'No authorization header'}, 401
    
    # Логирование запроса
    print(f'Request ID: {x_request_id}')
    
    user = {'id': user_id, 'name': 'Alice'}
    
    # Добавляем заголовки в ответ
    response.headers['X-Response-Time'] = '0.123'
    response.headers['Cache-Control'] = 'max-age=3600'
    response.headers['ETag'] = '"abc123"'
    
    return user

Безопасность с заголовками

# HTTPS Strict Transport Security
headers = {
    'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'
}

# X-Frame-Options — защита от Clickjacking
headers = {
    'X-Frame-Options': 'DENY'
}

# X-Content-Type-Options — защита от MIME sniffing
headers = {
    'X-Content-Type-Options': 'nosniff'
}

# Content-Security-Policy — защита от XSS
headers = {
    'Content-Security-Policy': "default-src 'self'"
}

Вывод

Заголовки — это критическая часть HTTP, которая:

  • Обеспечивает безопасность (Authorization, HTTPS)
  • Улучшает производительность (кэширование, компрессия)
  • Оптимизирует обработку (Content-Type)
  • Отслеживает запросы (X-Request-ID)

Каждый HTTP запрос должен содержать необходимые заголовки для корректной работы API.

Для чего нужен заголовок (header) в http запросе? | PrepBro