DEV Community đŸ‘©â€đŸ’»đŸ‘šâ€đŸ’»

DEV Community đŸ‘©â€đŸ’»đŸ‘šâ€đŸ’» is a community of 966,904 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Create account Log in
Cover image for Quel framework choisir pour votre application REST en 2020 ?
Renaud Kern for Hawaii Interactive

Posted on

Quel framework choisir pour votre application REST en 2020 ?

Quelle solution choisir pour dĂ©velopper une API REST sur laquelle viendra s’appuyer votre application web ou mobile en 2020 ? Autrement dit, vous voulez construire une architecture logicielle pour crĂ©er des services web, mais vous hĂ©sitez entre plusieurs possibilitĂ©s. Ou vous avez un framework fĂ©tiche et vous voulez le comparer avec des solutions existantes. Ce blog est certainement pour vous.
L’architecture REST n’est pas nouvelle. Elle a Ă©tĂ© popularisĂ©e par un livre de Leonard Richardson et Sam Ruby (rien Ă  voir avec le langage mĂȘme s’il y a contribué ) RESTful Web APIs publiĂ© en 2007 par O’Reilly qui souligne la puissance des technologies web: protocol http, norme URI,... Surtout, elle Ă©tablit une interopĂ©rabilitĂ© entre ordinateurs sur internet: une petite rĂ©volution car les solutions alternatives Ă  l’époque Ă©taient SOAP ou RPC Ă©taient et restent souvent incomprĂ©hensibles pour le dĂ©veloppeur web. DĂ©sormais, nous pouvions façonner le web autrement que pour produire des pages HTML ! Ce fut donc l’ouverture vers de nouveaux outils comme React, Angular ou Vuejs.
Toutefois, il faut garder en tĂȘte que l’architecture REST n’est pas un standard ou une norme, mais plutĂŽt une somme de conventions et de pratiques. Il peut y avoir des diffĂ©rences entre les langages de programmation et frameworks. Nous verrons ici 3 solutions qui sont massivement utilisĂ©es comme serveur REST et qui sont comparables en termes d’utilisation.

Ruby On Rails, la MĂšre des framework web

Les principes architecturaux REST ont été présenté en 2006 (avant la sortie du livre ci-dessous) lors de la Keynote de la Conférence Rails 2006 Discovering a World of Resources on Rails.

Routes

L’architecture REST a donc trĂšs tĂŽt Ă©tĂ© intĂ©grĂ©e dans le framework (dĂšs la version 1.2) et il a Ă©tĂ© trĂšs facile d’intĂ©grer une API dans une application. Pour gĂ©nĂ©rer les routes, une instructions suffit. Par exemple, l’instruction suivante:

resources :photos

créée automatiquement les 7 routes emblématiques :

Verbe HTTP URL Utilisation
GET /photos Affiche la liste de toutes les photos
GET /photos/new Retourne les informations pour créer une nouvelle photo
POST /photos Créée une photo
GET /photos/:id Affiche une photo
GET /photos/:id/edit Retourne les information pour mettre Ă  jour une photo
PATCH/PUT /photos/:id Mets Ă  jour une photo
DELETE /photos/:id Efface une photo

Vues

A partir d’une action (route), il est possible de retourner plusieurs formats avec l’instruction respond_to :

respond_to do |format|
    format.html
    format.json { render json: @photos }
    format.xml { render xml: @photos }
 end
Enter fullscreen mode Exit fullscreen mode

Notez Ă©galement la simplicitĂ© pour gĂ©nĂ©rer du JSON ou XML Ă  partir d’un enregistrement. Mais si vous avez besoin de rendre du contenu JSON plus complexe, il existe des langages de template comme RABL :

collection @photos
cache @photos
attributes :id, :title, :subject
child(:user) { attributes :full_name }
node(:taken_by) { |photo| photo.taken_by?(@user) }
Enter fullscreen mode Exit fullscreen mode

Spécificités

