Une nouvelle vidéo pour THP on parlera d'APIs.
Je présenterai ce qu'est une API et pourquoi une API. Quelles sont les librairies utiles et qu'est-ce que je conseille d'utiliser. On finira par une rapide présentation d'un client pour API.
Un peu de théorie
Pourquoi une API ?
Qui seront les clients de vos APIs?
- Vos apps mobile
- Votre front (one-page app ou AJAX)
- Les gens qui vont utiliser votre API
RESTful? Safe? Idempotent?
CORS => https://en.wikipedia.org/wiki/Cross-origin_resource_sharing
Self discovery
Uuid
Documentation => J'en parlerai plus dans une autre vidéo
JSONAPI et autres normes
Il va falloir décider a un moment d'un "format" de réponse.
- JSON everywhere
- JSONAPI: http://jsonapi.org/
- Merci ActiveModelSerializer (cf plus tard)
Rails new (--api)
- C'est important de regarder un jour toutes les options de rails new.
- Ma version pour une API:
rails new --api -d postgresql -S --skip-coffee -J --skip-turbolinks -T name_of_my_repo
- Mettre des uuid pour tout ses modèles: https://lab.io/articles/2017/04/13/uuids-rails-5-1/
Gems \o/
- Remettre des tests ;) (if rspec)
- rack-cors => gère les règles de CORS
- rack-timeout => Puma ne timeout pas automatiqument. Toujours limiter son temps de requête. Si c'est trop long => Background job.
- active_model_serializers => Serialise des resources en JSON (et enventuellement "respecte" la norme JSONAPI)
- kaminari => Pagination made easy (bonus: s'intègre avec active_model_serializers)
- pundit => Gestion des droits
- devise_token_auth => Authentification.
Auth (JWT? DAT? WTF?)
- Globalement ça dépend des besoins.
- JWT: Une norme pour faire de l'authentification https://jwt.io/. Défauts: La plupart des implémentations (en ruby) sont discutables. http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
- Devis Auth Token: Tokens d'authentification qui change a "chaque" requête. Ça a quelques défauts: Redirect un peu étrange. Pas de champs login de devise. Override beaucoup de bouts de Devise donc certains mécanismes marchent pas si bien. Des bugs. Pas d'intégration facile avec. Ça a plein d'avantages: Facile à ajouter (c'est globalement comme Devise). C'est secure (si on omet la config par défaut du redirect). Faire une intégration avec c'est simple. * J'en ai une version custom avec quelques fixes ici: https://github.com/denispasin/devise_token_auth/
Faire une gem pour consume (manger?) une API.
bundle gem gem_name
- Faraday => Une gem pour faire des appels HTTP (en vrai ça peut faire plus que du HTTP) qui se comporte très bien comme gem de base de client (notion de "connection")
- Exemple: https://github.com/denispasin/subox_api
Les tests !
- Classique comme pour rails
- Parser et déparser du JSON
- Assert serializer
- Ajouter des tests depuis une gem consomatrice avec
vcr
ça vous assure que vos tests d'intégration sont plus robustes. - Outil utile: Postman