Créer un Webservice en Swift : bonne ou mauvaise idée ?

Swift 1 mai 2020

En 2015, Apple passé en Open Source le langage Swift et l'idée de développer des webservices en Swift a emmergé chez de nombreux développeurs et entreprises qui aiment ce langage. J'en fais partie.

A partir de 2016, plusieurs projets prennent forme et proposent des bibliothèques pour permettre de créer ses propres webservices : les plus connus sont Perfect, Vapor et Kitura.

Quid de la popularité de Swift pour le serveur ?

C'est une question intéressante et il paraît légitime de s'inquiéter à l'idée d'apprendre une technologie qui est moins répandue que les stars des webservices comme PHP ou Node.js.

Je me pose toujours 2 questions avant de m'investir dans une nouvelle technologie :

  • Est-ce que cette technologie me plaît et va améliorer ma productivité ?
  • Est-ce que cette technologie est suffisamment utilisée pour rester disponible tant que mon projet existera ?

Attardons-nous sur la seconde question : je n'ai pas besoin qu'une technologie soit la plus populaire ou la plus à la mode, seulement qu'elle soit suffisemment populaire pour qu'elle soit maintenue. C'est clairement le cas pour les serveurs en Swift qui sont soutenus par Apple et utilisés par plusieurs grandes entreprises (Amazon, ING, etc.).

Une évolution constante

Chaque année depuis 2016, je teste des solutions de serveurs en Swift pour vérifier si elles sont viables et agréables à utiliser. Et jusqu'à cette année j'arrivais toujours à la même conclusion : le langage est génial et les outils sont mieux que l'année dernière, mais pas encore assez pratiques à mon goût.

Vous m'avez souvent demandé de créer un cours sur les webservices en Swift ; vous savez maintenant pourquoi ce cours n'arrivait jamais sur Purple Giraffe.

Cependant plusieurs choses se sont passées en 2019 qui ont changé la donne :

  • Apple a sorti Swift 5 et Swift-NIO 2 (une bibliothèque officielle pour simplifier la réalisation de webservices en Swift)
  • XCode 11 gère maintenant nativement le Swift Package Manager
  • Vapor a sorti une version 4 qui exploite toutes ces nouveautés pour nous

Avec Vapor 4, j'ai enfin un kit complet et simple à utiliser pour créer rapidement un Webservice en Swift.

Solution complète

La version 4 de Vapor intègre tout le nécessaire pour créer la plupart des webservices :

  • Gestion complète du protocole HTTP/HTTPS (routes, requêtes, réponses, status, etc.)
  • Drivers natifs pour plusieurs types de bases de données (SQLIte, MySQL, Postgres, Redis, etc.)
  • ORM intégré pour ne pas avoir à gérer les bases de données si on le souhaite
  • Gestion simplifiée de l'authentification des utilisateurs et de la cryptographie
  • Tests automatisés
  • Outil en ligne de commande pour générer un projet de départ
  • etc.

En fait, pour créer un Webservice en REST qui échange du JSON avec des sites ou des apps mobiles, tout ce dont vous avez besoin est déjà là.

Et pour ceux qui voudraient aller plus loin avec des webservices plus spéciaux, il existe tout un écosystème de plugins pour Vapor qui peuvent être ajoutés simplement (Stripe, Apple Push Notifications, Google Cloud, etc.).

Simple et rapide à prendre en main

Sur un ordinateur qui possède déjà un compilateur Swift, l'installation de Vapor se fera en quelques secondes.

Un outil en ligne de commande permet de générer un projet qui contient déjà un exemple complet de webservice REST. L'exemple est un gestionnaire de tâches qui peut créer, lire, modifier et supprimer des Todo en JSON.

Si vous n'avez qu'un type de données à manipuler, vous pouvez renommer cette classe Todo, modifier ses attributs et vous avez un webservice déjà fonctionnel à déployer 😁 J'exagère un peu, mais ça n'est pas loin de la réalité.

L'organisation du code est claire, avec une séparation de la configuration du serveur, des fichiers de modèles, des routes et des contrôleurs. Chaque notion est bien rangée et dès qu'on a compris où sont chacun des dossiers, tout va très vite pour ajouter d'autres fonctionnalités.

Améliorations possibles

Vous l'avez compris, j'ai beaucoup apprécié Vapor 4 mais il reste quelques points à améliorer :

  • La documentation de Vapor 4 est encore incomplète (par rapport à celle de Vapor 3) ; mais elle évolue très vite en ce moment 👍
  • La gestion des valeurs futures complexifie le code pour les fonctions avancées

Ce dernier point est plus embêtant mais les développeurs de Vapor ne sont pas en cause ici. Le problème vient du langage Swift, qui en version 5.2, n'a pas encore ajouté la notion de async/await ; pourtant proposée par Chris Lattner depuis 2017.

Choix final : 👍 ou 👎 ?

Le Swift est un langage génial qui s'améliore chaque année pour devenir de plus en plus polyvalent. Je dis toujours qu'il est important de travailler dans de bonnes conditions, avec un langage que l'on apprécie et dans lequel on est à l'aise : c'est le cas pour moi avec le Swift et pour la plupart des développeurs iOS.

J'ai vraiment adoré créer des webservices avec Vapor et je peux enfin, en 2020, abandonner complètement le PHP pour mes futurs serveurs ; c'est un soulagement pour moi.

Si vous êtes un développeur mobile, je vous conseille vraiment de tester cette solution qui devrait vous faire apprécier le développement de webservices.

Apprendre à utiliser Vapor 4

J'ai passé les 3 derniers mois à étudier Vapor 4 sous toutes ses coutures et à créer un cours en français pour guider ceux qui voudraient se lancer.

Je suis parti du principe que vous connaissez déjà le langage Swift (ou la programmation en général), mais que vous n'avez jamais créé de webservice.

J'ai donc expliqué en détail plusieurs concepts généraux (webservices, protocoles HTTPS/HTTPS, ORM, etc.) en plus des différents concepts de Vapor. J'ai même ajouté des vidéos pour vous aider à configurer vos machines de développement et vos serveurs de production.

Si vous voulez tester les webservices en Swift, c'est l'occasion pour vous d'être guidé de A à Z et de gagner beaucoup de temps.

Le cours est disponible sur Purple Giraffe, dites-moi ce que vous en pensez :)

Happy coding.

Maxime

Mots clés