Aller au contenu

Classe lrRequest

Role

Objet reçu par les méthodes REST associées aux routes.

Contient la requête HTTP reçue par LightREST : headers, URL, variables de route, body, fichiers, données custom, et structures d’authentification.

Membres et propriétés

NomTypeUsage
AuthenticationStructure lrAuthenticationInfos d’authentification reçues dans la requête REST

BodyBufferBody de la requête REST.
Contenu au format texte, binaire, JSON, XML, ...
ContentLengthentier sur 8 octetsLongueur du body en octets
CustomDataVariantDonnées custom précédemment attachées à la requête par un HOOK.

Voir également lrRequest:ServerCustomData et lrRequest:RouteCustomData.
Filestableau associatif de Structures lrFileTableau des fichiers uploadés
Headertableau associatif (ccSansCasse+AvecDoublon) de chaîneHeaders HTTP
HostchaîneHôte
IDchaîneIdentifiant LightREST interne de la requête.

Utile par exemple pour analyser les logs LightREST
MethodchaîneMéthode HTTP (GET/POST/UPDATE…).
PostFormtableau associatif (ccSansCasse) de chaîneChamps de formulaire POST
ProtochaîneProtocole (ex: HTTP/1.1).
RemoteAddrchaîneAdresse distante (IP:port client)
RequestURIchaîneURI brute.
RouteCustomDataVariantDonnées custom attachées lors de la création de la route lrRoute:CustomData.
ServerCustomDataVariantDonnées custom attachées au serveur lrServer.CustomData.
URLStructure lrUrlComposition de l'URL
Varstableau associatif (ccSansCasse) de chaîneVariables extraites de la route ({id} → Vars[\"id\"]).
Accessibles avec la méthode :GetRouteValue().

Types
lrURL — Décomposition de l’URL de la requête.

🏷️ Type
Structure

📘 Présentation
Décomposition de l’URL de la requête.

🔧 Structure
NomTypeUsage
SchemechaîneSchéma de l’URL (http/https).
UserchaîneUtilisateur présent dans l’URL (si fourni).
HostchaîneHôte (domaine + port éventuel).
PathchaîneChemin (path) de l’URL.
RawPathchaîneChemin brut (RawPath) lorsqu’il est renseigné.
QueryValuestableau associatif (ccSansCasse) de chaînesParamètres de query-string. Accessible par la méthode :GetURLValue()

lrFile — Décrit un fichier uploadé dans la requête.

🏷️ Type
Structure

📘 Présentation
Décrit un fichier uploadé dans la requête.

🔧 Structure
NomTypeUsage
NamechaîneNom du fichier.
ContentBufferContenu binaire du fichier.

lrAuthentication — Informations d’authentification fournies dans la requête.

🏷️ Type
Structure

📘 Présentation
Informations d’authentification fournies dans la requête.

🔧 Structure
NomTypeUsage
UserchaîneIdentifiant.
PasswordchaîneMot de passe.

Méthodes

GetHeaderValue

📘 Présentation
Renvoie la valeur d’un header HTTP

🧩 Prototypage
GetHeaderValue(pHeader est chaîne) : chaîne

🔧 Paramètres
NomTypeUsage
pHeaderchaîneNom du header.

↩️ Valeurs retournées
TypeUsage
chaîneValeur du HEADER HTTP reçu (chaîne vide si absente)

🧪 Exemple
  • Lecture d'une clé d'API transmise dans le header X-API-KEY
  • Refus en StatusUnauthorized si la clé est absente ou invalide
  • Exemple typique : sécuriser une route de “ping” ou un endpoint d'administration
FONCTION PingSecure(poRequest est objet lrRequest, poResponse est objet lrResponse)

sApiKey est chaîne

sApiKey = poRequest:GetHeaderValue("X-API-KEY")

SI sApiKey="" OU sApiKey<>"MY_SECRET_KEY" ALORS
  poResponse:Status      = lrResponse::StatusUnauthorized
  poResponse:ContentType = lrResponse::ContentTXT
  poResponse:Body        = "Unauthorized"
SINON
  poResponse:Status      = lrResponse::StatusOK
  poResponse:ContentType = lrResponse::ContentTXT
  poResponse:Body        = "pong"
FIN

GetHeaderSubValue

📘 Présentation
Extrait une sous-valeur dans un header HTTP multi-valeur (exemples : boundary= ou cache-control=).

🧩 Prototypage
GetHeaderSubValue(pHeader est chaîne, pSubHeader est chaîne) : chaîne

🔧 Paramètres
NomTypeUsage
pHeaderchaîneNom du header (ex: Content-Type).
pSubHeaderchaîneSous-header (ex: boundary).

↩️ Valeurs retournées
TypeUsage
chaîneValeur du SUB HEADER HTTP (Chaîne vide si absent)

🧪 Exemple
  • Lecture de la sous-valeur boundary d'un header Content-Type de type multipart/form-data
  • Retour StatusBadRequest si la sous-valeur est absente (requête invalide / upload mal formé)
  • Utile pour diagnostiquer rapidement un problème d'upload (par ex. depuis Postman / navigateur)
FONCTION UploadPOST(poRequest est objet lrRequest, poResponse est objet lrResponse)

sBoundary est chaîne

// Exemple attendu côté client :
// Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

sBoundary = poRequest:GetHeaderSubValue("Content-Type", "boundary")

SI sBoundary="" ALORS
  poResponse:Status      = lrResponse::StatusBadRequest
  poResponse:ContentType = lrResponse::ContentTXT
  poResponse:Body        = "Missing boundary in Content-Type header"
SINON
  poResponse:Status      = lrResponse::StatusOK
  poResponse:ContentType = lrResponse::ContentTXT
  poResponse:Body        = "Boundary detected: " + sBoundary
FIN

GetRouteValue

📘 Présentation
Renvoie la valeur d’une variable extraite de la route.

Par exemple, pour la route /tiers/123456, GetRouteValue("id") retournera 123456.

🧩 Prototypage
GetRouteValue(pTag est chaîne) : chaîne

🔧 Paramètres
NomTypeUsage
pTagchaîneNom de la variable (ex: id).

↩️ Valeurs retournées
TypeUsage
chaîneValeur de la variable de ROUTE (chaîne vide si absente)

🧪 Exemple
  • Route de type /tiers/{id}
  • Extraction de l'ID à partir de la route (variable {id})
  • Recherche de l'enregistrement
  • Conversion en variant avec la méthode lrResponse::RecordToVariant puis en JSON
  • envoi de la réponse (ou StatusNotFound si absent)
FONCTION TiersGET(poRequest est objet lrRequest, poResponse est objet lrResponse)

sID    est chaîne
vTiers est Variant

// Exemple de route appelée : /tiers/123456
sID = poRequest:GetRouteValue("id")

SI sID="" ALORS
  // Normalement impossible si la route est bien déclarée, mais sécurise le code
  poResponse:Status      = lrResponse::StatusBadRequest
  poResponse:ContentType = lrResponse::ContentTXT
  poResponse:Body        = "No ID provided"
  RETOUR
FIN

SI hLitRecherchePremier("TIERS", "ID", sID) ALORS
  vTiers = lrResponse::RecordToVariant("TIERS", "ID,NAME,CITY")
  poResponse:Body        = VariantVersJSON(vTiers)
  poResponse:ContentType = lrResponse::ContentJSON
  poResponse:Status      = lrResponse::StatusOK
SINON
  poResponse:Body        = "Not found"
  poResponse:ContentType = lrResponse::ContentTXT
  poResponse:Status      = lrResponse::StatusNotFound
FIN

GetURLValue

📘 Présentation
Renvoie la valeur d’un paramètre situé dans l'URL.

Exemple : Pour l'URL /tiers/123456?scope=full&country=FR, GetURLValue("country") retournera FR.

🧩 Prototypage
GetURLValue(pTag est chaîne) : chaîne

🔧 Paramètres
NomTypeUsage
pTagchaîneNom du paramètre (ex: scope, country, q...).

↩️ Valeurs retournées
TypeUsage
chaîneValeur du paramètre d'URL (chaîne vide si la variable n'existe pas)

🧪 Exemple
  • Lecture de paramètres dans l'URL (query string)
  • Exemple : /tiers/123456?scope=full&country=FR
  • Application d'une valeur par défaut si le paramètre n'est pas fourni
FONCTION TiersGET_Scope(poRequest est objet lrRequest, poResponse est objet lrResponse)

sScope   est chaîne
sCountry est chaîne

// Exemple appelé : /tiers/123456?scope=full&country=FR
sScope   = poRequest:GetURLValue("scope")
sCountry = poRequest:GetURLValue("country")

SI sScope="" ALORS
  sScope = "basic"  // valeur par défaut
FIN

poResponse:Status      = lrResponse::StatusOK
poResponse:ContentType = lrResponse::ContentTXT
poResponse:Body        = "scope=" + sScope + ", country=" + sCountry

VariantToSource

📘 Présentation
Copie les membres d'un variant vers un enregistrement (source de données).
Utile pour copier directement un flux reçu dans une requête REST dans un enregistement avant insertion ou mise à jour.
Vérifie l'existence de chaque membre dans la structure de la table avant affectation.

🧩 Prototypage
VariantToSource(pVariant, pSource est Source de Données, pIDColumn est chaîne = "")

🔧 Paramètres
NomTypeUsage
pVariantVariantDonnées à copier.
pSourceSource de DonnéesSource de données HFSQL cible.
pIDColumnchaîneRubrique ID à ignorer (optionnel).

↩️ Valeurs retournées
(aucune)

🧪 Exemple

Endpoint d'import : réception d'un JSON les données d'un CLIENT :

  • Conversion du JSON en Variant
  • Affectation des membres de l'enregistrement CLIENT à partir des membres homonymes du variant
  • Insertion en base HFSQL

    FONCTION ClientPOST(poRequest est objet lrRequest, poResponse est objet lrResponse)
    
    sJSON est chaîne
    vData est Variant
    
    // Exemple de body JSON attendu :
    //   {"NAME":"Dupont","FIRSTNAME":"Paul","CITY":"Paris"},
    
    QUAND EXCEPTION DANS
        vData = JSONVersVariant(sJSON)
    FAIRE
        poResponse:Status      = lrResponse::StatusBadRequest
        poResponse:ContentType = lrResponse::ContentTXT
        poResponse:Body        = "Malformed JSON"
        RETOUR
    FIN
    
    // Copie des données vers un enregistrement CLIENT
    // "ID" est ignoré (si ID auto par exemple)
    poRequest:VariantToSource(vData, CLIENT, "ID")
    
    //Ici on peut vérifier la validité des données avant de les insérer
    
    hAjoute(CLIENT)
    
    poResponse:Status      = lrResponse::StatusCreated
    poResponse:ContentType = lrResponse::ContentTXT
    poResponse:Body        = "Import done"