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

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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить