Introduction : Pourquoi Swift est-il adapté aux API REST ?
\n\nQuand on parle de développement serveur, Swift n'est pas le premier langage qui vient à l'esprit. Cependant, avec l'apparition du framework Vapor (et de son alternative Kitura), Swift est devenu un outil à part entière pour créer des API REST. Pourquoi utiliser Swift sur le serveur ? Premièrement, c'est un langage unifié pour iOS, macOS et le backend — vous pouvez réutiliser les modèles de données. Deuxièmement, Swift est rapide, sécurisé et offre un excellent support de l'asynchronisme avec async/await.
\n\nDans ce guide, nous allons créer une API REST simple pour gérer une liste de tâches (Todo list) en Swift avec le framework Vapor. Vous apprendrez à configurer le serveur, créer des routes, travailler avec JSON et tester l'API. L'ensemble du processus prendra environ 30 minutes.
\n\nÉtape 1 : Installation et configuration du projet
\n\nAvant d'écrire du code, vous devez installer Vapor Toolbox — un utilitaire en ligne de commande pour créer et gérer les projets Vapor.
\n\nInstallation de Vapor Toolbox
\nOuvrez le terminal et exécutez :
\nbrew install vapor\nSi vous n'avez pas Homebrew, installez-le depuis brew.sh.
\n\nCréation d'un nouveau projet
\nCréons un nouveau projet nommé TodoAPI :
vapor new TodoAPI -n\ncd TodoAPI\nLe flag -n signifie « sans exemple » — nous obtenons un modèle vierge.
Lancement du serveur
\nOuvrez le projet dans Xcode :
\nopen Package.swift\nSélectionnez le schéma Run et appuyez sur Cmd+R. Après quelques secondes, le serveur démarrera sur http://127.0.0.1:8080. Ouvrez votre navigateur — vous devriez voir un message de bienvenue de Vapor.
Étape 2 : Création du modèle de données
\n\nNotre API va gérer des tâches. Chaque tâche a un ID, un titre et un statut d'exécution (terminée ou non).
\n\nCréons le modèle Todo. Dans Vapor, les modèles sont des structures classiques qui se conforment aux protocoles Content (pour la sérialisation en JSON) et Codable.
Créez le fichier Sources/App/Models/Todo.swift :
\nimport Vapor\n\nstruct Todo: Content, Codable {\n var id: UUID?\n var title: String\n var isCompleted: Bool\n \n init(id: UUID? = nil, title: String, isCompleted: Bool = false) {\n self.id = id\n self.title = title\n self.isCompleted = isCompleted\n }\n}\n\nNotez que id est un UUID optionnel. Nous le générerons sur le serveur lors de la création de la tâche.
Étape 3 : Création du stockage et du contrôleur
\n\nPour simplifier, nous allons stocker les tâches en mémoire (dans un tableau). Dans un projet réel, vous utiliseriez une base de données (Fluent ORM), mais pour une démo de 30 minutes, c'est superflu.
\n\nStockage (In-Memory Store)
\nCréez le fichier Sources/App/Controllers/TodoStore.swift :
\nimport Vapor\n\nfinal class TodoStore {\n private var todos: [Todo] = []\n private let lock = NSLock()\n \n func getAll() -> [Todo] {\n lock.lock()\n defer { lock.unlock() }\n return todos\n }\n \n func get(id: UUID) -> Todo? {\n lock.lock()\n defer { lock.unlock() }\n return todos.first { $0.id == id }\n }\n \n func create(_ todo: inout Todo) -> Todo {\n lock.lock()\n defer { lock.unlock() }\n todo.id = UUID()\n todos.append(todo)\n return todo\n }\n \n func update(id: UUID, with updatedTodo: Todo) -> Todo? {\n lock.lock()\n defer { lock.unlock() }\n guard let index = todos.firstIndex(where: { $0.id == id }) else { return nil }\n var mutableTodo = updatedTodo\n mutableTodo.id = id\n todos[index] = mutableTodo\n return mutableTodo\n }\n \n func delete(id: UUID) ->