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

Что такое HTTP запрос?

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

Комментарии (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учшие практики

  1. Используйте сессии для переиспользования подключений:
session = requests.Session()
for i in range(100):
    response = session.get(f'https://api.example.com/users/{i}')
  1. Устанавливайте timeout:
response = requests.get(url, timeout=5)  # 5 секунд
  1. Обрабатывайте ошибки:
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}")
  1. Используйте правильные методы:
    • GET для чтения
    • POST для создания
    • PUT для полного обновления
    • PATCH для частичного обновления
    • DELETE для удаления

Вывод: HTTP запрос — это фундаментальный механизм веб-коммуникации. Понимание его структуры и правильное использование методов критично для разработки надежных веб-приложений на Python.