Aller au contenu principal
Version: 20 R9 BETA

IncomingMessage

La classe 4D.IncomingMessage vous permet de gérer l'objet reçu par un HTTP request handler personnalisé. Les requêtes HTTP et leurs propriétés sont automatiquement reçues en tant qu'instance de la classe 4D.IncomingMessage. Les paramètres fournis directement dans la requête avec le verbe GET sont gérés par la propriété .urlQuery, tandis que les paramètres passés dans le corps de la requête sont disponibles via des fonctions telles que .getBlob() ou getText().

Le gestionnaire de requêtes HTTP peut renvoyer n'importe quelle valeur (ou rien). Il renvoie généralement une instance de la classe 4D.OutgoingMessage.

Toutes les propriétés de cette classe sont en lecture seule. Elles sont automatiquement remplies par le request handler.

Historique
ReleaseModifications
20 R8Classe ajoutée

Exemple

Le fichier HTTPHandlers.json suivant a été défini :

[
{
"class": "GeneralHandling",
"method": "gettingStarted",
"pattern": "start",
"verbs": "get, post"
}
]

La requête http://127.0.0.1/start/example?param=demo&name=4D est exécutée avec un verbe GET dans un navigateur. Elle est gérée par la fonction gettingStarted de la classe singleton GeneralHandling suivante :

shared singleton Class constructor()

Function gettingStarted($request : 4D.IncomingMessage) : 4D.OutgoingMessage

var $result:=4D.OutgoingMessage.new()
var $body : Text

$body:="Called URL: "+$request.url+"\n"

$body+="The parameters are received as an object: \n"+JSON Stringify($request.urlQuery; *)+"\n"

$body+="The verb is: "+$request.verb+"\n"

$body+="There are "+String($request.urlPath.length)+" url parts - Url parts are: "\
+$request.urlPath.join(" - ")+"\n\n"


$result.setBody($body)
$result.setHeader("Content-Type"; "text/plain")

return $result

La requête est reçue sur le serveur en tant que $request, une instance d'objet de la classe 4D.IncomingMessage.

Voici la réponse :

Called URL: /start/example? param=demo&name=4D 
The parameters are received as an object:
{
"param": "demo",
"name": "4D"
}
The verb is: GET
There are 2 url parts - Url parts are: start - example

Objet IncomingMessage

Les objets 4D.IncomingMessage offrent les propriétés et fonctions suivantes :

.getBlob() : Blob
renvoie le body de la requête sous forme de Blob
.getHeader( key : Text ) : Text
renvoie la valeur de l'en-tête key
.getJSON() : Variant
renvoie le body de la requête sous forme de résolution JSON
.getPicture() : Picture
renvoie le body de la requête sous forme d'image (dans le cas d'un body envoyé en tant qu'image)
.getText() : Text
renvoie le body de la requête sous forme de texte
headers : Object
les headers courants du message entrant sous forme de paires clé/valeur (chaînes)
url : Text
l'URL de la requête sans la partie IP:port et sous forme de chaîne
urlPath : Collection
l'URL de la requête sans la partie IP:port et sous la forme d'une collection de chaînes
urlQuery : Object
les paramètres de la requête lorsqu'ils ont été passés dans l'URL sous forme de paires clé/valeur
verb : Text
le verbe utilisé par la requête
note

Un objet 4D.IncomingMessage est non partageable.

.getBlob()

.getBlob() : Blob

ParamètresTypeDescription
RésultatBlob<-Body de la requête en tant que Blob

Description

La fonction .getBlob() renvoie le body de la requête sous forme de Blob.

Si le body n'a pas été fourni sous forme de contenu binaire, la fonction tente de convertir la valeur, mais elle peut donner des résultats inattendus.

.getHeader()

.getHeader( key : Text ) : Text

ParamètresTypeDescription
keyText->Propriété de header (en-tête) à obtenir
RésultatText<-Valeur de la propriété de header

Description

La fonction .getHeader() renvoie la valeur de l'en-tête key.

note

Le paramètre key n'est pas sensible à la casse.

Exemple

var $value : Texte
var $request : 4D.IncomingMessage
$value := $request.getHeader("content-type")

.getJSON()

