API plaque immatriculation Laravel : service et contrôleur
Intégrez l’API plaque dans Laravel avec Http, configuration services.php, secrets serveur et contrôleur de consultation.
Publié le
Dans Laravel, placez l’appel à l’API plaque dans un service injecté au contrôleur. La configuration passe par config/services.php, tandis que la clé reste dans l’environnement du serveur.
Configurer les secrets
Ajoutez les variables à votre environnement et l’entrée au tableau existant de config/services.php. Ne remplacez pas son contenu complet. Vérifiez dans RapidAPI la base et le host : le domaine .p.rapidapi.co du catalogue n’a pas été testé. Après une modification de configuration en production, reconstruisez le cache de configuration selon votre procédure Laravel.
Service et contrôleur
# Configuration serveur uniquement. Confirmer URL et hôte dans RapidAPI.
RAPIDAPI_KEY=YOUR_RAPIDAPI_KEY
API_PLAQUE_BASE_URL=https://api-plaque-immatriculation-france-donnees-vehicule-siv.p.rapidapi.co
RAPIDAPI_HOST=api-plaque-immatriculation-france-donnees-vehicule-siv.p.rapidapi.co'api_plaque' => [
'key' => env('RAPIDAPI_KEY'),
'base_url' => env('API_PLAQUE_BASE_URL'),
'host' => env('RAPIDAPI_HOST'),
],<?php
namespace App\Services;
use Illuminate\Support\Facades\Http;
use RuntimeException;
class VehicleLookup
{
public function find(string $plaque): array
{
$settings = config('services.api_plaque');
if (empty($settings['key']) || $settings['key'] === 'YOUR_RAPIDAPI_KEY' || empty($settings['base_url']) || empty($settings['host'])) {
throw new RuntimeException('Configuration RapidAPI manquante');
}
$response = Http::withHeaders([
'x-rapidapi-key' => $settings['key'],
'x-rapidapi-host' => $settings['host'],
'Content-Type' => 'application/json',
])->connectTimeout(5)->timeout(10)->withoutRedirecting()
->get(rtrim($settings['base_url'], '/') . '/fr', ['plaque' => trim($plaque)]);
if (!$response->successful()) throw new RuntimeException('HTTP ' . $response->status());
$body = json_decode($response->body(), true, 512, JSON_THROW_ON_ERROR);
if (!is_array($body) || ($body['error'] ?? null) !== false || !is_array($body['data'] ?? null)) {
throw new RuntimeException('Réponse véhicule inexploitable');
}
return $body['data'];
}
}<?php
namespace App\Http\Controllers;
use App\Services\VehicleLookup;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Throwable;
class VehicleController extends Controller
{
public function __invoke(Request $request, VehicleLookup $lookup): JsonResponse
{
$input = $request->validate(['plaque' => ['required', 'string', 'max:32']]);
// max:32 est une limite de notre formulaire, pas une règle publiée de l'API.
try {
$vehicle = $lookup->find($input['plaque']);
return response()->json(['marque' => $vehicle['AWN_marque'] ?? null]);
} catch (Throwable $error) {
// Ne pas exposer le corps fournisseur, la plaque ou la clé dans les logs publics.
return response()->json(['message' => 'Identification indisponible'], 502);
}
}
}Le service utilise le client HTTP Laravel, limite l’attente et vérifie explicitement le statut : le client HTTP n’impose pas à lui seul l’échec de votre logique sur toutes les réponses hors succès. Le contrôleur ne renvoie ici que la marque ; adaptez cette sélection aux champs autorisés dans votre application.
Brancher votre route
Associez le contrôleur à une route POST de votre application avec authentification, limitation de débit et protection CSRF lorsque vous utilisez une session navigateur. Les exemples ne créent aucune route sur ce site de documentation. Le 502 renvoyé est votre convention applicative pour une dépendance indisponible, pas une garantie sur les codes du fournisseur.
Vérifier avant mise en service
Avec les outils de test du client HTTP Laravel, simulez un succès, une panne réseau, un JSON invalide et un corps dépourvu de données. Vérifiez également que la clé n’apparaît ni dans une réponse ni dans vos journaux. Consultez la documentation API, le format des réponses et les tarifs et quotas.
Référence technique : client HTTP Laravel.