Si vous souhaitez utiliser RoR uniquement pour produire une API sans page HTML, vous pouvez utiliser la commande :

rails new my_application --api

qui va créer une application plus légÚre et rapide sans les ressource nécessaire pour gérer le format HTML.
Mais bien que Ruby on Rails (RoR) fut un des premier framework Ă  embrasser l’architecture REST, les concepteurs fut frileux Ă  utiliser javascript pour langage pour le frontend et a mis en avant d’autres technologies comme les turbolinks qui n’ont pas percĂ©s chez les dĂ©veloppeurs. Sauf peut-ĂȘtre Yehuda Katz (ancien de JQuery Ă©galement) qui quitta la “core team” pour lancer Ember.js, un des premier framework frontend JS.

Conclusion

RoR reste un choix solide pour crĂ©er une dorsale (backend) REST, avec communautĂ© vivante et aidante, une documentation plĂ©thorique, une simplicitĂ© d’utilisation et de nombreuses entreprises qui l’utilisent (Github, Airbnb, Twitter, Shopify, Basecamp,...). Comme beaucoup de ses concepts sont repris dans d’autres langages, vous vous sentirez Ă  l’aise si vous devez un jour changer d’environnements.

Phoenix, fonctionnel Ă  outrance

Phoenix est le framework web composĂ© en Elixir, qui est un langage dynamique et fonctionnel qui compile votre code en Erlang. Si vous cherchez une solution Ă©volutive et robuste, voilĂ  ce qu’il vous faut. Erlang a Ă©tĂ© spĂ©cialement conçu pour ĂȘtre distribuĂ©, insensible aux pannes (Elixir propose des superviseurs qui peuvent dĂ©marrer des parties du systĂšme) et offrir une haute disponibilitĂ©.

Elixir est un langage fonctionnel. Cela signifie entre autres que les variables sont immutables, qu’il n’y a pas de notion “d’orientĂ© objet” et que les itĂ©rations sont opĂ©rĂ©es par rĂ©cursions. Mais le langage offre des expressions comme le filtrage par motif (pattern matching) ou les garde (guard), qui une fois goĂ»tĂ©s, manquent terriblement dans les autres langages de programmations:

# Exemple de pattern matching
%Page{body: body, title: title, slug: slug} = Page.find("elixir-is-awesome")
title #=> "Elixir is awesome"
Enter fullscreen mode Exit fullscreen mode
# Exemple de garde
def publish(%Page{body: body}) when not is_nil(body) do
  # Code that publish page
end
Enter fullscreen mode Exit fullscreen mode
publish(Page.find("elixir-is-awesome"))
#=> fails if page body is nil
Enter fullscreen mode Exit fullscreen mode

Routes

La configuration de routes est simple et nous retrouvons l’instruction resources pour gĂ©nĂ©rer les routes REST canoniques :

defmodule MyApiServer.Router do
  use MyApiServer, :router

  pipeline :api do
        plug :accepts, ["json"]
  end

  scope "/api", HelloWeb do
    pipe_through :api
    resources "/pages", PageController, except: [:new, :edit]
  end
end
Enter fullscreen mode Exit fullscreen mode

Voici que serait une fonction du contrîleur pour restituer les informations d’une page en fonction du slug (en utilisant le pattern matching) :

defmodule MyApiServer.PageController do
  use MyApiServer, :controller
  alias MyApiServer.Page

  def show(conn, %{"id" => slug}) do
    page = Page.find(slug)
    render(conn, "show.json", page: page)
  end
end
Enter fullscreen mode Exit fullscreen mode

Vues

Et voici quelle serait le template pour retourner le JSON :

defmodule MyApiServer.PageView do
  use MyApiServer, :view
  def render("show.json", %{page: page}) do
    %{slug: page.slug, title: page.title}
  end
end
Enter fullscreen mode Exit fullscreen mode

Spécificités

