Introduction : pourquoi Swift pour les API REST ?
Swift n'est pas seulement un langage pour les applications mobiles. Grâce à des frameworks comme Vapor et Kitura, vous pouvez créer des API REST complètes pour le côté serveur. C'est particulièrement utile si votre application iOS utilise déjà Swift : vous pouvez écrire à la fois le client et le serveur dans le même langage, réduisant ainsi le temps de développement et simplifiant la maintenance du code.
Dans cet article, nous allons créer une API REST simple en Swift à l'aide du framework Vapor – la solution la plus populaire pour le développement serveur en Swift. Nous configurerons le serveur, ajouterons des routes pour les opérations CRUD et le testerons. L'ensemble du processus ne prendra pas plus de 30 minutes.
Prérequis : macOS ou Linux, Swift 5.8+ (ou plus récent) installé, compréhension de base de HTTP et JSON.
Étape 1 : Installation et configuration du projet Vapor
Vapor fournit un outil CLI pratique pour démarrer rapidement. Installez-le via Homebrew :
brew install vaporCréez ensuite un nouveau projet :
vapor new MyAPI --template=apicd MyAPILe flag --template=api crée une structure minimale pour une API REST. Après la création du projet, ouvrez-le dans Xcode (ou tout autre éditeur) :
open Package.swiftLa structure du projet comprend :
Sources/App/— la logique principale (routes, contrôleurs, modèles).Sources/App/routes.swift— l'enregistrement des routes.Sources/App/configure.swift— la configuration de l'application.Package.swift— les dépendances (Vapor est déjà inclus).
Si vous utilisez Xcode, il téléchargera automatiquement les dépendances. Dans le terminal, exécutez vapor build pour compiler.
Étape 2 : Création du modèle de données et de la base
Pour une API REST, nous avons besoin d'un modèle. Créons un modèle simple Task (tâche) avec les champs : id, title, completed. Dans Vapor, les modèles héritent généralement de Model (Fluent ORM).
Créez le fichier Sources/App/Models/Task.swift :
import Fluentimport Vapor
final class Task: Model, Content { static let schema = "tasks"
@ID(key: .id) var id: UUID?
@Field(key: "title") var title: String
@Field(key: "completed") var completed: Bool
init() {}
init(id: UUID? = nil, title: String, completed: Bool = false) { self.id = id self.title = title self.completed = completed }}Créons maintenant une migration pour la table dans la base de données. Créez le fichier Sources/App/Migrations/CreateTask.swift :
import Fluent
struct CreateTask: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { database.schema("tasks") .id() .field("title", .string, .required) .field("completed", .bool, .required) .create() }
func revert(on database: Database) -> EventLoopFuture<Void> { database.schema("tasks").delete() }}Ajoutez la migration dans configure.swift :
app.migrations.add(CreateTask())Par défaut, Vapor utilise SQLite (un fichier dans le dossier du projet). Si vous voulez PostgreSQL ou MySQL, modifiez les paramètres dans configure.swift, mais pour un démarrage rapide, SQLite est parfait.
Étape 3 : Enregistrement des routes de l'API REST
Créons maintenant un contrôleur pour gérer les requêtes. Créez le fichier Sources/App/Controllers/TaskController.swift :
import Vaporimport Fluent
struct TaskController: RouteCollection { func boot(routes: RoutesBuilder) throws { let tasks = routes.grouped("tasks")
tasks.get(use: index) // GET /tasks tasks.post(use: create) // POST /tasks tasks.grou