Un moteur de recherche de vols moderne et performant propulsé par l'API Amadeus
Recherchez, filtrez et comparez des milliers de vols en temps réel avec une interface utilisateur élégante et responsive.
- Aperçu
- Fonctionnalités
- Architecture
- Technologies Utilisées
- Prérequis
- Installation
- Configuration
- Utilisation
- API Endpoints
- Structure du Projet
- Contribuer
- Licence
FlightSearchEngine est une application web full-stack qui permet aux utilisateurs de rechercher des vols en temps réel via l'API Amadeus. L'application offre une expérience utilisateur fluide avec une interface moderne, des filtres avancés et un système de tri intelligent.
┌─────────────────────────────────────────────────────────────┐
│ 🔍 Formulaire de recherche avec autocomplétion │
│ 📅 Sélection de dates intelligente │
│ 👥 Gestion des passagers (adultes, enfants, bébés) │
│ 🎫 Choix de la classe de voyage │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 📊 Résultats avec filtres dynamiques │
│ 💰 Tri par prix, durée, heure de départ │
│ 🛫 Affichage détaillé des segments de vol │
│ 📱 Design responsive (mobile/tablette/desktop) │
└─────────────────────────────────────────────────────────────┘
- Autocomplétion intelligente des aéroports et villes
- Support des vols aller simple et aller-retour
- Recherche par dates flexibles
- Gestion complète des passagers (adultes, enfants, bébés)
- Sélection de la classe de voyage (Économique, Premium, Affaires, Première)
- Compagnies aériennes - Filtrer par opérateur
- Type de vol - Direct ou avec escales
- Nombre d'escales - Limiter les correspondances
- Heures de départ - Nuit, matin, après-midi, soirée
- Heures d'arrivée - Plages horaires personnalisables
- Plage de prix - Slider interactif min/max
| Option | Description |
|---|---|
price |
Prix croissant |
price_desc |
Prix décroissant |
duration |
Durée croissante |
duration_desc |
Durée décroissante |
departure |
Heure de départ croissante |
departure_desc |
Heure de départ décroissante |
- Design moderne et responsive avec Bootstrap 5
- Thème élégant avec animations fluides
- Pagination intelligente des résultats
- Affichage des logos des compagnies aériennes
- Messages d'erreur clairs et informatifs
- Mise en cache des tokens d'authentification Amadeus
- Mise en cache des résultats de recherche d'aéroports
- Debouncing sur l'autocomplétion (optimisation réseau)
- Chargement asynchrone des résultats
┌─────────────────────────────────────────────────────────────────┐
│ CLIENT (Frontend) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ index.html │ │ app.js │ │ style.css │ │
│ │ (Bootstrap)│ │ (Vanilla) │ │ (Custom) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ HTTP/REST
▼
┌─────────────────────────────────────────────────────────────────┐
│ API (ASP.NET Core 10) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ FlightsController │ │
│ │ • GET /api/flights/search - Recherche de vols │ │
│ │ • GET /api/flights/airports - Recherche d'aéroports │ │
│ │ • GET /api/flights/classes - Classes de voyage │ │
│ │ • GET /api/flights/sort-options - Options de tri │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Services Layer │ │
│ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │
│ │ │ IFlightSearchService│ │ AmadeusFlightService │ │ │
│ │ │ (Interface) │◄─│ (Implementation) │ │ │
│ │ └─────────────────────┘ └─────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Models Layer │ │
│ │ Flight │ FlightSegment │ Airport │ FlightSearchRequest │ │
│ │ FlightSearchResult │ AmadeusResponses (DTOs) │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ HTTPS
▼
┌─────────────────────────────────────────────────────────────────┐
│ AMADEUS API │
│ • OAuth 2.0 Authentication │
│ • Flight Offers Search API (v2) │
│ • Airport & City Search API (v1) │
└─────────────────────────────────────────────────────────────────┘
| Technologie | Version | Description |
|---|---|---|
| .NET | 10.0 | Framework de développement |
| ASP.NET Core | 10.0 | Framework web API |
| Newtonsoft.Json | 13.0.4 | Sérialisation JSON |
| Swashbuckle | 10.1.0 | Documentation Swagger/OpenAPI |
| Memory Cache | Intégré | Mise en cache en mémoire |
| Technologie | Version | Description |
|---|---|---|
| Bootstrap | 5.3.2 | Framework CSS responsive |
| Bootstrap Icons | 1.11.1 | Bibliothèque d'icônes |
| Google Fonts | Nunito Sans | Typographie moderne |
| Vanilla JavaScript | ES6+ | Logique client |
| Service | Description |
|---|---|
| Amadeus for Developers | API de recherche de vols et d'aéroports |
Avant de commencer, assurez-vous d'avoir installé :
- .NET SDK 10.0 ou supérieur
- Un compte Amadeus for Developers (gratuit)
- Git pour cloner le repository
# Vérifier la version de .NET
dotnet --version
# Résultat attendu: 10.0.xgit clone https://github.com/SaadBarhrouj/FlightSearchEngine.git
cd FlightSearchEnginecd src/FlightSearchEngine/FlightSearchEngine
dotnet restoreCréez ou modifiez le fichier appsettings.json :
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Amadeus": {
"ApiKey": "VOTRE_API_KEY",
"ApiSecret": "VOTRE_API_SECRET",
"BaseUrl": "https://test.api.amadeus.com"
}
}
⚠️ Important : N'ajoutez jamais vos clés API dans le contrôle de version. Utilisez des variables d'environnement ou leappsettings.Development.json(ignoré par Git).
dotnet runL'application sera accessible à :
- HTTP :
http://localhost:5000 - HTTPS :
https://localhost:5001 - Swagger UI :
https://localhost:5001/swagger(en développement)
| Variable | Description | Exemple |
|---|---|---|
Amadeus__ApiKey |
Clé API Amadeus | abc123... |
Amadeus__ApiSecret |
Secret API Amadeus | xyz789... |
Amadeus__BaseUrl |
URL de base de l'API | https://test.api.amadeus.com |
| Environnement | URL API Amadeus | Description |
|---|---|---|
| Test | https://test.api.amadeus.com |
Données de test, gratuit |
| Production | https://api.amadeus.com |
Données réelles, payant |
L'application est configurée pour accepter toutes les origines en développement. Pour la production, modifiez Program.cs :
builder.Services.AddCors(options =>
{
options.AddPolicy("Production", policy =>
{
policy.WithOrigins("https://votre-domaine.com")
.AllowAnyMethod()
.AllowAnyHeader();
});
});- Entrez une ville de départ - L'autocomplétion vous suggère des aéroports
- Entrez une ville d'arrivée - Sélectionnez parmi les suggestions
- Choisissez vos dates - Départ et retour (optionnel)
- Sélectionnez les passagers - Adultes, enfants, bébés
- Cliquez sur "Rechercher" - Les résultats s'affichent instantanément
Une fois les résultats affichés, utilisez le panneau de filtres à gauche :
🏢 Compagnies aériennes → Cochez les compagnies souhaitées
✈️ Type de vol → Direct ou avec escales
🗺️ Nombre d'escales → 0, 1, 2, etc.
🌅 Heures de départ → Par période (matin, après-midi...)
🌆 Heures d'arrivée → Par période
💰 Plage de prix → Glissez les curseurs
Utilisez les options de tri en haut des résultats pour organiser les vols par :
- Prix (croissant/décroissant)
- Durée (croissante/décroissante)
- Heure de départ (croissante/décroissante)
GET /api/flights/search| Paramètre | Type | Requis | Description |
|---|---|---|---|
origin |
string | ✅ | Code IATA de départ (ex: CDG) |
destination |
string | ✅ | Code IATA d'arrivée (ex: JFK) |
departureDate |
date | ✅ | Date de départ (YYYY-MM-DD) |
returnDate |
date | ❌ | Date de retour |
adults |
int | ❌ | Nombre d'adultes (défaut: 1) |
children |
int | ❌ | Nombre d'enfants (défaut: 0) |
infants |
int | ❌ | Nombre de bébés (défaut: 0) |
travelClass |
string | ❌ | Classe (ECONOMY, BUSINESS...) |
sortBy |
string | ❌ | Critère de tri |
directOnly |
bool | ❌ | Vols directs uniquement |
maxStops |
int | ❌ | Nombre max d'escales |
Exemple de Requête :
curl "http://localhost:5000/api/flights/search?origin=CDG&destination=JFK&departureDate=2026-03-15&adults=2&travelClass=ECONOMY"Exemple de Réponse :
{
"success": true,
"flights": [
{
"id": "1",
"totalPrice": 450.50,
"currency": "EUR",
"totalDuration": "PT8H30M",
"numberOfStops": 0,
"isDirect": true,
"outboundSegments": [
{
"departureAirportCode": "CDG",
"arrivalAirportCode": "JFK",
"carrierCode": "AF",
"carrierName": "Air France",
"flightNumber": "006"
}
]
}
],
"totalResults": 15,
"searchTimestamp": "2026-01-26T20:30:00Z"
}GET /api/flights/airports?keyword=parisRéponse :
[
{
"iataCode": "CDG",
"name": "Charles de Gaulle Airport",
"cityName": "Paris",
"countryName": "France",
"displayName": "Paris - Charles de Gaulle Airport (CDG)"
},
{
"iataCode": "ORY",
"name": "Orly Airport",
"cityName": "Paris",
"countryName": "France",
"displayName": "Paris - Orly Airport (ORY)"
}
]GET /api/flights/classesRéponse :
[
{ "code": "ECONOMY", "name": "Économique" },
{ "code": "PREMIUM_ECONOMY", "name": "Économique Premium" },
{ "code": "BUSINESS", "name": "Affaires" },
{ "code": "FIRST", "name": "Première" }
]GET /api/flights/sort-optionsRéponse :
[
{ "code": "price", "name": "Prix croissant" },
{ "code": "price_desc", "name": "Prix décroissant" },
{ "code": "duration", "name": "Durée croissante" },
{ "code": "duration_desc", "name": "Durée décroissante" },
{ "code": "departure", "name": "Heure de départ croissante" },
{ "code": "departure_desc", "name": "Heure de départ décroissante" }
]FlightSearchEngine/
├── 📄 README.md # Documentation du projet
├── 📄 .gitignore # Fichiers ignorés par Git
│
└── 📂 src/
└── 📂 FlightSearchEngine/
├── 📄 FlightSearchEngine.slnx # Solution Visual Studio
│
└── 📂 FlightSearchEngine/ # Projet principal
│
├── 📄 Program.cs # Point d'entrée de l'application
├── 📄 FlightSearchEngine.csproj
├── 📄 appsettings.json # Configuration (production)
├── 📄 appsettings.Development.json
│
├── 📂 Controllers/
│ └── 📄 FlightsController.cs # API REST endpoints
│
├── 📂 Services/
│ ├── 📄 IFlightSearchService.cs # Interface du service
│ └── 📄 AmadeusFlightService.cs # Implémentation Amadeus
│
├── 📂 Models/
│ ├── 📄 Flight.cs # Modèle de vol
│ ├── 📄 FlightSegment.cs # Segment de vol
│ ├── 📄 FlightSearchRequest.cs # Requête de recherche
│ ├── 📄 FlightSearchResult.cs # Résultat de recherche
│ ├── 📄 Airport.cs # Modèle d'aéroport
│ └── 📄 AmadeusResponses.cs # DTOs API Amadeus
│
├── 📂 Properties/
│ └── 📄 launchSettings.json
│
└── 📂 wwwroot/ # Fichiers statiques
├── 📄 index.html # Page principale
│
├── 📂 css/
│ ├── 📄 style.css # Styles principaux
│ ├── 📄 filters.css # Styles des filtres
│ └── 📄 sort-styles.css # Styles du tri
│
└── 📂 js/
├── 📄 app.js # Application principale
├── 📄 filters.js # Logique des filtres
└── 📄 sort.js # Logique du tri
dotnet testUtilisez l'interface Swagger disponible en mode développement :
https://localhost:5001/swagger
Ou utilisez des outils comme Postman ou curl pour tester les endpoints.
Les contributions sont les bienvenues ! Voici comment procéder :
- Fork le repository
- Créez une branche pour votre fonctionnalité (
git checkout -b feature/AmazingFeature) - Commitez vos changements (
git commit -m 'Add some AmazingFeature') - Pushez vers la branche (
git push origin feature/AmazingFeature) - Ouvrez une Pull Request
- Suivez les conventions de code C# et JavaScript
- Ajoutez des tests pour les nouvelles fonctionnalités
- Mettez à jour la documentation si nécessaire
- Assurez-vous que le build passe avant de soumettre
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Saad Barhrouj
- GitHub: @SaadBarhrouj
- Amadeus for Developers pour l'API de vols
- Bootstrap pour le framework CSS
- Kiwi.com pour les logos des compagnies aériennes
⭐ Si ce projet vous a été utile, n'hésitez pas à lui donner une étoile !
Made with ❤️ and ☕