# Limit użycia ¶

W celu zapobiegnięcia nadużyciom, powinno się rozważyć wprowadzenie limitu użycia swojego API. Może to być na przykład ograniczenie do maksymalnie 100 zapytań do API dla każdego użytkownika w czasie 10 minut. Jeśli użytkownik przekroczy ten limit w zadanym czasie, należy zwrócić odpowiedź ze statusem 429 (oznaczającym "Zbyt dużo zapytań").

Aby ustalić limit użycia, klasa identyfikująca użytkownika powinna zaimplementować RateLimitInterface. Interfejs ten wymaga dodania trzech metod:

- `getRateLimit()`: zwraca maksymalną liczbę zapytań i okres czasu (np. `[100, 600]` oznacza maksymalnie 100 zapytań do API w czasie 600 sekund).
- `loadAllowance()`: zwraca liczbę pozostałych dozwolonych zapytań z limitu i uniksowy znacznik czasu wskazujący datę ostatniego sprawdzenia limitu.
- `saveAllowance()`: zapisuje liczbę pozostałych dozwolonych zapytań i aktualny uniksowy znacznik czasu.

Do celów obsługi powyższych metod można wykorzystać dwie dodatkowe kolumny w bazie danych użytkowników dla liczby dokonanych połączeń i znacznika czasu. Po ustaleniu tych wartości, metody `loadAllowance()` i `saveAllowance()` mogą być poprawnie zaimplementowane do odczytu i zapisu tych wartości dla aktualnego zautoryzowanego użytkownika. Aby zwiększyć wydajność tego mechanizmu, należy rozważyć użycie pamięci podręcznej lub bazy typu NoSQL.

Po zaimplemetowaniu wymaganego interfejsu, Yii automatycznie użyje RateLimiter, skonfigurowanego jako filtr akcji dla Controller, aby pilnować limitu użycia API. Mechanizm rzuci wyjątek TooManyRequestsHttpException, kiedy limit zostanie przekroczony.

Po dodaniu limitu, każda odpowiedź będzie domyślnie zawierała następujące nagłówki HTTP, zawierające informacje o aktualnym użyciu limitu:

- `X-Rate-Limit-Limit`, maksymalna liczba zapytań w zadanym okresie czasu,
- `X-Rate-Limit-Remaining`, liczba pozostałych dozwolonych zapytań z limitu w aktualnym okresie czasu,
- `X-Rate-Limit-Reset`, liczba sekund, którą należy odczekać, aby uzyskać ponownie maksymalną liczbę zapytań z limitu.

Wysyłanie powyższych nagłówków można wyłączyć konfigurując enableRateLimitHeaders w klasie kontrolera REST jak w poniższym przykładzie.

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
        return $behaviors;
    }