Developpez.com - 4D
X

Choisissez d'abord la catégorieensuite la rubrique :


L'implémentation de l'API d'interrogation UDDI dans 4D - Partie 2

Date de publication : Juin 2003

Par Julien Feasson (4D Inc.)
 

Cette note technique est la deuxième d'une série de deux, ayant pour objectif la réalisation d'un client UDDI mettant à l'oeuvre les fonctionnalités de client de service Web natives dans 4D 2003.

I. Le panneau des préférences
II. L'assistant de recherche UDDI
III. Le code
IV. L'API find_tModel
V. L'API get_tModelDetails
VI. Utilisation de la démo
VII. Base exemple

info Note :
les API référencées ci-dessous sont en fait les méthodes de la base de donnée jointe à cette note technique.

I. Le panneau des préférences

Le premier composant de cette réalisation est un panneau des préférences assez simple. Il liste les serveurs UDDI vers lesquels le client peut effectuer des requêtes. Depuis les méthodes base "Sur ouverture" et "Sur fermeture", cette liste est soit chargée automatiquement si la base est lancée pour la première fois ou enregistrée dans les ressources de la base afin de réutiliser la liste d'une session à l'autre. Le client UDDI enverra une requête à chacun des serveurs présents dans cette liste.

Jusque là rien de spécial...


II. L'assistant de recherche UDDI

L'assistant de recherche implémente une partie des commandes proposées dans les APIs d'interrogation. Il permet à l'utilisateur d'effectuer une recherche par mots-clés sur les noms des services Web enregistrés dans les registres UDDI des serveurs listés dans le panneau des préférences.

L'assistant peut se décomposer en trois sections :
  • le mot-clé et les paramètres avancés de la recherche
  • la liste et la documentation des services webs candidats retournés par la recherche sur les serveurs UDDI
  • les détails sur le service Web sélectionné dans la liste des services Web trouvés.
La section avancée n'a pas encore été réalisée. Elle donne simplement une idée du genre d'interface utilisateur qui pourrait être proposée afin de tirer parti des paramètres offerts par les APIs d'interrogation UDDI.

La fonctionnalité active est la recherche par mot-clé et nous allons étudier sa réalisation à l'aide des possibilités de 4D en tant que client de service Web.


III. Le code

Lorsque l'utilisateur après avoir saisi un mot-clé dans le champ correspondant sélectionne le bouton 'Recherche', des requêtes SOAP sont envoyées sur le réseau TCP/IP afin de rechercher le mot-clé. Le nombre de requêtes SOAP dépend du nombre de serveurs UDDI paramétrés dans la liste, à raison de deux requêtes SOAP par serveur UDDI.


IV. L'API find_tModel

Un ordre de recherche basé sur le mot-clé est envoyé en utilisant les APIs find_xx. Il reçoit comme réponse une liste d'uuids. Ces derniers sont des ids de structure tModels dont le nom correspond ou contient le mot-clé recherché. L'assistant enregistre alors cette liste d'uuids dans un tableau.

Regardons de plus près la méthode UDDI_search. Elle construit la requête SOAP, l'envoie au serveur UDDI, reçoit et analyse la réponse XML.

Le serveur SOAP UDDI fonctionnant en style document, la requête doit être construite manuellement et la réponse reçue analysée de même.


La première étape prépare la requête :

      myxml:="<find_tModel xmlns\"urn:uddi-org:API\" generic=\"1.0\">"
      myxml:= myxml+"<name>"
      myxml:= myxml+$1
      myxml:= myxml+"</name>"
      myxml:= myxml+"</find_tModel>"
      TEXTE VERS BLOB(myxml;myblob;Texte sans longueur)


$1 contient le mot-clé sous forme de texte et s'insère dans un modèle pré-codé. Le texte est ensuite converti en BLOB de manière à pouvoir être passé comme argument à FIXER PARAMETRE SERVICE WEB tandis que APPELER WEB SERVICE l'incluera dans la structure xml qui sera envoyée en tant que requête SOAP au serveur UDDI :

      FIXER PARAMETRE WEB SERVICE("BlobAsXMLIn";myblob)
      APPELER WEB SERVICE(<>UDDI_vServerList{$2};"as";"as";"as";Web Service manuel)


La partie suivante de la méthode n'est là que pour afficher et mettre à jour le thermomètre de progression.

      <>UDDI_vThermometer:=35
      <>UDDI_vStatus:="En cours de réception et d'analyse"
      APPELER PROCESS(UDDI_VPN)


