Aller au contenu

Classe lrRoute

Role

Décrit une route REST : chemin, méthode REST, callback, timeout, options (OPTIONS/CORS), custom data et hooks (niveau route).

Objet passé en paramètre à la méthode lrServer:AddRoute()

Membres et propriétés

NomTypeUsage
RoutechaîneChemin REST (ex: /customers/{id}).
MethodchaîneMéthode HTTP (GET/POST/PUT/DELETE/…).
HandlerprocédureHandler REST appelée par le moteur LightREST lorsque la route est appelée.

La procédure doit être prototypée ainsi :
    procedure procRoute(poRequest est objet lrRequest, poResponse est objet lrResponse)

Prototype antérieur à la V3 :
    procedure procRoute(poRequest est objet lrRequest) : objet lrResponse

L'objet lrResponse (ou l'objet poResponse selon le cas ci-dessus) retourné doit affecter :
  - à minima le membre :Status en cas d'erreur (éventuellement complété par des détails dans :Body)
  - :Body, :ContentType et :Status en cas d'envoi d'une réponse valide
TagchaîneEtiquette pour identifier facilement la route dans le code (dans un HOOK par exemple).

ℹ Par défaut, le Tag est initialisé à la valeur Route@Méthode (exemple : "/ping@GET"), mais le dévleoppeur LightREST peut affecter toute valeur qui lui sera utile.
TimeoutDuréeTimeout spécifique à la route.

Ce membre est prioritaire sur le timeout défini au niveau du serveur LightREST (lrServer:RequestTimeout).
En cas de dépassement, l'exécution du Handler REST WinDev en cours est annulée et une erreur HTTP 408 (StatusRequestTimeout) est envoyée au client.
UseGlobalOptionHeadersbooléenSi vrai, ajoute automatiquement une route OPTIONS associée.
Les headers OPTIONS globaux du serveur sont alors utilisés.
CustomDataVariantDonnées métier ou techniques persistantes attachées à la route.
Seront intégrées dans le membre lrRequest:RouteCustomData reçu en paramètre de la procédure REST.
NoRegexbooléenDésactive la validation par expression régulière de la route.

A la création de la route, la validité de sa syntaxe est vérifiée avec l'expression RegEx définie dans la constante lrServer::ROUTE_REGEX.
Si :NoRegex=vrai, aucune vérification ne sera effectuée (dans l'éventualité où l'expression RegEx proposée par LightREST ne correpondrait pas au besoin).
OptionsHeaderstableau associatif (ccSansCasse+AvecDoublon) de chaînesHeaders OPTIONS spécifiques à cette route.

Ils seront ajoutés systématiquement aux réponses de cette route avec la méthode OPTIONS.
Utilisé habituellement pour gérer le cross domain avec les clients de type navigateur.

Constantes

Contrôle du serveur

NomTypeUsage
Start

Méthodes HTTP

NomTypeUsage
MethodGETchaîneMéthode REST GET
MethodPOSTchaîneMéthode REST POST
MethodPUTchaîneMéthode REST PUT
MethodDELETEchaîneMéthode REST DELETE
MethodHEADchaîneMéthode REST HEAD
MethodPATCHchaîneMéthode REST PATCH
MethodOPTIONSchaîneMéthode REST OPTIONS
MethodTRACEchaîneMéthode REST TRACE

Méthodes

AddHook

📘 Présentation
Ajoute un Hook au niveau de la route.

Le(s) hook(s) ajouté(s) ici ne s'applique(nt) qu'à cette route et permet(tent) :
- d'exécuter un traitement avant le Handler REST (auth, validation, rate-limit, etc.)
- d'exécuter un traitement après le Handler REST (audit, métriques, etc.)
- de modifier ou remplacer la réponse juste avant l'envoi au client (selon les évènements définis dans lrHook)

Si plusieurs hooks sont passés en paramètre, ils sont exécutés dans cet ordre (jusqu'à éventuelle annulation par EVE_ABORT).

ℹ Pour installer un hook global pour toutes les routes, utiliser lrServer:AddHook().

🧩 Prototypage
AddHook(poHook est objet lrHook[,poHook2 est objet lrHook, poHook3, ....])*

🔧 Paramètres
NomTypeUsage
poHook1 [,poHook2, poHook3, ...]    Objet(s) lrHookHook(s) à ajouter au niveau de la route.

↩️ Valeurs retournées
(aucune)

🧪 Exemple
  • Route publique /ping sans authentification
  • Route /private avec hook d'authentification au niveau route
oServer     est objet lrServer
oRoutePing  est objet lrRoute
oRoutePriv  est objet lrRoute
oAuthHook   est objet lrHook
bOK         est booléen
sErr        est chaîne

// ---- Hook d'auth ----
oAuthHook.Evants   = lrHook::EVE_BEFORE_METHOD
oAuthHook.Handler = fnAuthHook

// ---- Route publique ----
oRoutePing.Method      = lrRoute::MethodGET
oRoutePing.Route       = "/ping"
oRoutePing.RESTFunction = procPing

// ---- Route privée ----
oRoutePriv.Method       = lrRoute::MethodGET
oRoutePriv.Route        = "/private"
oRoutePriv.RESTFunction = procPrivate
oRoutePriv:AddHook(oAuthHook)


(bOK, sErr) = oServer:AddRoute(oRoutePing)
SI PAS bOK ALORS Erreur(sErr) ; RETOUR ; FIN

(bOK, sErr) = oServer:AddRoute(oRoutePriv)
SI PAS bOK ALORS Erreur(sErr) ; RETOUR ; FIN

// ---- Handlers ----
PROCEDURE INTERNE fnAuthHook(pInfo est lrHook:lrEventInfo) : lrHook:lrEventReturn
  // pInfo dépend de lrHook (request/response/message...)
  // Vérifie un header, sinon prépare une réponse 401 selon l'implémentation lrHook

  SI pInfo.Request.GetHeaderValue("token")="xxxxxxxxxxx" ALORS
    RENVOYER lrHook::EVE_OK
  SINON
    //Auth KO, on annule l'exécution de la route avec une erreur 401
    pInfo.Response.Status = lrResponse::StatusForbidden
    RENOVYER lrHook::EVE_ABORT
  FIN
FIN

PROCEDURE INTERNE procPing(poRequest est objet lrRequest) : objet lrResponse
  oResp est objet lrResponse

  oResp.Status      = lrResponse::StatusOK
  oResp.ContentType = lrResponse::ContentTXT
  oResp.Body        = "pong"
  RENVOYER oResp
FIN

PROCEDURE INTERNE procPrivate(poRequest est objet lrRequest) : objet lrResponse
  oResp est objet lrResponse

  oResp.Status      = lrResponse::StatusOK
  oResp.ContentType = lrResponse::ContentTXT
  oResp.Body        = "private data"
  RENVOYER oResp
FIN