.getJSON() : Variant

ParamètresTypeDescription
RésultatVariant<-Résolution JSON du body de la requête

Description

La fonction .getJSON() renvoie le body de la requête sous forme de résolution JSON.

Si le body n'a pas été fourni sous la forme d'un contenu JSON valide, une erreur est générée.

.getPicture()

.getPicture() : Picture

ParamètresTypeDescription
RésultatPicture<-Body de la requête en tant qu'image

Description

La fonction .getPicture() renvoie le body de la requête sous forme d'image (dans le cas d'un body envoyé en tant qu'image).

Le content-type doit être fourni dans les headers pour indiquer que le body est une image.

note

Si la requête est construite en utilisant la classe HTTPRequest, l'image doit être envoyée dans le body sous forme de Blob avec le content-type approprié.

Si le body n'est pas reçu comme une image valide, la fonction renvoie null.

.getText()

.getText() : Text

ParamètresTypeDescription
RésultatText<-Body de la requête en tant que texte

Description

La fonction .getText() renvoie le body de la requête sous forme de texte.

Si le body n'a pas été fourni sous forme de chaine, la fonction tente de convertir la valeur, mais elle peut donner des résultats inattendus.

.headers

headers : Object

Description

La propriété .headers contient les headers courants du message entrant sous forme de paires clé/valeur (chaînes).

La propriété .headers est en lecture seule.

Les noms des en-têtes (clés) sont en minuscules. Les noms des headers sont sensibles à la casse.

.url

url : Text

Description

La propriété .url contient l'URL de la requête sans la partie IP:port et sous forme de chaîne.

Par exemple, si la requête est adressée à: "http://127.0.0.1:80/docs/invoices/today", la propriété .url est "/docs/invoices/today".

La propriété .url est en lecture seule.

note

La partie "host" de la requête (IP:port) est fournie par le header host.

.urlPath

urlPath : Collection

Description

La propriété .urlPath contient l'URL de la requête sans la partie IP:port et sous la forme d'une collection de chaînes.

Par exemple, si la requête est adressée à: "http://127.0.0.1:80/docs/invoices/today", la propriété .urlPath est ["docs", "invoices" ,"today"].

La propriété .urlPath est en lecture seule.

.urlQuery

urlQuery : Object

Description

La propriété .urlQuery contient les paramètres de la requête lorsqu'ils ont été passés dans l'URL sous forme de paires clé/valeur.

La propriété .urlQuery est en lecture seule.

Les paramètres peuvent être passés dans l'URL des requêtes directement ou en tant que contenu JSON.

Paramètres directs

Exemple : http://127.0.0.1:8044/myCall?firstname=Marie&id=2&isWoman=true

Dans ce cas, les paramètres sont reçus sous forme de valeurs "stringifiées" dans la propriété urlQuery : urlQuery = {"firstname" : "Marie" , "id" : "2" , "isWoman" : "true"}

Paramètres contenu JSON

Exemple : http://127.0.0.1:8044/myCall/?myparams='[{"firstname" : "Marie", "isWoman" : true, "id" : 3}]'.

Les paramètres sont passés au format JSON et sont inclus dans une collection.

Dans ce cas, les paramètres sont reçus sous forme de texte JSON dans la propriété urlQuery et peuvent être analysés à l'aide de JSON Parse.

//urlQuery.myparams: "[{"firstname": "Marie","isWoman": true,"id": 3}]"
$test:=Value type(JSON Parse($r.urlQuery.myparams))=Is collection) //true

Les caractères spéciaux tels que les guillemets simples ou les retours à la ligne doivent être échappés.

Exemple : http://127.0.0.1:8044/syntax/?mdcode=%60%60%604d

//urlQuery.mdcode = ```4d
$test:=Length($r.urlQuery.mdcode) //5
note

Les paramètres fournis dans le body de la requête à l'aide des verbes POST ou PUT sont traités par des fonctions dédiées : getText(), getPicture(), getBlob(), getJSON().

.verb

verb : Text

Description

La propriété .verb contient le verbe utilisé par la requête.

Les verbes de requête HTTP et HTTPS incluent par exemple "get", "post", "put", etc.

La propriété .verb est en lecture seule.