Nous allons ensuite recevoir une réponse du serveur en style document. Elle contiendra une structure XML brute correspondant au premier élément de l'élément <body> de la réponse SOAP si aucune faute SOAP n'a été remontée :

      Si (OK=1)
         LIRE RESULTAT WEB SERVICE($theblob;"BlobAsXMLOut";*)
      Fin de si


La fin de la méthode se charge tout particulièrement du Blob XML afin d'y retrouver l'information intéressante (les uuids) et de les enregistrer dans un tableau :

      $i:=UDDI_FollowUp
      $myroot:=Analyser variable XML($theblob)
      $myelement:=Lire premier element XML($myroot)
      $myelement:=Lire premier element XML($myelement)
      Si (OK=1)
         INSERER LIGNES(<>arrayuuid;Taille tableau(<>arrayuuid)+1;1)
         INSERER LIGNES(<>arrayname;Taille tableau(<>arrayname)+1;1)
         $i:=UDDI_FollowUp
         Repeter
            LIRE ATTRIBUT XML PAR NOM ($myelement;"tModelKey";<>arrayuuid{$i})
            $mychild:=Lire premier element XML ($myelement;$name;<>arrayname{$i})
            $myelement:=Lire element XML suivant ($myelement)
            Si (OK=1)
               INSERER LIGNES (<>arrayuuid;Taille tableau(<>arrayuuid)+1;1)
               INSERER LIGNES (<>arrayname;Taille tableau(<>arrayname)+1;1)
               $i:=$i+1
            Fin de si
         Jusque (OK=0)
      Fin de si


A l'aide des commandes de navigation XML intégrées à 4D, la méthode créé un arbre DOM par l'appel à la commande Analyser variable XML.


Une réponse XML retournée par un serveur UDDI peut être du type :
<tModelList generic='1.0' xmlns='urn:uddi-org:API' operator='XMethods'>
  <tModelInfos>
  <tModelInfo tModelKey='uuid:B89C49D5-CAB7-697E-BC18-AC129D170E99'>
     <name>zipCodeService</name>
  </tModelInfo>
  <tModelInfo tModelKey='uuid:CCD10262-9509-4B67-D619-C68D18265432>
     <name>zip 2 Geo</name>
  </tModelInfo>
</tModelList>

Les deux premiers appels à Lire premier element XML sur $myroot et $myelement permettent de sauter les deux premiers éléments. Il serait préférable de vérifier les noms des éléments, mais cette approche nous permet d'atteindre plus vite le coeur des données. Il suffit alors d'une boucle Repeter pour extraire les uuids et les noms de tous les éléments tModels retournés. Une fois les données extraites, elles sont insérées dans les tableaux <>arrayuuid et <>arrayname.

Lors de l'analyse de la réponse du serveur, avant qu'une autre requête SOAP ne soit envoyée au prochain serveur de la liste, il est nécessaire de connaître les détails du tModel en se référant aux uuids que nous venons de « mettre en cache » dans des tableaux.


V. L'API get_tModelDetails

Une autre méthode envoie donc une deuxième requête SOAP au serveur UDDI en utilisant les deuxièmes APIs d'interrogation : get_xx. Elle demande des détails au serveur concernant les tModels référencées par les uuids listés dans les deux tableaux construits dans le paragraphe précédent. S'agissant une nouvelle fois d'une requête SOAP de style document, nous devons la préparer par programmation :

      myxml:="<get_tModelDetail xmlns=\"urn:uddi-org:API\" generic=\"1.0\">"
      Boucle ($u;UDDI_FollowUp;Taille tableau(<>arrayname))
         myxml:=myxml+"<tModelKey>"+<>arrayuuid{$u}+"</tModelKey>"
      Fin de boucle
      myxml:=myxml+"</get_tModelDetail>"
      TEXTE VERS BLOB(myxml;myblob;Texte sans longueur)


Les références uuid sont incluses dans un template XML codé en dur. Puis la structure XML est convertie en BLOB avant d'être passée comme paramètre à la commande FIXER PARAMETRE WEB SERVICE afin d'être incorporée dans le requête émise par APPELER WEB SERVICE.

      FIXER PARAMETRE WEB SERVICE("BlobAsXMLIn";myblob)
      APPELER WEB SERVICE(<>UDDI_vServerList{$1};"as";"as";"as";Web Service manuel)


La suite ne sert qu'à afficher et mettre à jour le thermomètre de progression.

      <>UDDI_vThermometer:=55
      <>UDDI_vStatus:="Analyse des informations recues"
      APPELER PROCESS(UDDI_VPN)


Puis, si aucune faute SOAP n'a été remontée, nous récupérons la réponse du serveur :

      Si (OK=1)
         LIRE RESULTAT WEB SERVICE($theblob;"BlobAsXMLOut";*)
      Fin de si


