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

Какой статус код у редиректа?

1.8 Middle🔥 191 комментариев
#Теория тестирования#Фреймворки тестирования

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Статус коды редиректов в HTTP

В HTTP протоколе статус коды редиректов принадлежат к классу 3xx (Redirects). Эти коды указывают клиенту (например, веб-браузеру или вашему автоматизированному скрипту), что для завершения запроса необходимо выполнить дополнительное действие — обычно перейти по другому URL. Это фундаментальное понятие для тестирования веб-приложений, особенно при проверки корректности работы маршрутизации, обработки форм, механизмов аутентификации и SEO.

Основные статус коды редиректов, которые чаще всего встречаются в практике QA Automation:

Ключевые статус коды 3xx

  1. 301 Moved Permanently
    Это самый распространенный редирект. Он сигнализирует, что запрашиваемый ресурс был **перманентно** перемещен на новый URL, и все будущие запросы должны использовать этот новый адрес. Браузеры и поисковые системы обычно кэшируют этот редирект и в дальнейшем автоматически обращаются к новому URL. Для автоматизации важно проверять, что после получения 301 конечный ресурс доступен и контент корректный.

```python
# Пример проверки 301 редиректа в Python с requests
import requests

response = requests.get('http://example.com/old-page', allow_redirects=False)
print(f"Status Code: {response.status_code}")  # Ожидается 301
print(f"Location Header: {response.headers['Location']}")  # Новый URL
```

2. 302 Found (или 302 Moved Temporarily)

    Исторически этот код означал временное перемещение, но его семантика была неясной. В современной практике он часто используется как **временный редирект**, где метод запроса (GET/POST) может изменяться. При автоматизации POST запросов важно отслеживать, не превращается ли он в GET на новом URL (это может быть проблемой безопасности).

  1. 307 Temporary Redirect
    Это более точная и современная альтернатива 302. Код **307** явно указывает, что редирект временный, и клиент должен повторить исходный запрос (с тем же методом и body) на новый URL, указанный в заголовке `Location`. Это критично для тестирования API, где необходимо сохранение метода запроса.

```java
// Пример проверки редиректа в Java с HttpClient
HttpClient client = HttpClient.newBuilder()
    .followRedirects(HttpClient.Redirect.NORMAL)
    .build();

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://api.example.com/temp-resource"))
    .POST(HttpRequest.BodyPublishers.ofString("data"))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// HttpClient, настроенный на followRedirects, сам обработает 307, повторяя POST
```

4. 308 Permanent Redirect

    Аналогичен 301, но с важнейшим дополнением: как и 307, он требует, чтобы метод запроса и тело оставались неизменными при перенаправлении на новый URL. Это **перманентный редирект с сохранением метода**. Его проверка особенно важна для автоматизации тестов REST API, где POST, PUT или DELETE операции должны безопасно и постоянно редиректиться.

Практическое применение в QA Automation

При написании автоматизированных тестов для веб-сервисов необходимо:

  • Контролировать обработку редиректов: Библиотеки типа requests в Python или HttpClient в Java часто имеют опцию allow_redirects. Для детального тестирования логики редиректа её следует отключать (allow_redirects=False), чтобы самостоятельно проверить статус код и заголовок Location.
  • Проверять конечный результат: После отслеживания редиректа (вручную или автоматически) нужно убедиться, что финальный статус код — 200 OK (или другой ожидаемый код успеха), и что контент на конечной странице соответствует ожиданиям.
  • Тестировать разные методы: Особенно важно тестировать редиректы для POST, PUT, DELETE запросов, используя коды 307 и 308, чтобы гарантировать, что данные не теряются и операции выполняются безопасно.
  • Валидировать заголовок Location: URL в этом заголовке должен быть абсолютным и валидным. Это можно проверить регулярными выражениями или простой проверкой структуры.
# Комплексная проверка редиректа в автотесте
def test_redirect_permanent():
    initial_url = "https://old-site.com/login"
    session = requests.Session()
    # Отключаем авто-редиректы для анализа
    response = session.get(initial_url, allow_redirects=False)

    assert response.status_code == 301, f"Expected 301, got {response.status_code}"
    new_location = response.headers['Location']
    assert new_location.startswith('https://new-site.com/login'), "Redirect location is incorrect"

    # Теперь следуем редиректу и проверяем финальный результат
    final_response = session.get(new_location)
    assert final_response.status_code == 200
    assert "Login Form" in final_response.text

В заключение: Для QA Automation инженера понимание различий между 301, 302, 307 и 308 — это не просто теория. Это необходимость для создания надежных, точных тестов, которые проверяют не только наличие редиректа, но и его тип, корректность и воздействие на состояние приложения и данные пользователя.