API REST Spring Boot avec authentification JWT et base de données H2 en mémoire.
- Java 21
- Maven (ou utiliser
./mvnwinclus dans le projet)
./mvnw spring-boot:runL'API démarre sur http://localhost:8080
Toutes les réponses suivent ce format uniforme :
{
"success": true | false,
"message": "...",
"data": { ... } | null
}Body :
{
"email": "user@example.com",
"username": "john",
"password": "123456"
}Réponse succès (200) :
{
"success": true,
"message": "Inscription réussie",
"data": {
"token": "eyJhbGci...",
"email": "user@example.com",
"username": "john"
}
}Réponse erreur (400) :
{
"success": false,
"message": "Email déjà utilisé",
"data": null
}Body :
{
"email": "user@example.com",
"password": "123456"
}Réponse succès (200) :
{
"success": true,
"message": "Connexion réussie",
"data": {
"token": "eyJhbGci...",
"email": "user@example.com",
"username": "john"
}
}Pour les routes qui nécessitent une authentification, ajouter le header :
Authorization: Bearer <token>
| Champ | Règle |
|---|---|
email |
Requis, format email valide |
username |
Requis |
password |
Requis, minimum 6 caractères |
Réponse erreur de validation (422) :
{
"success": false,
"message": "password : la taille doit être comprise entre 6 et 2147483647",
"data": null
}Body :
{
"name": "Laptop Pro",
"description": "Laptop 15 pouces",
"price": 1299.99,
"category": "Informatique",
"stock": 10
}Réponse succès (200) :
{
"success": true,
"message": "Produit créé",
"data": {
"id": 1,
"name": "Laptop Pro",
"description": "Laptop 15 pouces",
"price": 1299.99,
"category": "Informatique",
"stock": 10
}
}Route publique — aucun token requis.
Query params (tous optionnels) :
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
search |
string | — | Recherche dans le nom et description |
category |
string | — | Filtre par catégorie (exact) |
minPrice |
number | — | Prix minimum |
maxPrice |
number | — | Prix maximum |
page |
int | 0 |
Numéro de page (commence à 0) |
size |
int | 10 |
Nombre d'éléments par page |
sortBy |
string | name |
Champ de tri (name, price, etc.) |
sortDir |
string | asc |
Direction : asc ou desc |
Exemples :
# Tous les produits
GET http://localhost:8080/api/products
# Recherche par mot-clé (nom ou description)
GET http://localhost:8080/api/products?search=laptop
# Filtre par catégorie
GET http://localhost:8080/api/products?category=Informatique
# Filtre par prix
GET http://localhost:8080/api/products?minPrice=50&maxPrice=500
# Pagination (page 2, 5 éléments par page)
GET http://localhost:8080/api/products?page=1&size=5
# Tri par prix décroissant
GET http://localhost:8080/api/products?sortBy=price&sortDir=desc
# Tout combiné
GET http://localhost:8080/api/products?search=casque&category=Audio&minPrice=20&maxPrice=200&page=0&size=5&sortBy=price&sortDir=asc
Réponse succès (200) :
{
"success": true,
"message": "Produits récupérés",
"data": {
"content": [
{
"id": 1,
"name": "Laptop Pro 15",
"description": "Laptop haute performance 15 pouces",
"price": 1299.99,
"category": "Informatique",
"stock": 10
}
],
"currentPage": 0,
"totalPages": 2,
"totalElements": 10,
"size": 5
}
}Accès à la base en mémoire via navigateur : http://localhost:8080/h2-console
| Champ | Valeur |
|---|---|
| JDBC URL | jdbc:h2:mem:grimtharsdb |
| Username | sa |
| Password | (vide) |