Laravel 5.4 – API ‘throttle:60,1’ überschreiben

Lesezeit: 3 Minuten

Benutzer-Avatar
vlauciani

Ich schreibe eine Menge API, um Daten abzurufen und zu speichern.
Ich mag die Standardeinstellung throttle Möglichkeit:

protected $middlewareGroups = [
    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

die Anfrage auf 60 pro Minute zu begrenzen; aber für einige Strecken (zB: POST), möchte ich diesen Wert erhöhen.

Ich habe versucht einzustellen 'throttle:500,1' auf Route Middleware wie unten:

Route::group(function () {
        Route::get('semaphore/1',        ['uses' => 'App\Api\V1\DBs\SemaphoreController@index']);
        Route::post('semaphore/1',       ['uses' => 'App\Api\V1\DBs\SemaphoreController@store',        'middleware' => 'WriteToDatabaseMiddleware', 'throttle:500,1']);
});

aber es funktioniert nicht.

Irgendeine Idee?

Vielen Dank.

AKTUALISIEREN:

Mir ist aufgefallen, dass die 'throttle:500,1' verwendet in der api.php Die Route wird NACH der Standardeinstellung festgelegt 'throttle:60,1' angegeben in Kernel.php Datei; dann, Es funktioniert nicht.

Protokollierung der Prozessausführung, der erste Aufruf lautet:

Illuminate\Routing\Middleware\ThrottleRequests -> handle

aus Kernel.php hat maxAttempts=60.

Der zweite Aufruf lautet dann:

Illuminate\Routing\Middleware\ThrottleRequests -> handle

aus api.php hat maxAttempts=500.

Mit anderen Worten, die throttle:500,1 in dem api.php Datei nicht überschreiben throttle:60,1 in dem Kernel.php Datei.

Benutzer-Avatar
ManniL

Aktuelle Antwort

Entsprechend dieses GitHub-Problemdie Throttle-Middleware sollte nicht “zweimal” verwendet werden (wie Sie das tun möchten). Es gibt nur zwei Möglichkeiten, Ihr aktuelles Problem „richtig“ zu lösen:

  1. Schreiben ein eigenes Drosselung von Middleware

oder

  1. Definieren Sie die Throttle-Middleware separat für jede Strecke (Gruppe)

Alte Antwort

Sie haben den Middleware-Schlüssel falsch eingestellt! Wenn Sie mehrere Middleware zur Verwendung deklarieren, erstellen Sie ein neues Array für sie

['middleware' => ['WriteToDatabaseMiddleware','throttle:500,1']]

BEARBEITEN: Aufgrund der Middleware-Reihenfolge sollten Sie Ihre Kernel-Drosselung auf setzen Höchster Wert Sie verwenden möchten, und alle anderen Routen, die eine haben sollten unteren Drosselwert zu den entsprechenden.

  • Gerne @vlauciani Es wäre toll, wenn du die Antwort akzeptieren würdest, weil sie dein Problem gelöst hat 🙂

    – ManniL

    27. Mai 2017 um 7:56 Uhr


  • Ich teste meinen Code, aber es funktioniert nicht; Ich habe meine Frage mit der Untersuchung aktualisiert.

    – vlauciani

    31. Mai 2017 um 12:40 Uhr

  • @vlauciani Nun, dann sollten Sie Ihre Kernel-Werte auf ändern throttle:500,1 (auf die höhere) und alle anderen Routen, die Gas geben sollten throttle:60,1. Dies sollte mit der Anforderungsreihenfolge funktionieren.

    – ManniL

    31. Mai 2017 um 12:49 Uhr

  • Ja, Ihre Lösung ist meine Idee … das Problem ist, dass bei diesem Ansatz alle Routen festgelegt werden 500; das muss ich mir merken zu setzen 60 jede neue Strecke. Ich bevorzuge einen Standardwert (z. B.: 60) und überschreiben 500 nur bestimmte Route.

    – vlauciani

    31. Mai 2017 um 12:54 Uhr


  • Danke @manniL, ich habe dich gelesen“Aktuelle Antwort” jetzt. Ok, es verdeutlicht die Operation; ich denke, die Lösung besteht darin, meine eigene Drosselungs-Middleware zu erstellen. Nochmals vielen Dank.

    – vlauciani

    2. Juni 2017 um 17:26 Uhr

Benutzer-Avatar
Ali Yousefi

In Laravel 6 können Sie Präfix verwenden, um mit globaler Drosselung zu verhindern. verwenden 'throttle:5,1,prefix'

Route::group(['prefix' => 'contact-us', 'middleware' => 'throttle:5,1,contact-form',], function () {
    Route::post("https://stackoverflow.com/", 'ContactUsController@store');
});

Erlauben Sie mehrere Drosseln durch Benennung

  • Laravel 5.9? Meinst du Laravel 6. Nach 5.8 ging Laravel ab Version 6.0.0 zur semantischen Versionierung.

    – Andreas Bibby

    5. Februar 2020 um 11:02 Uhr

  • Hallo Andrew, Version 5.9 ist falsch und behebe meine Antwort. Wenn Sie das Präfix in der Throttle-Middleware verwenden möchten, kann Ihnen diese Pull-Anfrage helfen Erlauben Sie mehrere Drosseln durch Benennung.

    – Ali Yousefi

    7. Februar 2020 um 14:51 Uhr

Benutzer-Avatar
Chuck Le Butt

Keine der aktuellen Antworten erklärt das Verhalten von Laravel 5.x. In dieser Version verwendet jede Instanz von “throttle” denselben Bucket. Wenn Sie also einen Gasbefehl an zwei verschiedenen Stellen platzieren, wirkt sich dies auf jede Instanz aus.

In Betracht ziehen:

// User can email 5 times an hour
Route::post('/email', 'Ctrl@email')->middleware('throttle:5,60');
// User can search 100 times an hour
Route::get('/search', 'Ctrl@search')->middleware('throttle:100,60);

Wenn ein Benutzer innerhalb von 5 Minuten fünfmal sucht, kann er in der nächsten Stunde keine E-Mail senden.

In Laravel 5.x führt kein Weg daran vorbei. Ab Laravel 6 Sie haben die Möglichkeit hinzugefügt, Drosseln zu benennenihnen getrennte Eimer gebend.

1054690cookie-checkLaravel 5.4 – API ‘throttle:60,1’ überschreiben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy