Interopérabilité et communication entre applications 4D grâce aux Web Services

Chiheb Nasr

Cette note technique s'adresse aux développeurs 4D débutants dans l'utilisation des Services Web et qui ont des besoins d'interopérabilités et de communication entre applications 4D. Nous proposons des méthodes SOAP permettant à une application 4D (Cliente) d'ajouter, supprimer, mettre à jour, ou rechercher des enregistrements dans une autre base 4D distante (Serveur). Ce sont des méthodes alternatives à une solution basée sur le plugin 4D Open ou 4D ODBC. ♪

- Titre : Interopérabilité et communication entre applications 4D grâce aux Web Services

- Auteur : Chiheb Nasr

- Parution : 1 mai 2006

- Licence : Ce document est issu de https://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- Les différentes solutions de communication entre applications 4D

- Choix de la technologie des Web Services

- Les paramétrages du serveur web

- Configuration de la base exemple

- Fonctionnement de la base exemple

- L'application serveur

- SOAP_RECHERCHER

- SOAP_AJOUTER_ENREG

- SOAP_MODIFIER_ENREG

- SOAP_SUPPRIMER_ENREG

- SOAP_SUPPRIMER_SELECTION

- L'application Cliente

- Exemple 1 : Recherche

- Exemple 2 : Recherche

- Exemple 3 : Recherche

- Exemple 4 : Ajouter_Enreg

- Exemple 5 : Modifier_Enreg

- Exemple 6 : supprimer_Enreg

- Exemple 7 : supprimer_Selection

- Quelques méthodes génériques

- Gen_util_QueryBuildLine et Gen_util_QueryDefineValue

- Gen_Gestion_Erreurs

- Gen_TableNom_Vers_TableID

- Conclusion

- Télécharger l'exemple

Les différentes solutions de communication entre applications 4D

Il existe plusieurs solutions pour faire communiquer des bases 4D entre elles en fonction des besoins de chacune des applications. La première consiste à mettre en œuvre une solution d'import-export en utilisant des transferts de fichiers par E-mail ou par FTP.

La deuxième solution repose sur l'utilisation du plugin 4D Open pour 4D. Il s'agit d'un fonctionnement en mode connecté donc seule la connexion à un 4D Server est possible. Chaque connexion se comporte comme une connexion d'un 4D Client et utilise ainsi une licence 4D Client.

Une autre solution consiste à concevoir des méthodes SOAP appelées aussi Web Services à laquelle on passe les paramètres adéquats et on récupère un éventuel résultat. Un serveur SOAP permet de recevoir des paramètres et de retourner des résultats à un client SOAP. Avec cette solution, l'exécution de code s'effectue côté serveur, contrairement à l'implémentation avec 4D Open. L'avantage majeur de cette solution est de ne pas avoir à dialoguer uniquement avec un 4D Server mais à tout autre moteur 4D ayant son serveur Web actif. La seule contrainte de cette solution c'est qu'elle nécessite une licence 4D Web Services pour l'application serveur des Web Services.

En revanche, la solution 4D Open pour 4D présente l'avantage de disposer d'un contexte sur le serveur, dans lequel une connexion reste active, et conserve ainsi une sélection courante, un enregistrement courant et des variables. En revanche, avec une requête SOAP une fois que le serveur a renvoyé sa réponse, le contexte est perdu.

Choix de la technologie des Web Services

Les services Web fournissent un lien entre applications, services et machines. Des applications utilisant des technologies différentes peuvent ainsi envoyer et recevoir des données au travers d'un protocole compréhensible par tout le monde. Les services Web sont normalisés, car ils utilisent XML et HTTP pour transférer des données et ils sont compatibles avec de nombreux autres environnements de développement. Ils sont donc indépendants de plateforme. Ils peuvent être publiés et utilisés depuis n'importe quelle plateforme. L'information qui est envoyée et reçue par l'application est structurée et transmise sous forme de document XML. Les services web représentent donc la façon la plus efficace de partager des méthodes et des fonctionnalités. De plus, ils réduisent le temps de réalisation en permettant de tirer directement parti de services existants.

Les méthodes publiées comme Services Web présentent beaucoup de souplesse et flexibilité dans leur retour d'arguments. En effet, 4D propose deux manières de spécifier les données retournées par une réponse SOAP. D'abord, les variables et tableaux peuvent être liés aux paramètres de sortie en utilisant la commande DECLARATION SOAP. Un nombre indéfini de valeurs peuvent être incluses dans la requête ou une réponse SOAP bien sûr dans la limite des ressources disponibles. Ensuite, le paramètre $0 de n'importe quelle méthode offerte comme Web service peut être inclus automatiquement comme sortie. Dans ce dernier cas, aucune programmation spécifique n'est nécessaire.

