Dans le monde numérique d’aujourd’hui, une expérience utilisateur fluide et intuitive est la clé du succès de toute application web. Une partie essentielle de cette expérience consiste à fournir aux utilisateurs un accès facile à diverses ressources, qu’il s’agisse de documents, d’images ou d’autres types de données. Pour que cela soit possible, votre serveur doit gérer et fournir différents formats de contenu de manière efficace.
Grâce à la nouvelle fonctionnalité REST du serveur 4D, la gestion de la diffusion de contenus divers est plus facile que jamais. Auparavant, le serveur REST ne pouvait renvoyer que des données scalaires, d’entité ou de sélection d’entité. Désormais, il peut fournir directement un contenu Web complet – un contenu prêt à être traité par un navigateur.
Le téléchargement de fichiers ou la réception de données binaires à partir du serveur REST est désormais simple, grâce à la nouvelle classe OutgoingMessage. Grâce à elle, vous pouvez facilement personnaliser les réponses en fonction de vos besoins.
Lisez la suite pour découvrir comment la classe OutgoingMessage peut améliorer votre application !
Appeler une fonction exposée sur le serveur REST
Rappel rapide : Les fonctions du modèle de données ORDA et les fonctions singleton peuvent être appelées en tant qu’API REST. Pour vous rafraîchir la mémoire, consultez cet article de blog et celui-ci.
Jusqu’à présent, le serveur REST pouvait renvoyer différents types de résultats – échelles, entités ou sélections d’entités – enveloppés dans un objet à l’aide de la propriété result.
Exemple
Voici la fonction getSomeInfo() sur la classe Datastore.
exposed Function getSomeInfo() : Text
return "This is the info"
Voici le résultat obtenu lorsqu’elle est appelée avec la requête /rest/$catalog/getSomeInfo:
{
"result": "This is the info"
}
Les commandes 4D Web ne peuvent pas être utilisées dans de telles fonctions, c’est pourquoi la nouvelle classe OutgoingMessage présente un grand avantage.
La nouvelle classe OutgoingMessage
Le modèle de données ORDA et les fonctions singletons peuvent désormais renvoyer une instance d’objet de cette nouvelle classe. OutgoingMessage de cette nouvelle classe.
De tels objets sont traités directement par n’importe quel navigateur en tant que contenu web.
Ainsi, vous pouvez proposer à vos utilisateurs finaux des fonctionnalités telles que le téléchargement de fichiers et d’images et la réception de n’importe quel type de contenu via un navigateur.
Voici la représentation JSON d’une instance d’objet de la classe OutgoingMessage de la classe
exemple
Dans cet exemple, la fonction getFile() est implémentée dans la classe Datastore. L’objectif est de renvoyer le fichier testFile.pdf en réponse à la demande.
Une instance d’objet de la classe OutgoingMessage est créée.
Le corps contient le contenu binaire du fichier testFile.pdf et un en-tête indiquant que le type de contenu est défini.
exposed onHTTPGet Function getFile() : 4D.OutgoingMessage
var $result:=4D.OutgoingMessage.new()
var $file:=File("/RESOURCES/testFile.pdf")
$result.setBody($file.getContent()) // This is binary content
$result.setHeader("Content-Type"; "application/pdf")
return $result
La classe OutgoingMessage contient trois propriétés à remplir selon vos besoins :
- header: Définit tout en-tête HTTP que le client est tenu de gérer(par exemple, content-type pour indiquer le type du contenu du corps).
- body: définit le contenu que vous souhaitez envoyer en réponse à la demande. Il peut s’agir d’une chaîne ou d’un Blob(par exemple, un fichier, un document ou une image en tant que contenu binaire).
- status: Définir un code d’état HTTP en fonction du résultat de la demande traitée. Cela fournit au client des informations sur le déroulement de la requête (par exemple, le statut 403 si la requête est refusée). La valeur par défaut est 200.
N.B. Les propriétés body et status peuvent être affectées à l’aide de l’opérateur := ou de l’élément correspondant setBody() / setStatus() correspondante.
faciliter l’appel de fonctions sur le serveur de repos
le nouveau mot-clé onHTTPGet pour les fonctions
Jusqu’à présent, les appels de fonctions (de classes de modèle de données ORDA et de singletons) via le serveur REST devaient être effectués avec un verbe POST. Ceci a été fait pour des raisons de sécurité afin d’éviter d’exécuter du code sensible à travers une action aussi simple que de cliquer sur un lien.
Parce que le POST ne correspond pas toujours à l’expérience utilisateur que vous souhaitez offrir, ces fonctions peuvent également être appelées avec un verbe GET , c’est-à-dire qu’elles peuvent être appelées en entrant une URL dans un navigateur.
Utilisez pour cela le mot-clé new onHTTPGet pour ce faire. Si ce mot-clé est appliqué à une fonction, cette fonction peut également être appelée avec un verbe GET !
exemple
exposed onHTTPGet Function getSomeInfo() : 4D.OutgoingMessage
N.B. Ce type d’appel étant une action facilement offerte, le développeur doit s’assurer qu’aucune action sensible n’est effectuée dans de telles fonctions.
passer des paramètres
Les paramètres peuvent être passés à la fonction avec le paramètre $params (ils doivent être inclus dans une collection).
Exemple de fonction
Dans cet exemple, la fonction getThumbnail() de la classe de données Products est appelée (pour obtenir une photo miniature d’un produit donné).
Elle reçoit le nom du produit et les dimensions requises (largeur et longueur).
IP:port/rest/Products/getThumbnail?$params='["Yellow Pack",200,200]'
Consultez la documentation pour plus d’informations sur l’envoi de paramètres lors de l’appel d’une fonction.
Un exemple complet
Voici le cas d’utilisation de cet exemple : un lien est proposé à un utilisateur final pour télécharger le manuel d’utilisation d’un produit sélectionné en plusieurs formats.
La requête derrière le lien est : IP:port/rest/Products/getUserManual?$params='[1, « pdf »]’
L’identifiant du produit sélectionné (1) est transmis en tant que paramètre, ainsi que le format requis (pdf).
La fonction getUserManual() de la classe de données Products est appelée. Elle reçoit en paramètre l’identifiant du produit et le format.
Le document correspondant est récupéré. Son contenu binaire est placé dans le corps de la réponse avec le type de contenu correspondant.
exposed onHTTPGet Function getUserManual($productId : Integer; $type : Text) : 4D.OutgoingMessage
var $file : 4D.File
var $response:=4D.OutgoingMessage.new()
var $doc:="/RESOURCES/User manuals/product_"+String($productId)
Case of
: ($type="pdf")
$file:=File($doc+".pdf")
$response.setBody($file.getContent()) // This is binary content
$response.setHeader("Content-Type"; "application/pdf")
: ($type="jpeg")
$file:=File($doc+".jpeg")
$response.setBody($file.getContent()) // This is binary content
$response.setHeader("Content-Type"; "image/jpeg")
End case
return $response
Voici le scénario joué dans un navigateur :
Essayez vous-même
Téléchargez l’IDH pour découvrir cette nouvelle fonctionnalité et consultez la documentation pour plus de détails sur l’utilisation de la classe OutgoingMessage dans vos applications web.