La structure XML reçue est à analyser. Nous sommes seulement intéressés par 9 des propriétés de chaque tModel, que nous rangerons dans un tableau 2D :

      TABLEAU TEXTE(<>arrayresult;0;9)


Ci-dessous un exemple de réponse d'un serveur UDDI :
<tModelDetail generic="1.0" operator="XMethods" xmlns="urn:uddi-org:api">
   <tModel operator="XMethods" tModelKey="uuid:B89C49D5-CAB7-697E-BC18-
      <AC129D170E99">
      <name>zipCodeService</name>
      <description>SHORT DESCRIPTION: Find distance between two zip codes,
         Find all zip codes in the given distance</description>
      <description>DETAILED DESCRIPTION: findZipCordinates - returns latitude
         and longitude for a given zip code findZipCodeDistance - find the
         distance between two zip codes getCodeSet - finds a set of zipcode
         within given distance from the specified zip code findZipDetails -
         experimental! If you like it - have a look at
         www.controtex.com/drinkware.htm</description>
      <description>USAGE NOTES:</description>
      <description>HOMEPAGE URL: http://www.controtex.com</description>
      <overviewDoc>
         <description>wsdl link</description>
         <overviewURL>http://www.discoverdance.co.uk/zipQuery/zipCodeService.asm
          x?wsdl#zipCodeServiceSoap</overviewURL>
      </overviewDoc>
      <categoryBag>
         <keyedReference keyName="uddi-org:types" keyValue="wsdlSpec"
            tModelKey="uuid:C1ACF26D-9672-4404-9D70-39B756E62AB4" />
      </categoryBag>
   </tModel>

   ...

</tModelDetail>


La ligne suivante permet de construire l'arbre DOM en mémoire :

   $myroot:=Analyser variable XML($theblob)


La ligne d'après ne participe pas à l'analyse, mais sert à l'affichage du thermomètre afin d'offrir une progression linéaire.

   $div:=Compter elements XML($myroot;"tModel")


La phase d'analyse consiste en une boucle de récupération de chaque élément tModel. Pour chacun d'entre eux, les données sont traitées afin d'être extraites et rangées dans le tableau 2D. Certaines informations figurent dans la structure XML en tant que valeur d'élément tandis que d'autres sont présentes en tant qu'attributs.