Dans cette note technique, nous vous proposons des méthodes alternatives très simples qui reproduisent les fonctionnalités les plus basiques de 4D Open pour 4D au travers du protocole SOAP qui sont l'ajout, la modification, la suppression et la recherche des enregistrements dans une base 4D distante. Le client envoie les informations nécessaires pour exécuter une action particulière et le serveur, après avoir traité l'action demandée, retourne un code d'erreur  (un code égal à 0 si l'opération s'est bien déroulée ou un code d'erreur différent de 0 en cas de problème) et éventuellement des résultats. Tous ces aspects seront détaillés plus tard dans la partie consacrée à la base exemple.

Les paramétrages du serveur web

Afin de publier des méthodes comme Services Web, il faut d'abord que le serveur Web de l'application serveur soit démarré et accessible. L'application 4D cliente n'a pas besoin d'avoir un serveur web actif. Ensuite, la préférence suivante de la base de données doit être activée  (Préférences -> Web ->Web Services -> Autoriser requêtes Web Services). Enfin, la propriété de méthode suivante doit être activée pour chaque méthode publiée  (Propriétés de la méthode -> Offert comme Web Service).

Configuration de la base exemple

Pour avoir un environnement de déploiement de Service Web typique et par souci de clarté, les méthodes Client et les méthodes de Service web sont fournies dans deux bases distinctes accompagnant cette note : « Serveur » et « Client ». Les méthodes Clientes sont exécutées dans une copie de 4D ou 4D Server et les méthodes de Service Web dans une autre copie (également 4D ou 4D Server).

La base « Serveur » est configurée par défaut pour écouter les requêtes Web ainsi que les requêtes Web service sur le port 8080. Vous pouvez fixer ce numéro de port sur n'importe quel port disponible et autorisé par votre OS.

Les méthodes proxy SOAP de l'application cliente « Client ». précisent directement l'URL d'appel du Web service par l'intermédiaire de la variable <>SoapURL. Dans le cas de cet exemple, les méthodes font des appels à la machine en local c'est-à-dire à l'adresse http://127.0.0.1/. Pour indiquer aux méthodes Clientes d'utiliser une adresse différente de serveur, il suffit de modifier la méthode projet PROXY_INITIALISATION et de mettre l'adresse IP de la machine hébergeant l'application serveur. En pratique, l'URL du serveur SOAP pourrait être stockée dans un enregistrement ou une ressource de la base afin de faciliter la maintenance.

Fonctionnement de la base exemple

La base exemple contient une série de méthodes simples illustrant la manière d'exécuter une action sur l'application serveur distante ainsi que la façon de recevoir le code d'erreur retournée et des résultats éventuels. Tous les services Web sont fournis avec leurs méthodes SOAP clientes dites aussi méthodes proxy. Ces méthodes proxy sont des méthodes génériques qui vous faciliteront l'appel des services Web. Le tableau suivant présente la liste des noms de méthodes de Service Web qui exécutent une action et retournent des données et les noms des méthodes proxy correspondantes qui récupèrent ces données.

Méthode de Service Web

Méthode de Client proxy

Action

SOAP_AJOUTER_ENREG

PROXY_AJOUTER_ENREG

Ajouter d'un enregistrement

SOAP_MODIFIER_ENREG

PROXY_MODIFIER_ENREG

Modifier un enregistrement

SOAP_SUPPRIMER_ENREG

PROXY_SUPPRIMER_ENREG

Chercher et supprimer un enregistrement

SOAP_SUPPRIMER_SELECTION

PROXY_SUPPRIMER_SELECTION

Chercher et supprimer une sélection d'enregistrements

SOAP_RECHERCHER

PROXY_RECHERCHER

Chercher et récupération de la sélection résultante

L'application serveur

L'application serveur contient une seule table et dispose d'un jeu de données indispensable pour le bon déroulement du scénario des exemples, détaillé plus bas. Ce jeu de données est constitué de 5 enregistrements créés à l'ouverture de la base par la méthode projet CREATION_5_Enregistrements.

Si vous voulez recommencer le scénario, vous devez réinitialiser ce jeu de données, et ceci en lançant de nouveau cette méthode projet en mode Utilisation ou bien en redémarrant l'application. La table 4D utilisée dans ce scénario contient tous les types de champs disponibles dans 4D, comme le montre la copie d'écran ci-dessous.

Voici la liste de tous les services Web disponibles dans cette application serveur :

