TooManyRequestsHttpException
Исключение TooManyRequestsHttpException относится к группе HTTP-исключений
и возникает при попытке выполнения запроса, когда превышен лимит
разрешённых обращений к серверу (статус ответа 429 Too Many Requests).
Обычно это происходит из-за настроек защиты от DDoS-атак или ограничений
API-маршрутов. Исключение наследуется от абстрактного класса
HttpException и содержит стандартные методы для работы
с HTTP-ответами.
Синтаксис
<?php
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
// Базовый конструктор
$exception = new TooManyRequestsHttpException(
$retryAfter, // int - время в секундах до следующей попытки
$message, // string - сообщение об ошибке
$previous, // Exception - предыдущее исключение
$code, // int - код ошибки
$headers // array - дополнительные заголовки
);
?>
Пример
Давайте создадим исключение с указанием времени ожидания:
<?php
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
$res = new TooManyRequestsHttpException(60, 'Too many requests, please try again in 60 seconds.');
echo $res->getMessage();
echo $res->getStatusCode();
echo $res->getHeaders()['Retry-After'];
?>
Результат выполнения кода:
"Too many requests, please try again in 60 seconds."
"429"
"60"
Пример
В контроллере можно обработать ситуацию с помощью try-catch:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
class ApiController extends Controller
{
public function index(Request $req)
{
try {
// Имитация лимита запросов
$reqCount = 100;
$maxLimit = 50;
if ($reqCount > $maxLimit) {
throw new TooManyRequestsHttpException(30, 'Rate limit exceeded.');
}
return response()->json(['status' => 'success']);
} catch (TooManyRequestsHttpException $e) {
return response()->json([
'error' => $e->getMessage(),
'retry_after' => $e->getHeaders()['Retry-After'],
], $e->getStatusCode());
}
}
}
?>
Результат выполнения кода при превышении лимита:
{"error":"Rate limit exceeded.","retry_after":"30"}
Пример
Глобальная обработка исключения в классе Handler:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
use Throwable;
class Handler extends ExceptionHandler
{
public function render($req, Throwable $e)
{
if ($e instanceof TooManyRequestsHttpException) {
return response()->view('errors.too-many-requests', [
'retryAfter' => $e->getHeaders()['Retry-After'] ?? 60,
], $e->getStatusCode());
}
return parent::render($req, $e);
}
}
?>
Смотрите также
-
класс
HttpException,
базовый класс для всех HTTP-исключений -
исключение
NotFoundHttpException,
возникающее при обращении к несуществующему ресурсу -
исключение
MethodNotAllowedHttpException,
возникающее при использовании неподдерживаемого HTTP-метода -
класс
Exceptions,
позволяющий настраивать обработку исключений в Laravel