D'abord, nous extrayons les trois attributs de l'élément tModel : le nom autorisé, l'opérateur et le tModelKey :

      `AuthorizedName
   LIRE ATTRIBUT XML PAR NOM($myelement;"authorizedName";$titi)
   <>arrayresult{$i}{1}:=$titi
      `Operator
   LIRE ATTRIBUT XML PAR NOM($myelement;"operator";$titi)
   <>arrayresult{$i}{2}:=-$titi
      `tModelKey
   LIRE ATTRIBUT XML PAR NOM($myelement;"tModelKey";$titi)
   <>arrayresult{$i}{3}:=$titi


Comme en XML l'ordre des éléments n'est pas déterminé, une structure Au cas ou est utilisée au sein d'une structure de boucle "Repeter...jusque" afin de récupérer tous les éléments enfants de tModel et de les filtrer suivant leur nom pour les ranger à leur place dans le tableau 2D :

      $mychild:=Lire premier element XML($myelement;$name;$titi)
      Repeter
         Au cas ou
            : ($name="name")
               <>arrayresult{$i}{4}:=$titi
               $mychild:=Lire element XML suivant($mychild;$name;$titi)
            : ($name="description")
               <>arrayresult{$i}{7}:=<>arrayresult{$i}{7}+Caractere(13)+$titi
               $mychild:=Lire element XML suivant($mychild;$name;$titi)
            : ($name="overviewDoc")
               $mysecondchild:=Lire premier element XML($mychild;$name;$titi)
            Repeter
               Au cas ou
                  : ($name="description")
                     <>arrayresult{$i}{7}:=<>arrayresult{$i}{7}+$titi+Caractere(13)
                  : ($name="overviewURL")
                     <>arrayresult{$i}{6}:=$titi
               Fin de cas
               $mysecondchild:=Lire element XML suivant ($mysecondchild;$name;$titi)
            Jusque (OK=0)
            $mychild:=Lire element XML suivant($mychild;$name;$titi)
            : ($name="identifierBag")
               Lire premier element XML($mychild;$name;$titi)
               <>arrayresult{$i}{8}:=$titi
               $mychild:=Lire element XML suivant($mychild;$name;$titi)
            : ($name="categoryBag")
               Lire premier element XML($mychild;$name;$titi)
               <>arrayresult{$i}{9}:=$titi
               $mychild:=Lire element XML suivant($mychild;$name;$titi)
         Fin de cas
      Jusque (OK=0)


Les quelques lignes suivantes ont pour effet de se déplacer jusqu'au prochain élément tModel, puis de recommencer la boucle de traitement ou de sortir si aucun autre tModel n'est disponible :

      $myelement:=Lire element XML suivant($myelement)
      Si (OK=1)
         INSERER LIGNES(<>arrayresult;Taille tableau(<>arrayresult)+1;1)
         $i:=$i+1
     Fin de si


Ces deux opérations find_tModel et get_tModelDetails sont réitérées sur l'ensemble des serveurs UDDI listés dans le panneau des préférences.

Lorsque le tableau 2D <>arrayresult est rempli, le résultat de la recherche est prêt pour l'affichage dans la fenêtre de l'assistant UDDI.


VI. Utilisation de la démo

Ouvrez la base de données, s'il s'agit du premier lancement, une alerte vous demandera d'ouvrir le panneau des préférences.

Ouvrez le panneau des préférences depuis la barre de menu : UDDI/Préférences

Vous pouvez alors laisser la liste telle quelle ou ajouter/supprimer des serveurs UDDI

Ouvrez l'assistant de recherche UDDI. Vous pouvez toujours cliquer sur le bouton ‘Avancé…' pour consulter les possibilités offertes par les APIs UDDI. Cependant, n'essayez pas de les utiliser : il ne se passera pas grand chose et vous risquez d'être déçus !

Recliquez sur le bouton 'Avancé...' afin de masquer la section des options supplémentaires et revenir au mode de recherche normal.

Entrez un mot-clé quelconque pour effectuer une recherche sur le nom d'un service Web. Ex. : « zip » (pour code postal).

Cliquez sur le bouton 'Rechercher' pour déclencher une interrogation. Il se peut qu'une attente de quelques secondes soit nécessaire en fonction de la vitesse de la connexion internet.

Une liste des services Web trouvés devrait ensuite apparaître dans la zone de défilement de gauche.

Vous pouvez sélectionner n'importe lequel des services listés (comme dans l'assistant de service Web) et consulter la documentation associée dans la zone de texte de droite.

Vous pouvez également accéder à la section 'Plus...' pour visualiser les détails du service sélectionné.

Cliquez sur le lien WSL pour afficher le WSDL dans votre navigateur par défaut ou tapez ctrl-c au clavier pour copier le lien dans le presse-papiers. Vous pouvez alors coller ce lien dans l'assistant Web service de 4D afin d'inspecter le WSDL et d'utiliser le service correspondant.

Il se peut que vous rencontriez des problèmes avec le lien WSDL retourné. Cela vous démontrera pleinement l'intérêt de maintenir les serveurs UDDI. Beaucoup des services Web listés autant sur les serveurs UDDI de Microsoft que d'IBM sont maintenant obsolètes et rendent ainsi ces serveurs inutilisables. xMethods.net étant considéré comme le pivot des services Web, je recommande d'utiliser seulement xMethods.net comme serveur UDDI.


VII. Base exemple

Téléchargez la base exemple :

pour Windows

pour MacOs

__________________________________________________
Copyright © 1985-2009 4D SA - Tous droits réservés
Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible.
Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte. L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs utilisateurs que des tiers.
Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière engager 4D SA. La fourniture du logiciel décrit dans ce document est régie par un octroi de licence dont les termes sont précisés par ailleurs dans la licence électronique figurant sur le support du Logiciel et de la Documentation afférente. Le logiciel et sa documentation ne peuvent être utilisés, copiés ou reproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux termes de cette licence.
Aucune partie de ce document ne peut être reproduite ou recopiée de quelque manière que ce soit, électronique ou mécanique, y compris par photocopie, enregistrement, archivage ou tout autre procédé de stockage, de traitement et de récupération d'informations, pour d'autres buts que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D SA.
4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension ®, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des marques enregistrées de 4D SA.
Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation.
Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées ou des noms commerciaux de Apple Computer,Inc.
Mac2Win Software Copyright © 1990-2002 est un produit de Altura Software,Inc.
4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,Trumbull,CT,USA.
XTND Copyright 1992-2002 © 4D SA. Tous droits réservés.
XTND Technology Copyright 1989-2002 © Claris Corporation.. Tous droits réservés ACROBAT © Copyright 1987-2002, Secret Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'Adobe Systems Inc.
Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.
__________________________________________________
 



Valid XHTML 1.1!Valid CSS!

Ce document est issu de http://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.
Contacter le responsable de la rubrique 4D