Comment écrire une API REST en Swift en 30 minutes : guide pratique

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi Swift est-il adapté aux API REST ?

\n\n

Quand 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\n

Dans 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\n

Avant 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\n

Installation de Vapor Toolbox

\n

Ouvrez le terminal et exécutez :

\n
brew install vapor
\n

Si vous n'avez pas Homebrew, installez-le depuis brew.sh.

\n\n

Création d'un nouveau projet

\n

Créons un nouveau projet nommé TodoAPI :

\n
vapor new TodoAPI -n\ncd TodoAPI
\n

Le flag -n signifie « sans exemple » — nous obtenons un modèle vierge.

\n\n

Lancement du serveur

\n

Ouvrez le projet dans Xcode :

\n
open Package.swift
\n

Sé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.

\n\n

Étape 2 : Création du modèle de données

\n\n

Notre 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\n

Cré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.

\n\n

Créez le fichier Sources/App/Models/Todo.swift :

\n
import 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\n

Notez que id est un UUID optionnel. Nous le générerons sur le serveur lors de la création de la tâche.

\n\n

Étape 3 : Création du stockage et du contrôleur

\n\n

Pour 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\n

Stockage (In-Memory Store)

\n

Créez le fichier Sources/App/Controllers/TodoStore.swift :

\n
import 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) ->                

Blogs

Book Recommendations