Исключение 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,
который возвращает сообщение исключения