Le Vide Tête

Tout ce qu'est trop long pour tenir dans un tweet

Swift côté serveur – Partie 2: App basique en utilisant Vapor et PostgreSQL

Dans cette 2ème partie, je vais créer un projet basique (types de données de base, Int, String – on aurait pu inclure Double) qui sauvegarde et récupère des données depuis la base.

Dans la 1ère Partie j’ai détaillé l’installation des outils nécessaires à la création d’une application serveur à l’aide de Swift avec le framework Vapor et la base de données PostgreSQL.

Dans la 3ème Partie je vais montrer comment gérer un type Date.


Création d’un nouveau projet

Executer dans un terminal:

Aller dans le répertoire créé:

Si l’on est sur Mac eton veut utiliser Xcode pour coder (pourquoi pas?) il faut générer un projet Xcode à l’aide de:

et l’ouvrir (en répondant y quand il le demande).

Sinon, on peut utiliser notre éditeur préféré (personnellement j’aime beaucoup Visual Studio Code).

Builder l’application

A l’aide de:

et lance l’application avec:

On devrait avoir en retour:

Dans Xcode il n’y a qu’à s’assurer d’avoir bien choisi le schéma App:

et exécuter.

Le serveur démarre sur le port 8080 (il faut s’assurer que rien d’autre utilise ce port, sinon on peut le changer dans Config/servers.json)

Y a plus qu’à ouvrir un navigateur et aller à l’URL: http://localhost:8080
Le message « It works. » devrait s’afficher dans la page.

Maintenant, regardons Sources/App/main.swift qui est le point d’entrée de l’application:

L’instance de Droplet, drop, est celle qui exécute le serveur et enregistre les routes.

Ajoutons une nouvelle route accessible par une requête GET qui retourne quelques utilisateurs sous forme de JSON.

Pour arrêter l’application en cours d’exécution il faut faire un Ctrl-C (si l’application est lancée depuis une fenêtre terminal, depuis Xcode il n’y a qu’a appuyer sur le bouton arrêt).

On rebuilde et relance l’application:

Dans le navigateur en allant à l’URL: http://localhost:8080/users
on devrait avoir en retour le JSON:

Créer un model

On ajoute un nouveau fichier User.swift dans Sources/App/Models/.
Pour le créer depuis la ligne de commande:

Si l’on utilise Xcode il faut régénérer le fichier du projet pour prendre en compte le nouveau fichier:

Pour cette partie on va garder la date du champ lastconnection comme String.

Pour se conformer au protocole Model on doit ajouter deux propriétés:
id: le type Node? qui est `nil tant que le modèle n’est pas enregistré dans la base de donné (ou récupéré de la base).
exists: qui informe si l’instance a été récupérée de la base de donnée ou pas.
et quelques fonctions:
– pour initialiser un objet à partir d’un Node (init(node..),
– pour représenter l’objet comme un Node (makeNode),
– pour préparer la base de donnée en créant la table dans laquelle l’objet sera enregistré (prepare),
– et pour supprimer la table de l’objet (créée par le prepare) (revert).

On modifie la route dans main.swift pour utiliser le modèle User:

Rebuilder, executer et recharger: http://localhost:8080/users
on devrait avoir en retour:

Ajouter PostgreSQL

Récupèrer le Provider Postgresql

Ajouter la dépendance à postgresql-provider comme dépendance dans Package.swift

Builder le projet:

pour récupérer toutes les nouvelles dépendances et les compiler. Si tu tombes sur une erreur du genre:

il faut s’assurer d’avoir bien suivi les instructions de la Partie 1 concernant l’installation de PostgreSQL ou au moins de libpq-dev. C’est nécessaires afin de pouvoir builder le driver Posgres.

Si l’on utilise Xcode, on doit régénérer le fichier du projet pour inclure ces dépendances:

et l’ouvrir.

Utiliser Postgres dans l’application

Dans main.swift on prépare la base de donnée pour utilisation:

On commence par importer VaporPostgreSQL et configurer la création du Droplet (lui donner les préparations à exécuter et le fournisseur de la base de donnée utilisé).

Configuration de la connexion à Postgres

Pour plus de détails lire README.md du projet du provider, mais la version courte est: juste ajouter un nouveau fichier Config/secrets/postgresql.json (le répertoire Config devrait déjà exister, mais secrets doit être créé).
Dans le fichier de config ajouter la configuration correspondant à la base de donnée à utiliser.
Ex:

Création de quelques utilisateurs dans la base de données

Ajouter une nouvelle route dans main.swift qui permet de créer quelques utilisateurs dans la base de données:

Rebuilder, lancer et naviguer vers l’URL: http://localhost:8080/createusers
En retour on devrait avoir la liste des utilisateurs enregistrés (ils ont un id non null maintenant):

Modifier aussi la route users de main.swift pour récupérer tous les utilisateurs de la base:

Tant qu’on y est on va créer la route pour récupérer un utilisateur par son id:

et la route pour créer un User via une requête POST:

Builder et exécuter et ajoutons un nouvel utilisateur.
Pour cela on va utiliser un outil qui permet d’envoyer des requêtes POST comme RESTed (dispo sur le Mac App Store) ou Postman (multi-platforme):
– mettre comme l’URL: http://localhost:8080/user
– type de requête: POST
– le corps du message:

En retour on devrait avoir le nouvel utilisateur créé (avec son id):

On devrait avoir en retour le même résultat si dans le navigateur on va à l’URL:
http://localhost:8080/user/4
(attention le 4 à la fin doit bien correspondre à l’id retourné par la création, c’est un auto-incrément qui peut varier si on joue trop avec /createusers)


Voilà, on a fini (pour cette partie). On a notre petite application basique REST qui enregistre des utilisateurs dans la base et les récupère.

Passons à la 3ème Partie dans laquelle je vais expliquer comment gérer un type Date pour le champ lastconnection au lieu d’une chaîne de caractères.