2024-01-20 02:25 Temps de lecture : 10 min

Qu’est-ce qu’un middleware ?

Éléments Essentiels à Retenir

  • Le middleware offre des schémas structurés pour interconnecter des applications, optimisant le processus de développement et assurant une communication efficace.
  • Le middleware facilite une transition plus rapide lors de modifications et met à disposition des outils de travail aisément accessibles.
  • Le middleware est une forme de modularité, bénéfique à toutes les strates de la programmation, du niveau supérieur au niveau inférieur.

Vous avez peut-être entendu le terme "middleware" employé dans divers contextes et vous vous demandez ce qu'il signifie. Explorez avec nous l'étendue et la richesse des technologies et processus qu'il englobe.

Le middleware : une notion aux multiples facettes

Le terme middleware est polyvalent et peut désigner différentes choses. En substance, on peut le définir comme des "logiciels qui s'exécutent entre d'autres logiciels". Autrement dit, tout programme qui dépend d'un code spécifique pour obtenir ses données d'entrée et traiter ses données de sortie.

Certains middlewares se présentent sous forme d'applications complètes qui transforment les données d'un état à un autre, suivant des protocoles et des formats de données précis que d'autres codes peuvent utiliser. Cependant, un middleware peut aussi être une simple fonction, intégrée à une série d'autres fonctions exécutées par un framework.

À l'instar de nombreux logiciels, les middlewares s'appuient sur le principe de la modularité, qui consiste à diviser un processus complexe en éléments plus petits et plus faciles à gérer.

Comment le middleware fonctionne-t-il ?

L'efficacité d'un middleware est généralement liée à ses protocoles et à son comportement défini publiquement. Des protocoles de communication rigoureux permettent aux développeurs de créer des logiciels qui fonctionnent correctement en respectant les normes.

Un serveur d'applications web agit comme un middleware, assurant la liaison entre l'interface utilisateur d'un site web et la logique et le modèle de données fournis par une application principale et une base de données. N'étant pas étroitement lié aux systèmes avec lesquels il interagit, on peut, en théorie, remplacer un serveur d'applications par un autre compatible sans avoir à modifier le code de l'application ou à restructurer la base de données.

Les composants middleware utilisent souvent des technologies comme JSON, REST, XML et SOAP. Ces technologies sont éprouvées, largement utilisées et basées sur du texte, ce qui simplifie grandement l'échange ou la réorganisation de composants. Leur format texte et la disponibilité d'un large éventail d'outils facilitent également le débogage.

Divers types de middleware

Le terme étant très large, il existe de nombreux exemples d'utilisation du middleware. Parmi les plus courants, on peut citer :

  • Les courtiers de messages, qui structurent la communication inter-processus.
  • Les serveurs d'applications web et les frameworks web.
  • Les moteurs de jeu, qui proposent un comportement par défaut qui peut être utilisé, étendu ou remplacé.
  • Les plateformes de streaming d'événements telles qu'Apache Kafka.

L'utilisation du middleware dans le développement de logiciels

L'une des applications les plus concrètes du middleware se trouve dans les frameworks web. La plupart des frameworks fournissent un environnement de base que l'on peut personnaliser et étendre selon les besoins spécifiques. Le modèle consiste souvent à faire passer les requêtes HTTP par une série de fonctions intégrées et personnalisées, dans un ordre précis, et à renvoyer une réponse HTTP à la fin.

Le framework Express.js utilise ce modèle pour offrir une grande personnalisation. Voici un exemple de fonction middleware écrite en JavaScript :

 app.use('/user/:id', (req, res, next) => {
console.log('Request Type:', req.method)
next()
})

Cette fonction est extrêmement simple :

  • Elle traite des URL spécifiques commençant par "/user/", suivi d'un identifiant.
  • Elle enregistre le type de méthode de requête, qui peut être GET, POST, etc.
  • Elle appelle ensuite une fonction fournie pour poursuivre le traitement de la chaîne de fonctions middleware.
  • Ce dernier appel à "next" est une étape cruciale du processus middleware et illustre la polyvalence de cette approche. Tant que chaque fonction middleware se comporte de manière indépendante, on peut les échanger et réorganiser facilement le comportement de l'ensemble de la chaîne.

    Le framework PHP, Laravel, a une configuration middleware quasi identique. On notera que l'espace de noms définit explicitement cette classe comme "Middleware".

     namespace App\Http\Middleware;
    

    use Closure;
    use Illuminate\Http\Request;
    use Symfony\Component\HttpFoundation\Response;

    class EnsureTokenIsValid
    {
        
         * Handle an incoming request.
         */
        public function handle(Request $request, Closure $next): Response
        {
            if ($request->input('token') !== 'my-secret-token') {
                return redirect('home');
            }

            return $next($request);
        }
    }

    Ici, le rôle de cette classe est très spécifique : elle se contente de vérifier si la requête contient un jeton. Dans ce cas, la fonction middleware peut interrompre la chaîne, en refusant d'appeler la fonction suivante et en envoyant à la place une redirection. La fonction de redirection renverra un objet Response approprié, que la fonction middleware devra renvoyer dans le cadre de son contrat de signature.

    L'exemple suivant illustre comment Django, un framework web basé sur Python, gère le middleware. Django utilise le terme "plugin" pour décrire son architecture middleware, un terme similaire à d'autres termes tels que "hook" ou "callback". Essentiellement, il s'agit d'un autre exemple de configuration middleware offrant une grande flexibilité tout au long d'un processus structuré.

     def simple_middleware(get_response):
        

        def middleware(request):
            
            

            response = get_response(request)

            
            

            return response

        return middleware

    On peut ensuite contrôler quel middleware s'exécute et dans quel ordre, via un simple tableau :

     MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    ]

    Django fournit un comportement par défaut, comme la classe CommonMiddleware, dont la plupart des applications peuvent bénéficier ; elle interdit l'accès à certains "mauvais" agents utilisateurs et gère la normalisation des URL. Il est courant que des middlewares critiques axés sur la sécurité soient exécutés au début du pipeline, mais cette flexibilité permet de personnaliser l'ordre en fonction des besoins de l'application.

    Pourquoi le middleware est-il utile ?

    Le middleware facilite la connexion d'applications qui n'ont pas été conçues pour être interconnectées. Il fournit les outils nécessaires à leur intégration, ainsi que des protocoles robustes et structurés pour leur communication.

    En conséquence, le middleware présente des avantages importants, notamment :

    • Un processus de développement d'applications rationalisé et des délais de mise sur le marché réduits.
    • Une connectivité efficace.
    • Une transition plus rapide lors de modifications.
    • Des outils de travail facilement accessibles.

    En fin de compte, le middleware est une forme de modularité, un concept bénéfique qui peut être appliqué à tous les niveaux de la programmation.

    Auteur
    France

    Rédacteur tech, guides pratiques et astuces numériques.