Si vous voulez développer une application web réactive sans utiliser utiliser les frameworks en Javascript (React, Vuejs, Angular,...), le framework propose quelque chose de vraiment unique: LiveView. Il permet une communication bidirectionnelle via WebSocket sur des pages HTML traditionnelles. Le cycle de développement est simplifié : un langage, une application.

Conclusion

Phoenix et Elixir ont Ă©tĂ© co-crĂ©Ă© par JosĂ© Valim, qui est un ancien dĂ©veloppeur de Ruby on Rails. C’est donc tout normalement que l’on retrouve les principes qui fait le succĂšs de ce framework et du langage Ruby : architecture MVC, conventions au lieu de configurations, productivitĂ© et plaisir de coder :-) Mais grĂące Ă  Erlang, Phoenix dispose de ses propres avantages : performance, Ă©volutivitĂ© et une incroyable stabilitĂ©.

Laravel, la Renaissance

Au dĂ©but il y avait le verbe, et le verbe Ă©tait PHP. Au dĂ©marrage du web, le choix des langages de programmation Ă©tait plutĂŽt mince. Pas tous le monde ne pouvait se permettre d’acquĂ©rir une station NeXT (le premier navigateur a Ă©tĂ© dĂ©veloppĂ© en Objective C sur NeXT). Certains se lancĂšrent avec Perl. Mais trĂšs vite un nouveau langage fut dĂ©veloppĂ© et fut largement adoptĂ©: PHP. Ce fut une pĂ©riode de forte expĂ©rimentation qui dĂ©boucha sur des applications web bancales et difficilement maintenables, vĂ©ritables Tours de Babel. Beaucoup de dĂ©veloppeurs se brĂ»lĂšrent les doigts et quittĂšrent ce langage déçus.
NĂ©anmoins, le dĂ©veloppeur Taylor Otwell, fort de ses expĂ©riences tirĂ©es d’autres langages, prĂ©senta en 2011 un nouveau framework (trĂšs inspirĂ© de Ruby on Rails) qui apporta espoire Ă  la communautĂ© des artisans de web.

Routes

Concernant la dĂ©finitions de routes, il n’y a pas de fonction pour produire les routes, il faut les coder Ă  la main :

Route::get('pages', 'PagesController@index');
Route::get('pages/{id}', 'PagesController@show');
Route::post('pages', 'PagesController@store');
Route::put('pages/{id}', 'PagesController@update');
Route::delete('pages/{id}', 'PagesController@delete');
Enter fullscreen mode Exit fullscreen mode

Vues

Le rendu en JSON se fait trĂšs naturellement :

return response()->json([
    'title' => 'The best REST framework',
    'content' => 'The best REST framework is the one you use.',
]);
Enter fullscreen mode Exit fullscreen mode

Laravel propose le concept de “Ressource” comme couche de transformation entre le modĂšle et la rĂ©ponse en JSON:

namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class Page extends JsonResource
{
    public function toArray($request)
    {
        return [
            'slug' => $this->slug,
            'title' => $this->title,
            'body' => $this->body,
        ];
    }
}
Enter fullscreen mode Exit fullscreen mode

La ressource peut ĂȘtre appelĂ©e directement dans la route :

use App\Http\Resources\Pase as PageResource;
use App\Page;

