Creare API REST di Qualità
Un'API ben progettata è fondamentale per il successo di qualsiasi applicazione moderna. Ecco le best practices da seguire.
Struttura URL e Naming
<?php
// ✅ CORRETTO - Nomi plurali, risorse nidificate logiche
GET /api/users
GET /api/users/{id}
GET /api/users/{id}/posts
POST /api/users
PUT /api/users/{id}
DELETE /api/users/{id}
// ❌ ERRATO
GET /api/getUser/{id}
GET /api/user_posts/{userId}
POST /api/createNewUser
?>
Versioning
<?php
// Opzione 1: URL versioning
Route::prefix('api/v1')->group(function () {
Route::get('/users', [UserController::class, 'index']);
});
Route::prefix('api/v2')->group(function () {
Route::get('/users', [UserV2Controller::class, 'index']);
});
// Opzione 2: Header versioning
Route::middleware('api.version')->group(function () {
Route::get('/users', [UserController::class, 'index']);
});
// Middleware
class ApiVersionMiddleware
{
public function handle($request, $next)
{
$version = $request->header('Accept-Version', 'v1');
app()->instance('api.version', $version);
return $next($request);
}
}
?>
Autenticazione e Sicurezza
<?php
// Laravel Sanctum per API tokens
Route::post('/login', function (Request $request) {
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required'
]);
if (!Auth::attempt($credentials)) {
return response()->json([
'message' => 'Invalid credentials'
], 401);
}
$user = Auth::user();
$token = $user->createToken('api-token', [
'products:read',
'products:write',
'orders:read'
])->plainTextToken;
return response()->json([
'token' => $token,
'user' => $user
]);
});
// Protezione route con abilities
Route::middleware(['auth:sanctum', 'ability:products:write'])
->post('/products', [ProductController::class, 'store']);
?>
Rate Limiting
<?php
// Rate limiter personalizzato
RateLimiter::for('api', function (Request $request) {
return $request->user()
? Limit::perMinute(100)->by($request->user()->id)
: Limit::perMinute(10)->by($request->ip());
});
// Applicazione
Route::middleware('throttle:api')->group(function () {
// Routes...
});
?>
Un buon rate limiting protegge la tua API da abusi e garantisce equità tra gli utenti!