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
| Nom | Type | Usage |
|---|---|---|
Route | chaîne | Chemin REST (ex: /customers/{id}). |
Method | chaîne | Méthode HTTP (GET/POST/PUT/DELETE/…). |
Handler | procédure | Handler 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 |
Tag | chaîne | Etiquette pour identifier facilement la route dans le code (dans un HOOK par exemple). |
Timeout | Durée | Timeout 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. |
UseGlobalOptionHeaders | booléen | Si vrai, ajoute automatiquement une route OPTIONS associée. Les headers OPTIONS globaux du serveur sont alors utilisés. |
CustomData | Variant | Donné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. |
NoRegex | booléen | Dé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). |
OptionsHeaders | tableau associatif (ccSansCasse+AvecDoublon) de chaînes | Headers 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¶
| Nom | Type | Usage |
|---|---|---|
Start |
Méthodes HTTP¶
| Nom | Type | Usage |
|---|---|---|
MethodGET | chaîne | Méthode REST GET |
MethodPOST | chaîne | Méthode REST POST |
MethodPUT | chaîne | Méthode REST PUT |
MethodDELETE | chaîne | Méthode REST DELETE |
MethodHEAD | chaîne | Méthode REST HEAD |
MethodPATCH | chaîne | Méthode REST PATCH |
MethodOPTIONS | chaîne | Méthode REST OPTIONS |
MethodTRACE | chaîne | Méthode REST TRACE |
Méthodes¶
AddHook
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().
AddHook(poHook est objet lrHook[,poHook2 est objet lrHook, poHook3, ....])*
| Nom | Type | Usage |
|---|---|---|
poHook1 [,poHook2, poHook3, ...] | Objet(s) lrHook | Hook(s) à ajouter au niveau de la route. |
- 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