Zaratan@next

EN

Les APIs en rails (ou pas)

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.

  1. JSON everywhere
  2. JSONAPI: http://jsonapi.org/
  3. 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