РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
530 of 1361 menu

Исключение TooManyRequestsHttpException

Исключение TooManyRequestsHttpException относится к семейству HTTP-исключений Symfony и соответствует статус-коду 429. Оно выбрасывается, когда клиент отправил слишком много запросов за определённый промежуток времени. Первым параметром передаётся количество секунд, через которое клиент может повторить запрос, вторым - сообщение об ошибке, третьим - предыдущее исключение, четвёртым - дополнительные HTTP-заголовки.

Данное исключение удобно использовать при реализации rate limiting - ограничения частоты обращений к API или отдельным страницам сайта. Symfony автоматически преобразует его в HTTP-ответ с кодом 429 и заголовком Retry-After.

Синтаксис

new TooManyRequestsHttpException( ?int $retryAfter = null, string $message = '', ?Throwable $previous = null, int $code = 0, array $headers = [] )

Пример

Давайте выбросим исключение в контроллере, когда лимит запросов исчерпан:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; class ApiController extends AbstractController { #[Route('/api/data', name: 'api_data')] public function data(): Response { $requests = 100; if ($requests > 10) { throw new TooManyRequestsHttpException( 60, 'Too many requests, please try again later.' ); } return new Response('hello'); } } ?>

Результат выполнения кода при превышении лимита:

"Too many requests, please try again later."

Пример

Давайте перехватим исключение и вернём пользователю корректный ответ с заголовком Retry-After:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; class ApiController extends AbstractController { #[Route('/api/limited', name: 'api_limited')] public function limited(): Response { try { throw new TooManyRequestsHttpException(30, 'Rate limit exceeded.'); } catch (TooManyRequestsHttpException $e) { $headers = $e->getHeaders(); return new Response( $e->getMessage(), $e->getStatusCode(), $headers ); } } } ?>

Результат выполнения кода:

"Rate limit exceeded."

Смотрите также

  • исключение HttpException,
    которое является базовым классом для HTTP-исключений
  • исключение ServiceUnavailableHttpException,
    которое сигнализирует о недоступности сервиса
  • метод getStatusCode,
    который возвращает код HTTP-ответа
  • метод getMessage,
    который возвращает сообщение исключения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить