Configurer un serveur REST peut être complexe, surtout pour les développeurs d’applications mobiles.
Sans une bonne configuration, les requêtes HTTP peuvent ne pas être traitées efficacement, entraînant des frustrations.
Ktor offre une solution simple et flexible pour configurer un serveur REST, gérer les requêtes et assurer une communication fluide.
Apprenez à construire des applications Android avec une architecture moderne et performante!
Lors du développement d’une application mobile qui interagit avec un serveur, il est crucial de mettre en place un ensemble de web services qui répondent aux différentes méthodes HTTP. Ktor, un framework léger et flexible, permet de configurer facilement un serveur REST capable de gérer les requêtes GET, POST, PUT, et DELETE. Ce document détaille les étapes nécessaires pour configurer le serveur, définir les routes, et gérer les différentes méthodes HTTP en utilisant Ktor.
Configuration Initiale du Projet Ktor
Création d’un Nouveau Projet
Pour commencer, créez un nouveau projet Ktor. Dans cet exemple, nous utiliserons IntelliJ IDEA avec le plugin Ktor intégré.
Ajout des Dépendances
Modifiez le fichier build.gradle.kts pour ajouter les dépendances nécessaires, y compris le routing et la sérialisation.
dependencies {
implementation("io.ktor:ktor-server-core:$ktor_version")
implementation("io.ktor:ktor-server-netty:$ktor_version")
implementation("io.ktor:ktor-server-routing:$ktor_version")
implementation(
"io.ktor:ktor-serialization-kotlinx-json:$ktor_version")
}
Définition des Routes et des Méthodes HTTP
Création du Modèle de Données
Commencez par définir le modèle de données qui sera utilisé par le serveur. Ici, nous créons une classe Verbe avec des propriétés sérialisables.
import kotlinx.serialization.Serializable @Serializable data class Verbe(val nom:String, val infinitif:String)
Configuration des Routes
Créez une fonction d’extension verbeRouting sur la classe Route pour définir les différentes méthodes HTTP (GET, POST, DELETE).
Fonction d’Extension | Description | Endpoint | Action Réalisée |
---|---|---|---|
(GET) | Définit la méthode HTTP GET pour récupérer des données. | /users | Retourne une liste d’utilisateurs. |
(POST) | Définit la méthode HTTP POST pour envoyer des données au serveur. | /createUser | Crée un nouvel utilisateur. |
(DELETE) | Définit la méthode HTTP DELETE pour supprimer des ressources sur le serveur. | /deleteUser/{id} | Supprime un utilisateur par ID. |
fun Route.verbeRouting() {
val verbeStorage = mutableListOf()
// Route GET all
get("/verbes") {
if (verbeStorage.isNotEmpty()) {
call.respond(verbeStorage)
} else {
call.respondText("Pas de verbes disponibles", status = HttpStatusCode.OK)
}
}
// Route GET avec ID
get("/verbes/{id}") {
val id = call.parameters["id"] ?.toIntOrNull() if (id == null) {
call.respondText("ID manquant ou invalide",
status = HttpStatusCode.BadRequest) return @get
}
val verbe = verbeStorage.getOrNull(id) if (verbe != null) {
call.respond(verbe)
}
else {
call.respondText("Pas de verbe avec cet ID",
status = HttpStatusCode.NotFound)
}
}
// Route POST
post("/verbes") {
val verbe = call.receive() verbeStorage.add(verbe) call.respondText(
"Verbe enregistré", status = HttpStatusCode.Created)
}
// Route DELETE
delete ("/verbes/{id}") {
val id = call.parameters["id"] ?.toIntOrNull() if (id == null) {
call.respondText("ID manquant ou invalide",
status = HttpStatusCode.BadRequest) return @ delete
}
if (verbeStorage.removeAtOrNull(id) != null) {
call.respondText("Verbe supprimé", status = HttpStatusCode.OK)
} else {
call.respondText("Pas de verbe avec cet ID",
status = HttpStatusCode.NotFound)
}
}
}
Voici une explication détaillée de chaque partie du code :
1. Initialisation du Stockage des Verbes
val verbeStorage = mutableListOf()
Explication : verbeStorage est une liste mutable qui sert de stockage temporaire pour les objets Verbe. Cette liste est vide au départ, mais elle peut être modifiée par les différentes routes (ajout, suppression, etc.).
- Route GET pour Obtenir Tous les Verbes
get("/verbes") {
if (verbeStorage.isNotEmpty()) {
call.respond(verbeStorage)
} else {
call.respondText("Pas de verbes disponibles", status = HttpStatusCode.OK)
}
}
Explication : Cette route répond aux requêtes GET envoyées à l’URL /verbes.
Fonctionnement :
- Si verbeStorage contient des éléments, la route répond avec la liste complète des verbes.
- Si la liste est vide, elle répond avec un message textuel « Pas de verbes disponibles » et un statut HTTP 200 (OK).
- Route GET pour Obtenir un Verbe par ID
Explication : Cette route répond aux requêtes GET envoyées à l’URL /verbes/{id}, où {id} est un paramètre représentant l’ID du verbe.
get("/verbes/{id}") {
val id = call.parameters["id"] ?.toIntOrNull() if (id == null) {
call.respondText("ID manquant ou invalide",
status = HttpStatusCode.BadRequest) return @get
}
val verbe = verbeStorage.getOrNull(id) if (verbe != null) {
call.respond(verbe)
}
else {
call.respondText("Pas de verbe avec cet ID",
status = HttpStatusCode.NotFound)
}
}
Fonctionnement :
- Elle extrait l’ID du verbe à partir des paramètres de la requête.
- Si l’ID est nul ou invalide, elle renvoie un message « ID manquant ou invalide » avec un statut HTTP 400 (Bad Request).
- Si l’ID est valide, elle tente de récupérer le verbe correspondant dans verbeStorage.
- Si le verbe est trouvé, elle renvoie l’objet Verbe. Sinon, elle renvoie un message « Pas de verbe avec cet ID » avec un statut HTTP 404 (Not Found).
- Route POST pour Ajouter un Nouveau Verbe
post("/verbes") {
val verbe = call.receive() verbeStorage.add(verbe) call.respondText(
"Verbe enregistré", status = HttpStatusCode.Created)
}
Explication : Cette route répond aux requêtes POST envoyées à l’URL /verbes.
Fonctionnement :
- Elle attend un objet Verbe dans le corps de la requête.
- L’objet reçu est ajouté à la liste verbeStorage.
- La route répond ensuite avec un message « Verbe enregistré » et un statut HTTP 201 (Created), indiquant que le verbe a été correctement ajouté.
5. Route DELETE pour Supprimer un Verbe par ID
delete ("/verbes/{id}") {
val id = call.parameters["id"] ?.toIntOrNull() if (id == null) {
call.respondText("ID manquant ou invalide",
status = HttpStatusCode.BadRequest) return @ delete
}
if (verbeStorage.removeAtOrNull(id) != null) {
call.respondText("Verbe supprimé", status = HttpStatusCode.OK)
} else {
call.respondText("Pas de verbe avec cet ID",
status = HttpStatusCode.NotFound)
}
}
Explication : Cette route répond aux requêtes DELETE envoyées à l’URL /verbes/{id}.
Fonctionnement :
- Elle extrait l’ID du verbe à supprimer à partir des paramètres de la requête.
- Si l’ID est nul ou invalide, elle renvoie un message « ID manquant ou invalide » avec un statut HTTP 400 (Bad Request).
- Elle tente ensuite de supprimer le verbe à l’index correspondant dans verbeStorage.
- Si la suppression est réussie, elle renvoie un message « Verbe supprimé » avec un statut HTTP 200 (OK). Si aucun verbe avec cet ID n’est trouvé, elle renvoie un message « Pas de verbe avec cet ID » avec un statut HTTP 404 (Not Found).
Lancement et Test du Serveur
Configuration du Serveur
Ajoutez la fonction verbeRouting dans le module principal pour qu’elle soit appelée lors du démarrage de l’application.
fun main() {
embeddedServer(Netty, port = 8080, module = Application::module)
.start(wait = true)
}
Lancement du Serveur
Lancez l’application en exécutant le fichier Application.kt.
Tests et Validation des Routes
Testez les différentes routes en envoyant des requêtes HTTP via un client HTTP comme Postman ou Curl.
- GET/verbes :Récupère tous les verbes.
- GET/verbes/{id} :Récupère un verbe par son ID.
- POST/verbes :Crée un nouveau verbe.
- DELETE/verbes/{id} :Supprime un verbe par son ID.
Conclusion
Ce chapitre explique comment configurer un serveur REST avec Ktor, définir les routes pour gérer les différentes méthodes HTTP, et sérialiser les données en JSON pour interagir avec une application mobile Android. Grâce à Ktor, il est possible de créer rapidement des services backend robustes et performants, adaptés à vos besoins spécifiques.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment créer un projet Ktor pour un serveur REST ?
Quelles méthodes HTTP peuvent être gérées avec Ktor ?
Comment définir des routes dans Ktor ?
Comment sérialiser les données en JSON avec Ktor ?
Comment tester un serveur REST Ktor ?
Conclusion
En configurant un serveur REST avec Ktor, vous pouvez créer des services backend robustes pour les applications mobiles. Avez-vous exploré comment intégrer d’autres fonctionnalités avancées de Ktor ?