Для чего нужен заголовок (header) в http запросе?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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.