SOAP_RECHERCHER

Cette méthode reçoit 2 paramètres :
· Le nom de la table cible ;
· Un Blob contenant les critères de recherche.

Ce service Web effectue la recherche demandée et renvoie 3 informations :
· Le nombre d'enregistrements trouvés ;
· Un Blob contenant la sélection des enregistrements sous forme d'un ensemble de tableaux correspondant à la sélection trouvée ;
· Un code d'erreur.

SOAP_AJOUTER_ENREG

Cette méthode reçoit 2 paramètres :
· le nom de la table cible ;
· un Blob dans lequel est stocké le contenu du nouvel enregistrement.

Ce service Web ajoute un enregistrement dans la table cible et renvoie une information :
· un code d'erreur.

SOAP_MODIFIER_ENREG

Cette méthode reçoit 3 paramètres :
· le nom de la table cible ;
· un Blob dans lequel est stocké le nouveau contenu de l'enregistrement à modifier ;
· un Blob contenant les critères de recherche de l'enregistrement.

Ce service Web recherche l'enregistrement cible et le modifie puis renvoie une information :
· un code d'erreur.

SOAP_SUPPRIMER_ENREG

Cette méthode attend 2 paramètres :
· le nom de la table cible ;
· un Blob contenant les critères de recherche de l'enregistrement à supprimer.

Ce service Web recherche l'enregistrement cible et le supprime puis renvoie une information :
· un code d'erreur

SOAP_SUPPRIMER_SELECTION

Cette méthode attend 2 paramètres :
· le nom de la table cible ;
· un Blob contenant les critères de recherche de la sélection à supprimer.

Ce service Web recherche les enregistrements cibles et les supprime puis renvoie une information :
· un code d'erreur : ce service renvoie une erreur si l'opération n'a pas pu être réalisée ou bien, lorsqu'après la suppression, l'ensemble « LockedSet » n'est pas vide.

L'application Cliente

L'objectif de l'interface proposée dans la base 4D Cliente est d'illustrer les principes utilisés pour faire communiquer deux bases 4D via les Services Web. À l'ouverture de la base cliente, un dialogue constitué de sept pages est affiché. Chaque page correspondant à un seul exemple. Les sept exemples constituent un scénario complet de test et doivent donc être exécutés dans l'ordre. Des explications techniques des exemples sont rapportées sur leur page respective du formulaire.

Voici la liste de tous les exemples disponibles dans l'application cliente...

Exemple 1 : Recherche

Dans cet exemple, on exécute une recherche équivalente à la ligne de code suivante :

code 4D

CHERCHER([Table 1];[Table 1]Champ_Entier>2)

Le résultat de cette recherche est une sélection de 3 Enregistrements qui sera affichée dans une liste box en bas de la page du formulaire.

Exemple 2 : Recherche

Dans cet exemple, on exécute une recherche équivalente à la ligne de code suivante:

code 4D

CHERCHER([Table 1];[Table 1]Champ_Entier>=2;*)
CHERCHER([Table 1]; & ;[Table 1]Champ_Date>20/7/2006)

Le résultat de cette recherche est une sélection de 2 enregistrements qui sera affichée dans une liste box en bas de la page du formulaire.

Exemple 3 : Recherche

Dans cet exemple, on exécute une recherche équivalente à la ligne de code suivante :

code 4D

CHERCHER([Table 1];[Table 1]Champ_Booleen=Vrai;*)
CHERCHER([Table 1]; | ;[Table 1]Champ_Heure<=?02:00:00?)

Le résultat de cette recherche est une sélection de 4 enregistrements qui sera affichée dans une liste box en bas de la page du formulaire.

Exemple 4 : Ajouter_Enreg

Cet exemple ajoute un enregistrement dans la table [Table 1] dont le contenu est renseigné par le code suivant :

code 4D

[Table 1]Champ_Alpha80_ID:="W"*80
[Table 1]Champ_Texte:=512*"W"
[Table 1]Champ_Numerique:=88888
[Table 1]Champ_Entier:=-20
[Table 1]Champ_EntierLong:=1000000
[Table 1]Champ_Date:=Date du jour
[Table 1]Champ_Heure:=Heure courante
[Table 1]Champ_Booleen:=Vrai
LIRE IMAGE DANS BIBLIOTHEQUE(2026;[Table 1]Champ_Image)
FIXER TAILLE BLOB([Table 1]Champ_Blob;1024;Code ascii("W"))

Après exécution de l'exemple, vous pouvez vérifier que l'enregistrement a bien été ajouté dans l'application serveur.

Exemple 5 : Modifier_Enreg

