Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
HTTP запрос
HTTP (HyperText Transfer Protocol) — это протокол прикладного уровня для передачи данных в Интернете. HTTP запрос — это сообщение, отправляемое клиентом на сервер с просьбой выполнить определенное действие.
Структура HTTP запроса
Каждый HTTP запрос состоит из трех частей:
1. Стартовая строка (Request Line)
METHOD /path/to/resource HTTP/1.1
- METHOD — метод запроса (GET, POST, PUT, DELETE, PATCH и т.д.)
- /path/to/resource — URI ресурса
- HTTP/1.1 — версия протокола
Пример:
GET /api/v1/users/123 HTTP/1.1
2. Заголовки (Headers)
Дополнительная информация о запросе:
Host: api.example.com
Content-Type: application/json
Authorization: Bearer token123
User-Agent: Mozilla/5.0
Accept: application/json
Content-Length: 256
Основные заголовки:
- Host — адрес хоста
- Content-Type — тип содержимого (для POST/PUT)
- Authorization — аутентификация
- Content-Length — размер тела запроса
- User-Agent — информация о клиенте
- Accept — ожидаемый тип ответа
- Cache-Control — кеширование
3. Тело (Body)
Данные, отправляемые на сервер (не всегда присутствует):
{
"name": "John Doe",
"email": "john@example.com",
"age": 30
}
Методы HTTP
GET — получить ресурс (безопасный, идемпотентный):
import requests
response = requests.get('https://api.example.com/users/123')
print(response.json()) # {'id': 123, 'name': 'John'}
POST — создать новый ресурс:
data = {
'name': 'Jane',
'email': 'jane@example.com'
}
response = requests.post(
'https://api.example.com/users',
json=data
)
print(response.status_code) # 201 (Created)
PUT — обновить весь ресурс:
data = {
'name': 'Jane Smith',
'email': 'jane.smith@example.com',
'age': 28
}
response = requests.put(
'https://api.example.com/users/123',
json=data
)
print(response.status_code) # 200 (OK)
PATCH — частичное обновление ресурса:
data = {'name': 'Jane Smith'} # Только это изменяем
response = requests.patch(
'https://api.example.com/users/123',
json=data
)
DELETE — удалить ресурс:
response = requests.delete('https://api.example.com/users/123')
print(response.status_code) # 204 (No Content)
HEAD — как GET, но без тела ответа (для проверки доступности):
response = requests.head('https://api.example.com/users')
print(response.status_code) # 200
print(len(response.content)) # 0 (нет тела)
OPTIONS — запросить информацию о методах, поддерживаемых ресурсом:
response = requests.options('https://api.example.com/users')
print(response.headers['Allow']) # GET, POST, OPTIONS
Статус коды ответа
response = requests.get('https://api.example.com/users/999')
# 2xx — успех
if response.status_code == 200: # OK
print("Успешно получили данные")
elif response.status_code == 201: # Created
print("Ресурс создан")
elif response.status_code == 204: # No Content
print("Успешно удалено")
# 3xx — перенаправление
elif response.status_code == 301: # Moved Permanently
print(f"Ресурс переместился на {response.headers['Location']}")
elif response.status_code == 304: # Not Modified
print("Кешированный ответ актуален")
# 4xx — ошибка клиента
elif response.status_code == 400: # Bad Request
print("Неверно сформирован запрос")
elif response.status_code == 401: # Unauthorized
print("Требуется аутентификация")
elif response.status_code == 403: # Forbidden
print("Доступ запрещен")
elif response.status_code == 404: # Not Found
print("Ресурс не найден")
elif response.status_code == 429: # Too Many Requests
print("Слишком много запросов (rate limit)")
# 5xx — ошибка сервера
elif response.status_code == 500: # Internal Server Error
print("Ошибка сервера")
elif response.status_code == 503: # Service Unavailable
print("Сервис недоступен")
Пример полного HTTP запроса
import requests
from typing import Optional
class APIClient:
def __init__(self, base_url: str, api_key: Optional[str] = None):
self.base_url = base_url
self.api_key = api_key
self.session = requests.Session()
def _get_headers(self) -> dict:
"""Подготовить заголовки с аутентификацией."""
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'User-Agent': 'MyApp/1.0'
}
if self.api_key:
headers['Authorization'] = f'Bearer {self.api_key}'
return headers
def get(self, endpoint: str, params: Optional[dict] = None) -> dict:
"""GET запрос."""
url = f"{self.base_url}{endpoint}"
response = self.session.get(
url,
params=params,
headers=self._get_headers(),
timeout=10
)
response.raise_for_status() # Выбросить ошибку при 4xx/5xx
return response.json()
def post(self, endpoint: str, data: dict) -> dict:
"""POST запрос."""
url = f"{self.base_url}{endpoint}"
response = self.session.post(
url,
json=data,
headers=self._get_headers(),
timeout=10
)
response.raise_for_status()
return response.json()
def put(self, endpoint: str, data: dict) -> dict:
"""PUT запрос."""
url = f"{self.base_url}{endpoint}"
response = self.session.put(
url,
json=data,
headers=self._get_headers(),
timeout=10
)
response.raise_for_status()
return response.json()
def delete(self, endpoint: str) -> Optional[dict]:
"""DELETE запрос."""
url = f"{self.base_url}{endpoint}"
response = self.session.delete(
url,
headers=self._get_headers(),
timeout=10
)
response.raise_for_status()
if response.content:
return response.json()
return None
# Использование
client = APIClient('https://api.example.com', api_key='secret123')
# GET запрос
users = client.get('/users', params={'page': 1, 'limit': 10})
# POST запрос
new_user = client.post('/users', data={
'name': 'John',
'email': 'john@example.com'
})
# PUT запрос
updated_user = client.put('/users/123', data={
'name': 'John Doe',
'age': 30
})
# DELETE запрос
client.delete('/users/123')
Lучшие практики
- Используйте сессии для переиспользования подключений:
session = requests.Session()
for i in range(100):
response = session.get(f'https://api.example.com/users/{i}')
- Устанавливайте timeout:
response = requests.get(url, timeout=5) # 5 секунд
- Обрабатывайте ошибки:
try:
response = requests.get(url)
response.raise_for_status()
except requests.exceptions.HTTPError as e:
print(f"HTTP ошибка: {e}")
except requests.exceptions.Timeout:
print("Превышено время ответа")
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
- Используйте правильные методы:
- GET для чтения
- POST для создания
- PUT для полного обновления
- PATCH для частичного обновления
- DELETE для удаления
Вывод: HTTP запрос — это фундаментальный механизм веб-коммуникации. Понимание его структуры и правильное использование методов критично для разработки надежных веб-приложений на Python.