【Laravel】接口的访问频率限制器
Laravel 接口的访问频率,你可以在 Laravel 中使用速率限制器(Rate Limiter)。以下是一个详细的步骤,展示如何为这个特定的 API 路由设置速率限制:
1. 配置 RouteServiceProvider
首先,确保在 App\Providers\RouteServiceProvider
中配置速率限制器。你可以为特定的路由定义自定义速率限制器。
示例代码:
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
class RouteServiceProvider extends ServiceProvider
{
protected function configureRateLimiting()
{
RateLimiter::for('manage_home', function (Request $request) {
return Limit::perMinute(10)->by(optional($request->user())->id ?: $request->ip());
});
}
public function map()
{
$this->configureRateLimiting();
$this->mapApiRoutes();
}
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
}
2. 应用速率限制器到路由
在 routes/web.php
或 routes/api.php
中,使用 throttle
中间件来应用速率限制器到你的特定路由。
示例代码:
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ManageController;
Route::middleware(['throttle:manage_home'])->group(function () {
Route::get('/manage/home', [ManageController::class, 'home']);
});
3. 创建控制器
假设你有一个 ManageController
来处理 /manage/home
路由请求。
示例代码:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ManageController extends Controller
{
public function home(Request $request)
{
// 执行你的逻辑
return response()->json([
'message' => 'Home management data',
'data' => [
// 你的数据
]
]);
}
}
4. 测试速率限制
使用 Postman 或 cURL 来测试 /manage/home
路由的速率限制功能。
使用 Postman 测试:
- 打开 Postman。
- 创建一个新的 GET 请求,URL 为
http://your-app-url/manage/home
。 - 多次发送请求,超过每分钟 10 次后,你应该会收到一个 429 状态码的响应。
使用 cURL 测试:
for i in {1..15}; do curl -X GET http://your-app-url/manage/home; done
5. 自定义速率限制响应
你可以自定义当请求被限速时返回的响应。在 App\Exceptions\Handler.php
中,添加对 ThrottleRequestsException
的处理:
示例代码:
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Http\Exceptions\ThrottleRequestsException;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
if ($exception instanceof ThrottleRequestsException) {
return response()->json([
'message' => 'Too many requests, please slow down.',
'retry_after' => $exception->getHeaders()['Retry-After'],
], 429);
}
return parent::render($request, $exception);
}
}
通过这些步骤,你可以在 Laravel 中为接口实现访问频率控制。