Introduction : Swift n'est pas seulement pour les applications mobiles
De nombreux développeurs ont l'habitude d'associer Swift exclusivement à iOS et macOS. Cependant, ce langage a depuis longtemps dépassé les limites de l'écosystème Apple. Avec l'apparition de frameworks serveur tels que Vapor et Kitura, Swift est devenu un outil à part entière pour la création de backend. Dans cet article, nous allons écrire en 30 minutes une API REST complète en Swift en utilisant le framework Vapor. Vous apprendrez à configurer un projet, créer des endpoints, connecter une base de données et gérer les erreurs. Prêts ? C'est parti !
Étape 1 : Installation et configuration du projet
Pour commencer, assurez-vous d'avoir Swift 5.5 ou une version plus récente installée. Vous pouvez vérifier la version avec la commande :
swift --version
Ensuite, installez Vapor Toolbox — l'utilitaire de gestion de projets :
brew install vapor
Créons maintenant un nouveau projet :
vapor new MyAPI --template=api
Cette commande créera une structure de dossiers avec un modèle d'API prêt à l'emploi. Accédez au dossier du projet et lancez la compilation :
cd MyAPIvapor build
Si la compilation réussit, démarrez le serveur :
vapor run
Par défaut, le serveur sera accessible à l'adresse http://127.0.0.1:8080. Ouvrez votre navigateur et allez à cette adresse — vous devriez voir un message de bienvenue.
Structure du projet Vapor
- Sources/App — le répertoire principal contenant le code de l'application
- Sources/App/Controllers — les contrôleurs pour traiter les requêtes
- Sources/App/Models — les modèles de données
- Sources/App/routes.swift — le fichier pour enregistrer les routes
- configure.swift — la configuration de l'application et de la base de données
Étape 2 : Création du modèle de données et de la base de données
Pour l'exemple, créons une API simple pour gérer une liste de tâches (Todo). Commençons par le modèle de données. Créez un fichier Todo.swift dans le dossier Sources/App/Models :
import Fluentimport Vapor
final class Todo: Model, Content { static let schema = "todos" @ID(key: .id) var id: UUID? @Field(key: "title") var title: String @Field(key: "is_completed") var isCompleted: Bool init() {} init(id: UUID? = nil, title: String, isCompleted: Bool = false) { self.id = id self.title = title self.isCompleted = isCompleted }}
Créons maintenant une migration pour la table. Dans le fichier Sources/App/Migrations/CreateTodo.swift :
import Fluent
struct CreateTodo: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { database.schema("todos") .id() .field("title", .string, .required) .field("is_completed", .bool, .required) .create() } func revert(on database: Database) -> EventLoopFuture<Void> { database.schema("todos").delete() }}
N'oubliez pas d'enregistrer la migration dans configure.swift :
app.migrations.add(CreateTodo())
Pour simplifier, nous utiliserons SQLite (base de données intégrée). Ajoutez dans configure.swift :
app.databases.use(.sqlite(.file("db.sqlite")), as: .sqlite)
Étape 3 : Création des endpoints de l'API REST
Voici la partie la plus intéressante — l'implémentation des opérations CRUD. Créez un contrôleur TodoController.swift dans le dossier Sources/App/Controllers :
import Vapor
struct TodoController: RouteCollection { func boot(routes: RoutesBuilder) throws { let todos = routes.grouped("api", "todos") todos.get(use: index) todos.post(use: create) todos.group(":todoID") { todo in todo.get(use: show)