{"id":2679,"date":"2026-03-13T18:36:55","date_gmt":"2026-03-13T16:36:55","guid":{"rendered":"https:\/\/lightrest.codeline.fr\/?page_id=2679"},"modified":"2026-03-16T19:21:35","modified_gmt":"2026-03-16T17:21:35","slug":"bonnes-pratiques","status":"publish","type":"page","link":"https:\/\/lightrest.codeline.fr\/index.php\/bonnes-pratiques\/","title":{"rendered":"Les Bonnes pratiques"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">\u00catre parano\u00efaque !<\/h2>\n\n\n\n<p>D\u00e9velopper une API REST ne consiste pas seulement \u00e0 exposer des routes HTTP qui renvoient des donn\u00e9es. D\u00e8s qu\u2019une API devient accessible sur un r\u00e9seau \u2014 et plus encore sur Internet \u2014 elle devient imm\u00e9diatement une surface d\u2019attaque potentielle, un point d\u2019entr\u00e9e pour des comportements impr\u00e9vus, ou un vecteur de surcharge involontaire.<\/p>\n\n\n\n<p>Avec&nbsp;<strong>LightREST<\/strong>, il est tr\u00e8s simple de cr\u00e9er rapidement un serveur REST performant. Mais cette simplicit\u00e9 ne doit jamais faire oublier que l\u2019on d\u00e9veloppe un&nbsp;<strong>composant serveur concurrent<\/strong>, capable de traiter plusieurs requ\u00eates simultan\u00e9ment, parfois provenant de clients inconnus ou malveillants. Ce qui est valable quelle que soit la technologie ou le protocole de communication utilis\u00e9s.<\/p>\n\n\n\n<p>Dans ce contexte, la prudence n\u2019est pas une option. Un d\u00e9veloppeur d\u2019API doit adopter une approche presque&nbsp;<strong>parano\u00efaque<\/strong>&nbsp;: consid\u00e9rer que toute entr\u00e9e peut \u00eatre invalide, que toute ressource peut \u00eatre sollicit\u00e9e en parall\u00e8le, et que tout comportement inattendu finira un jour par se produire en production.<\/p>\n\n\n\n<p>Une API publique doit \u00eatre con\u00e7ue pour r\u00e9sister \u00e0 :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>des appels concurrents en grand nombre<\/li>\n\n\n\n<li>des param\u00e8tres erron\u00e9s ou malform\u00e9s<\/li>\n\n\n\n<li>des tentatives d\u2019\u00e9num\u00e9ration ou d\u2019exploration des donn\u00e9es<\/li>\n\n\n\n<li>des erreurs applicatives impr\u00e9vues<\/li>\n\n\n\n<li>des usages non anticip\u00e9s par les d\u00e9veloppeurs<\/li>\n<\/ul>\n\n\n\n<p>C\u2019est pr\u00e9cis\u00e9ment pour cette raison qu\u2019il est essentiel d\u2019appliquer un ensemble de&nbsp;<strong>bonnes pratiques<\/strong>&nbsp;lors du d\u00e9veloppement d\u2019un serveur LightREST. Ces pratiques permettent de construire des API plus robustes, plus s\u00fbres et plus maintenables dans le temps.<\/p>\n\n\n\n<p>Les recommandations pr\u00e9sent\u00e9es ci-dessous ne sont pas de simples conseils de style. Elles correspondent aux principes fondamentaux de conception des services REST modernes : gestion correcte de la concurrence, isolation des requ\u00eates, validation syst\u00e9matique des entr\u00e9es, ma\u00eetrise des ressources et respect des conventions d\u2019architecture.<\/p>\n\n\n\n<p>Adopter ces pratiques d\u00e8s le d\u00e9part permet d\u2019\u00e9viter des probl\u00e8mes difficiles \u00e0 diagnostiquer en production et garantit que votre serveur LightREST restera stable, s\u00e9curis\u00e9 et performant, m\u00eame lorsque la charge ou l\u2019exposition publique augmentera.<\/p>\n\n\n\n<p>LightREST est un serveur REST concurrent. Une m\u00eame route peut \u00eatre ex\u00e9cut\u00e9e simultan\u00e9ment par plusieurs requ\u00eates.<\/p>\n\n\n\n<p>Les principes fondamentaux sont :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00e9viter les variables globales non prot\u00e9g\u00e9es<\/li>\n\n\n\n<li>\u00e9viter les connexions base de donn\u00e9es partag\u00e9es entre toutes les requ\u00eates<\/li>\n\n\n\n<li>utiliser les hooks pour pr\u00e9parer et lib\u00e9rer les ressources<\/li>\n\n\n\n<li>valider syst\u00e9matiquement les entr\u00e9es<\/li>\n\n\n\n<li>produire des r\u00e9ponses HTTP claires et coh\u00e9rentes<\/li>\n\n\n\n<li>concevoir des routes rapides, isol\u00e9es et stateless<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Pas de connexion base de donn\u00e9es globale<\/h2>\n\n\n\n<p>Une connexion base de donn\u00e9es unique, partag\u00e9e entre toutes les routes, est une mauvaise pratique en environnement serveur concurrent.<\/p>\n\n\n\n<p>Cela peut provoquer :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>conflits d\u2019acc\u00e8s<\/li>\n\n\n\n<li>blocages<\/li>\n\n\n\n<li>corruption d\u2019\u00e9tat<\/li>\n\n\n\n<li>comportements al\u00e9atoires selon la charge<\/li>\n<\/ul>\n\n\n\n<p>M\u00eame si le handler LightREST est ex\u00e9cut\u00e9 dans un contexte Hyperfile d\u00e9die, la bonne pratique consiste \u00e0 ouvrir la connexion pour chaque requ\u00eate \u00e0 a y affecter les tables de l\u2019analyse, g\u00e9n\u00e9ralement via un hook ex\u00e9cut\u00e9 avant le handler, puis \u00e0 la fermer dans un hook de fin. Les moteurs de base de donn\u00e9es g\u00e9rant des pools de connexions disponibles, le processus est tr\u00e8s rapide.<\/p>\n\n\n\n<p><strong>Exemple :<\/strong><\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PROC\u00c9DURE HookBeforeMethod(pEventInfo lrHook:EventInfo) : lrHook:EventReturn\n\ncnxDB est une Connexion\n\n\/\/d\u00e9finir les param\u00e8tres de la connexion......\n\nSI PAS HOuvreConnexion(cnxDB ) ALORS\n    pEventInfo:Response:Status = lrResponse::StatusInternalServerError\n    pEventInfo:Response:ContentType = lrReponse::ContentTXT\n    pEventInfo:Response:Body = Herreuurinfo()\n    RENVOYER lrHook:EVE_ABORT\nFIN\n    \npRequest:DatabaseConnexion&#91;\"DB\"] = cnxDB \nhChangeConnexion(\"*\", cnxDB )\n\nRENVOYER lrHook:EVE_OK\n<\/code><\/pre>\n\n\n\n<p>Puis dans le handler :<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PROC\u00c9DURE HookAfterMethod(pEventInfo lrHook:EventInfo) : lrHook:EventReturn\n\nSI pRequest:DatabaseConnexion&#91;\"DB\"]..existe ALORS\n    hFermeConnexion(pRequest:DatabaseConnexion&#91;\"DB\"])\nFIN\nRENVOYER lrHook:EVE_OK\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">\u00c9viter les variables globales dans les handlers<\/h2>\n\n\n\n<p>Dans LightREST, plusieurs requ\u00eates peuvent acc\u00e9der au m\u00eame moment au m\u00eame code et aux m\u00eames donn\u00e9es.<\/p>\n\n\n\n<p>Une variable globale non prot\u00e9g\u00e9e peut donc devenir une source :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>d\u2019incoh\u00e9rences<\/li>\n\n\n\n<li>de corruption m\u00e9moire<\/li>\n\n\n\n<li>de bugs intermittents<\/li>\n\n\n\n<li>de crashs difficiles \u00e0 reproduire<\/li>\n<\/ul>\n\n\n\n<p><strong>Exemple \u00e0 \u00e9viter :<\/strong><\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gCompteur++\n<\/code><\/pre>\n\n\n\n<p>Si un \u00e9tat partag\u00e9 est r\u00e9ellement n\u00e9cessaire, il doit \u00eatre prot\u00e9g\u00e9 par un m\u00e9canisme de synchronisation ou stock\u00e9 dans une structure adapt\u00e9e.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Partager proprement des donn\u00e9es globales avec LightREST<\/h2>\n\n\n\n<p>LightREST fournit les membres&nbsp;<strong>CustomData<\/strong>&nbsp;\u00e0 plusieurs niveaux :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>serveur<\/li>\n\n\n\n<li>route<\/li>\n\n\n\n<li>requ\u00eate<\/li>\n<\/ul>\n\n\n\n<p>C\u2019est la m\u00e9thode recommand\u00e9e pour associer des donn\u00e9es de contexte sans multiplier les variables globales dispers\u00e9es.<\/p>\n\n\n\n<p><strong>Exemple :<\/strong><\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>oServer:CustomData&#91;\"Config\"] = maConfiguration\n<\/code><\/pre>\n\n\n\n<p>Puis dans le handler :<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cfg est un Config = poRequest:ServerCustomData&#91;\"Config\"]\n<\/code><\/pre>\n\n\n\n<p><br>Cette approche rend le code plus clair, mieux structur\u00e9 et plus s\u00fbr.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Limiter l\u2019utilisation des objets ou ressources partag\u00e9s entre plusieurs handlers<\/h2>\n\n\n\n<p>Le plus s\u00fbr est d\u2019\u00e9viter ce cas de figure. Si toutefois c\u2019est incontournable, il faut que leur acc\u00e8s soit ma\u00eetris\u00e9.<\/p>\n\n\n\n<p>Toute ressource partag\u00e9e doit \u00eatre :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>thread-safe par conception<\/li>\n\n\n\n<li>ou prot\u00e9g\u00e9e par une synchronisation explicite<\/li>\n<\/ul>\n\n\n\n<p>Par exemple, si plusieurs handlers modifient un m\u00eame compteur ou une m\u00eame structure, il faut s\u00e9curiser l\u2019acc\u00e8s par section critique (<a href=\"https:\/\/doc.pcsoft.fr\/fr-FR\/?1000021292\" target=\"_blank\" rel=\"noreferrer noopener\"><u>https:\/\/doc.pcsoft.fr\/fr-FR\/?1000021292<\/u><\/a>), s\u00e9maphore (<a href=\"https:\/\/doc.pcsoft.fr\/fr-FR\/?3077013\"><u>https:\/\/doc.pcsoft.fr\/fr-FR\/?3077013<\/u><\/a>) ou autre m\u00e9canisme appropri\u00e9.<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SectionCritiqueD\u00e9but(gsLock)\ngCompteur++\nSectionCritiqueFin(gsLock)\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Ne pas exposer les identifiants techniques dans les routes<\/h2>\n\n\n\n<p>Exposer directement un identifiant base de donn\u00e9es dans une URL facilite :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>l\u2019\u00e9num\u00e9ration des ressources<\/li>\n\n\n\n<li>l\u2019exploration des donn\u00e9es<\/li>\n\n\n\n<li>certaines tentatives d\u2019acc\u00e8s non autoris\u00e9<\/li>\n<\/ul>\n\n\n\n<p><strong>Exemple \u00e0 \u00e9viter :<\/strong><\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/clients\/1287\n<\/code><\/pre>\n\n\n\n<p>Il est pr\u00e9f\u00e9rable d\u2019exposer un identifiant chiffr\u00e9 ou obfusqu\u00e9 via les fonctions :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CipherID()<\/code><\/li>\n\n\n\n<li><code>DecipherID()<\/code><br><br>NB : L\u2019algorithme CiphedID ne produira pas le m\u00eame identifiant chiffr\u00e9 pour 2 valeurs identiques sur 2 tables diff\u00e9rentes.<\/li>\n<\/ul>\n\n\n\n<p><strong>Exemple :<\/strong><\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/clients\/03980608-5abe9581-7fee65e9-194ae106\n<\/code><\/pre>\n\n\n\n<p>Puis dans le handler :<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nID est entier = DecipherID(pRequest:GetUrlValue(\"id\"))\n\n\/\/Ici nID = 1287\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Rester stateless<\/h2>\n\n\n\n<p>Oui. Une API REST doit rester aussi stateless que possible.<\/p>\n\n\n\n<p>Une requ\u00eate ne doit pas d\u00e9pendre d\u2019un \u00e9tat conserv\u00e9 implicitement dans le serveur ou dans un handler pr\u00e9c\u00e9dent.<\/p>\n\n\n\n<p>Il faut \u00e9viter par exemple :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>de m\u00e9moriser un utilisateur courant dans une variable globale<\/li>\n\n\n\n<li>de supposer qu\u2019une requ\u00eate pr\u00e9c\u00e9dente a d\u00e9j\u00e0 pr\u00e9par\u00e9 un contexte<\/li>\n\n\n\n<li>de conserver un \u00e9tat m\u00e9tier cach\u00e9 entre deux appels<\/li>\n<\/ul>\n\n\n\n<p>Chaque requ\u00eate doit porter elle-m\u00eame les informations n\u00e9cessaires via :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>son token<\/li>\n\n\n\n<li>ses headers<\/li>\n\n\n\n<li>ses param\u00e8tres<\/li>\n\n\n\n<li>ou son contexte de requ\u00eate<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">\u00c9viter les variables globales dans les handlers<\/h2>\n\n\n\n<p>Un handler REST doit r\u00e9pondre rapidement.<\/p>\n\n\n\n<p>Un traitement long monopolise inutilement les ressources du serveur et d\u00e9grade la capacit\u00e9 \u00e0 traiter d\u2019autres requ\u00eates.<br>A partir de la version 3.3, LightREST propose un syst\u00e8me de Workers qui permettent d\u2019ex\u00e9cution des traitements longs de fa\u00e7on asynchrone et de lib\u00e9rer imm\u00e9diatement le handler en cours.<br><br>Il est pr\u00e9f\u00e9rable de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>d\u00e9l\u00e9guer les travaux lourds \u00e0 une file de traitement<\/li>\n\n\n\n<li>lancer un traitement asynchrone<\/li>\n\n\n\n<li>renvoyer imm\u00e9diatement un accus\u00e9 de prise en compte<\/li>\n<\/ul>\n\n\n\n<p><strong>Exemple de r\u00e9ponse :<\/strong><\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"status\": \"accepted\",\n  \"jobId\": \"12345\"\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Centraliser l\u2019authentification<\/h2>\n\n\n\n<p>Centraliser l\u2019authentification avec un Hook EVE_BEFORE_HANDLER \u00e9vite la duplication de code dans chaque route et r\u00e9duit le risque d\u2019oublis ou d\u2019incoh\u00e9rences.<\/p>\n\n\n\n<p>La fonction d\u00e9di\u00e9e permet d\u2019appliquer une logique homog\u00e8ne sur l\u2019ensemble du serveur ou sur un groupe de routes.<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SetAuthenticationCheckFunction()\n<\/code><\/pre>\n\n\n\n<p>Une authentification centralis\u00e9e am\u00e9liore :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>la lisibilit\u00e9<\/li>\n\n\n\n<li>la maintenabilit\u00e9<\/li>\n\n\n\n<li>la s\u00e9curit\u00e9 globale<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Centraliser les logs<\/h2>\n\n\n\n<p>Une API en production doit permettre de comprendre ce qu\u2019il se passe en cas d\u2019erreur, de lenteur ou d\u2019usage anormal.<\/p>\n\n\n\n<p>Il faut journaliser au minimum :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>les erreurs<\/li>\n\n\n\n<li>les avertissements<\/li>\n\n\n\n<li>les \u00e9checs d\u2019authentification<\/li>\n\n\n\n<li>les appels re\u00e7us<\/li>\n\n\n\n<li>la dur\u00e9e des traitements<\/li>\n<\/ul>\n\n\n\n<p><strong>Hooks utiles :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>EVE_ERROR<\/code><\/li>\n\n\n\n<li><code>EVE_WARNING<\/code><\/li>\n\n\n\n<li><code>EVE_AUTH_FAILED<\/code><\/li>\n\n\n\n<li><code>EVE_RECEIVED<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Limiter le volume des r\u00e9ponses<\/h2>\n\n\n\n<p>Retourner des volumes massifs de donn\u00e9es ralentit :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>le serveur<\/li>\n\n\n\n<li>le r\u00e9seau<\/li>\n\n\n\n<li>le client<\/li>\n<\/ul>\n\n\n\n<p>Il est pr\u00e9f\u00e9rable d\u2019utiliser :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>la pagination<\/li>\n\n\n\n<li>des filtres<\/li>\n\n\n\n<li>une limite explicite<\/li>\n<\/ul>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/clients?page=1&amp;limit=50\n<\/code><\/pre>\n\n\n\n<p>Cette pratique am\u00e9liore \u00e0 la fois les performances et l\u2019exp\u00e9rience d\u2019int\u00e9gration c\u00f4t\u00e9 client.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Valider syst\u00e9matiquement les entr\u00e9es<\/h2>\n\n\n\n<p>Un bon d\u00e9veloppeur d\u2019API se doit d\u2019\u00eatre PARANO\u00cfAQUE ! Une API ne doit&nbsp;jamais faire confiance&nbsp;aux donn\u00e9es re\u00e7ues.<\/p>\n\n\n\n<p>Il faut valider :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>les param\u00e8tres d\u2019URL<\/li>\n\n\n\n<li>les payloads JSON<\/li>\n\n\n\n<li>les headers<\/li>\n\n\n\n<li>les types et formats attendus<\/li>\n<\/ul>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sID = pRequest:GetUrlValue(\"id\")\n\nSI sID = \"\" ALORS\n    oResponse:Status = lrResponse::StatusBadRequest\nFIN\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Ne jamais exposer le d\u00e9tail des erreurs techniques<\/h2>\n\n\n\n<p>C\u2019est&nbsp;<strong>tr\u00e8s important pour une API publique<\/strong>.<\/p>\n\n\n\n<p>Une API ne doit jamais renvoyer directement des erreurs internes du serveur ou de la base de donn\u00e9es, qui peuvent contenir des extraits de code, le contenu de variables, des requ\u00eates SQL ou des donn\u00e9es.<\/p>\n\n\n\n<p>Exemples dangereux :<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">SQL error near column CLIENT_ID<br>File not found: \/var\/data\/config.ini<br>Stack trace...<\/pre>\n\n\n\n<p>Ces informations peuvent r\u00e9v\u00e9ler :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>la structure interne de l\u2019application<\/li>\n\n\n\n<li>la base de donn\u00e9es utilis\u00e9e<\/li>\n\n\n\n<li>l\u2019architecture du serveur<\/li>\n<\/ul>\n\n\n\n<p>La bonne pratique consiste \u00e0 renvoyer des messages d\u2019erreur contr\u00f4l\u00e9s.<\/p>\n\n\n\n<p>Exemple :<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{<br>  \"error\": \"internal_error\",<br>  \"message\": \"An unexpected error occurred\"<br>}<\/pre>\n\n\n\n<p>Les d\u00e9tails techniques doivent \u00eatre enregistr\u00e9s uniquement dans les logs serveur.<br>NB : Le niveau de d\u00e9tail des erreurs g\u00e9r\u00e9es automatiquement par LightREST est r\u00e9glable par la propri\u00e9t\u00e9 lrServer:WindevErrorDetail.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Ajouter un endpoint de sant\u00e9 (health check)<\/h2>\n\n\n\n<p>Tr\u00e8s utilis\u00e9 en production.<\/p>\n\n\n\n<p>Un serveur API devrait exposer une route simple permettant de v\u00e9rifier son \u00e9tat.<\/p>\n\n\n\n<p>Exemple :<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">GET \/health<\/pre>\n\n\n\n<p>R\u00e9ponse :<\/p>\n\n\n\n<p>Copier<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{<br>  \"status\": \"ok\"<br>}<\/pre>\n\n\n\n<p>Ce type de route est utilis\u00e9 par :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>les syst\u00e8mes de supervision<\/li>\n\n\n\n<li>les load balancers<\/li>\n\n\n\n<li>les orchestrateurs<\/li>\n\n\n\n<li>les outils de monitoring<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-montserrat-font-family has-large-font-size\" id=\"1-multi-instances-plusieurs-serveurs-lightrest-dans-un-m%C3%AAme-ex%C3%A9cutable\">Respecter les conventions REST<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Action<\/th><th>Route<\/th><\/tr><tr><td>liste<\/td><td>GET \/clients<\/td><\/tr><tr><td>d\u00e9tail<\/td><td>GET \/clients\/{id}<\/td><\/tr><tr><td>cr\u00e9ation<\/td><td>POST \/clients<\/td><\/tr><tr><td>modification<\/td><td>PUT \/clients\/{id}<\/td><\/tr><tr><td>suppression<\/td><td>DELETE \/clients\/{id}<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Une API coh\u00e9rente r\u00e9duit la documentation n\u00e9cessaire et facilite l\u2019adoption.LightREST V3 marque une \u00e9volution majeure :&nbsp;<strong>plus ouvert<\/strong>,&nbsp;<strong>plus flexible<\/strong>,&nbsp;<strong>plus s\u00e9curis\u00e9<\/strong>, et&nbsp;<strong>plus robuste en production<\/strong>.<br>Cette page r\u00e9capitule les nouveaut\u00e9s principales et surtout&nbsp;<strong>ce qu\u2019elles apportent concr\u00e8tement<\/strong>&nbsp;au quotidien.<br><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00catre parano\u00efaque ! D\u00e9velopper une API REST ne consiste pas seulement \u00e0 exposer des routes HTTP qui renvoient des donn\u00e9es. D\u00e8s qu\u2019une API devient accessible sur un r\u00e9seau \u2014 et plus encore sur Internet \u2014 elle devient imm\u00e9diatement une surface d\u2019attaque potentielle, un point d\u2019entr\u00e9e pour des comportements impr\u00e9vus, ou un vecteur de surcharge involontaire. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2679","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/pages\/2679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/comments?post=2679"}],"version-history":[{"count":13,"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/pages\/2679\/revisions"}],"predecessor-version":[{"id":2701,"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/pages\/2679\/revisions\/2701"}],"wp:attachment":[{"href":"https:\/\/lightrest.codeline.fr\/index.php\/wp-json\/wp\/v2\/media?parent=2679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}