Cet exemple modifie l' enregistrement qu'on vient d'ajouter dans l'exemple précédent. L'ancien contenu est remplacé via le code 4D suivant :

code 4D

[Table 1]Champ_Alpha80_ID:="Q"*80
[Table 1]Champ_Texte:=512*"Q"
[Table 1]Champ_Numerique:=-5
[Table 1]Champ_Entier:=-99
[Table 1]Champ_EntierLong:=-3
[Table 1]Champ_Date:=!10/10/10!
[Table 1]Champ_Heure:=?20:20:20?
[Table 1]Champ_Booleen:=Vrai
LIRE IMAGE DANS BIBLIOTHEQUE(2025;[Table 1]Champ_Image)
FIXER TAILLE BLOB([Table 1]Champ_Blob;68;Code ascii("Q"))

Après exécution de cet exemple, vous pouvez vérifier que l'enregistrement a bien été modifié dans l'application serveur.

Exemple 6 : supprimer_Enreg

Dans cet exemple, on supprime l' enregistrement qu'on vient d'ajouter et de modifier dans les deux exemples précédents. L'action exécutée est équivalente au code 4D suivant :

code 4D

CHERCHER([Table 1];[Table 1]Champ_EntierLong=-3)
SUPPRIMER ENREGISTREMENT([Table 1])

Après exécution de cet exemple, notez que l'enregistrement a bien été supprimé dans l'application serveur.

Exemple 7 : supprimer_Selection

Cet exemple supprime 4 enregistrements sur 5 de la table [Table 1]. Ici on exécute l'équivalent du code suivant :

code 4D

CHERCHER([Table 1];[Table 1]Champ_Numerique<=10,04)
SUPPRIMER SELECTION([Table 1])

Après exécution de cet exemple, une sélection de 4 enregistrements sera supprimée. Notez qu'il ne reste qu'un seul enregistrement dans la table [Table 1] de l'application serveur.

Quelques méthodes génériques

Voici quelques méthodes génériques que vous trouverez également dans la base cliente...

Gen_util_QueryBuildLine et Gen_util_QueryDefineValue

Ces deux méthodes génériques de recherche ont été extraites de la note technique 4D-200405-15-FR de Jean-Yves FOCK-HOON. Elles permettent d'effectuer tous types de recherche, quels que soit l'opérateur utilisé et le nombre de lignes qui composent les critères de recherche. Toutefois, nous y avons apporté quelques corrections.

L'algorithme de recherche mis en œuvre par ces méthodes attend quatre paramètres de type tableaux :

1 - TABLEAU ENTIER LONG : WS_4D_ChampIDs, ce paramètre contient les ID des champs sur lesquels porte la recherche ;

2 - TABLEAU ENTIER LONG : WS_4D_Operateurs, ce tableau renseigne sur les opérateurs de comparaison (=, #, >, >=, < et <= ) à utiliser ;

Voici le tableau de correspondance entre ces opérateurs et les entiers long à insérer dans le tableau :

Opérateur

Valeur correspondante

=

1

#

2

>

3

>=

4

<

5

<=

6

3 - TABLEAU TEXTE LONG : WS_4D_Valeurs : ce tableau contient les valeurs recherchées des champs ;

4 - TABLEAU TEXTE LONG : WS_4D_Combinaison : ce tableau renseigne sur les combinaisons (ET/OU) à utiliser entre les lignes composant la clause de la recherche Voici un tableau de correspondance entre les combinaisons à utiliser et les entiers longs à insérer dans le tableau :

Combinaison

Valeur correspondante

ET

1

OU

2

Gen_Gestion_Erreurs

Cette méthode associe un texte à un code d'erreur. Elle reçoit un code d'erreur en paramètre d'entrée et modifie la valeur de la variable texte <>_texte_erreur qui sera affichée dans chaque page du formulaire à la fin de l'exécution de chaque exemple.

Gen_TableNom_Vers_TableID

Cette méthode reçoit le nom d'une table 4D en paramètre d'entrée et retourne son numéro. Elle gère le nom des tables aussi bien avec que sans crochets (« [Table 1] » ou « Table 1 »).

Conclusion

Les communications entre applications sont souvent des accès aux données, vous trouverez ici des méthodes 4D basées sur les services web permettant à des différentes applications 4D de communiquer entre elles. Toutefois, chaque environnement possède ses propres spécificités et ces méthodes pourront être ajustées aux différents contraintes ou contextes, notamment dans des environnements existants auxquels il faudra bien sûr s'adapter.

Télécharger l'exemple

Télécharger la base exemple.