Route::get('/pages', function () {
    return PageResource::collection(Page::all());
Enter fullscreen mode Exit fullscreen mode

Conclusion

Laravel est un framework solide qui vous permet de construire rapidement une API. Largement utilisĂ©, il intĂšgre les bonnes pratiques issues de plusieurs annĂ©es d’expĂ©rience en PHP et, c’est ce qui est important, des autres langages. Par ailleurs, il embarque plusieurs librairies officielle pour faciliter le dĂ©veloppement. Comme par exemple Passport pour l’authentification des API, Sanctum pour l’authentification des Single Page Application ou Telescope pour le dĂ©bugage et le suivi des performance.

Django, le framework qui swing

Django est le framework phare du langage Python. La premiĂšre version sort en 2005, la mĂȘme annĂ©e que RoR. Il a Ă©tĂ© utilisĂ© par de nombreuses startups Ă  succĂšs comme Disqus, Instagram, Youtube,... Mais toutefois, vous ne pourrez pas (ou difficilement) dĂ©velopper une API avec Django. Et oui: Vous serez obligĂ© de passer par un autre framework en complĂ©ment : le Django Rest Framework

Django offre une architecture ModĂšle-Vue-ContrĂŽleur sans contrĂŽleur
 \o/ Ce qui est une grande source de confusion dans la prise main. Ici, les vues peuvent ĂȘtre considĂ©rĂ©es comme les contrĂŽleurs et les templates comme les vues. Mais une fois passĂ© cette Ă©tape, Django est une framework trĂšs productifs, pensĂ© pour les dĂ©veloppeurs avec une excellente documentation. CouplĂ© avec Django Rest, vous pouvez trĂšs rapidement construire une API web.

Serialization

Un des premier Ă©lĂ©ment Ă  dĂ©finir est le “Serializer” qui permet de reprĂ©senter un objet ou une liste d’objet en JSON. Ce qui peut ĂȘtre fait rapidement :

class PageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Page
        fields = ['id', 'title', ‘slug’, 'descrition', 'body']
Enter fullscreen mode Exit fullscreen mode

Routes

La prochaine étape consiste à rédiger les routes (dans un fichier qui se nomme urls.py) qui permettent de lire, écrire, modifier et effacer une ressource (Page):

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from pages import views
Enter fullscreen mode Exit fullscreen mode
urlpatterns = [
    path('pages/', views.PageList.as_view()),
    path('pages/<int:pk>/', views.PageDetail.as_view()),]

urlpatterns = format_suffix_patterns(urlpatterns)
Enter fullscreen mode Exit fullscreen mode

Vues

Il est possible de produire les vues (contrÎleurs) trÚs rapidement en utilisant les vues génériques (qui suivent les bonnes pratiques REST):

from pages.models import Page
from pages.serializers import PageSerializer
from rest_framework import generics


class PageList(generics.ListCreateAPIView):
    queryset = Page.objects.all()
    serializer_class = PageSerializer


class PageDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Page.objects.all()
    serializer_class = PageSerializer
Enter fullscreen mode Exit fullscreen mode

Spécificités

Django Rest Framework génÚre automatique un outil de navigation de votre API qui vous permet comme développeur de tester votre application: https://restframework.herokuapp.com/. Cela ressemble à Postman mais en plus simple.

Conclusion

Django Rest Framework est Ă  la fois un outil flexible avec lequel vous pourrez produire rapidement des API web avec les fonctionnalitĂ©s performantes. Les outils de serialization supportent tant les source directement liĂ©es Ă  un modĂšle (ORM) ou des sources plus complexes (non-ORM). La documentation est complĂšte et vous bĂ©nĂ©ficierez Ă©galement d’une grande communautĂ© de dĂ©veloppeurs.

Maintenant, quel framework choisir ?

Tous les frameworks sont de haute qualités et répondront trÚs probablement à vos besoins. Ils bénéficient tous de plusieurs années d'expériences et ont fait leur preuves dans tout type de projets. Ma proposition est de choisir le framework dans la langue de programmation que vous connaissez le mieux. Vous serez directement productif et vous pourrez apprendre rapidement.

Toutefois certains framework peuvent avoir certains avantages en fonction de ce que vous recherchez.

Si votre projet réclame performance et stabilité, Phoenix sera le meilleur. Elle est l'arme secrÚte de quelques agences web.

Si vous voulez produire une API et des pages HTML simultanément, Ruby on Rails sera plus adapté.

Si vous avez besoin d’une API et d’un outil de gestion de contenu (à la Wordpress), Django Rest Framework se marie trùs bien avec Wagtail qui est un CMS efficace.

Top comments (0)

Update Your DEV Experience Level:

Settings

Go to your customization settings to nudge your home feed to show content more relevant to your developer experience level. 🛠