Bonjour tout le monde;

Avant d'ouvrir ce sujet, je me suis tiré les cheveux avec un problème de passage de paramètres. Je compte sérieusement sur vos lumières.
En se basant sur la bibliothèque HTTPAPI de Scott Klement, et en utilisant l'exemple d'appel du Web Service CurrencyConvertor accessible depuis http://www.webservicex.net, j'ai réussi à mettre en place un programme COBOL (Similaire à celui fourni dans l'exemple du forum http://scottklement.com/archives/ftp.../msg00014.html ) qui fait appel à un Web Service local, sauf qu'au niveau du XML PARSER je n'arrive pas à récupérer la valeur de l'attribut de la balise lue. Je m'explique : les paramètres de l'XML PARSER sont :

LSAA-DUMMY : Pointeur
LSAA-DEPTH-XML : Pointeur
LSAA-NAME : Le nom du tag XML
LSAA-PATH : Le chemin du tag
LSAA-VALUE : La valeur du tag
LSAA-ATTRS : Un pointeur qui est censé contenir un tableau de pointeur sur les attributs et les valeurs de chaque tag (exemple <tag1 attr1="xxx">"yyyy"</tag1) --> C'est là que le bas blesse.

Le XML PARSER est appelé après chaque Callback de la procédure RPG, et il reçoit les paramètres attendus, sauf qu'en cas de tag avec attribut (ex attr1) le PARSER reçoit un pointeur null (Eval du pointeur donne "Identifier does not exist").

Je pense que le problème réside au niveau du passage des paramètres entre les programmes.

Y-a-t il quelqu'un qui a déjà rencontré ce problème ?

Pour ample d’éclaircissement, Voici le schéma :

1- Le programme COBOL WSCALL fait appel à une procédure RPG HTTP_URL_POST_XML, en lui passant des paramètres genre: l'URL du WS, le TIMEOUT , CONTENT-TYPE, ACTION...etc (Voir code).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
CALL PROCEDURE                                         
    "HTTP_URL_POST_XML" USING BY REFERENCE WSAA-URL
                     BY VALUE      WSAA-SOAP-POINTER          
                     BY VALUE      WSAA-SOAP-LEN              
                     BY VALUE      WSAA-STARTPROC-POINTER     
                     BY VALUE      WSAA-ENDPROC-POINTER       
                     BY VALUE      WSAA-OUTPUT-POINTER        
                     BY VALUE      WSAA-TIMEOUT               
                     BY REFERENCE  WSAA-USER-AGENT            
                     BY REFERENCE  WSAA-CONTENT-TYPE          
                     BY REFERENCE  WSAA-SOAP-ACTION           
                     RETURNING     WSAA-RETURN-CODE.
2- Après exécution et réception/lecture de la réponse XML, et lors de la fermeture d'un tag (</tag>) la procédure RPG EXPORT est appelée, elle fait un Callback en remplissant une structure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Callback( root.userdata
        : rootDepth(root)
        : element.name
        : elemPath(root: element)
        : p_retval
        : wwAttrAry
        );
La structure est défini comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
endElement      B                   export          
endElement      PI                                  
  root                              likeds(elemroot)
  name                          *   value

p_callback      s               *   procptr                
Callback        PR                  extproc(p_callback)    
  userdata                      *   value                  
  depth                       10I 0 value                  
  name                      1024A   varying const          
  path                     24576A   varying const          
  retval                        *   value                  
  Attrs                         *     dim(32767)             
                                        const options(*varsize)
3- En évaluant le tableau de pointeurs wwAttrAry, voici le résultat :
> EVAL wwAttrAry
WWATTRARY(1) = SPP:E9AC54183F05AF70
WWATTRARY(2) = SPP:E9AC54183F05AF90
WWATTRARY(3) = SPP:*NULL
WWATTRARY(4) = SPP:*NULL
WWATTRARY(5) = SPP:*NULL
....etc.
WWATTRARY(500) = SPP:*NULL

Voici le resultat d'un EVAL sur la première cellue du tableau : wwAttrAry(1):C 100 ==> "v ® ZÐ}y VERT"
le "v" est le nom de l'attribut, "VERT" est sa valeur.

4- En continuant l'exécution le PARSER est appelé, or seuls les paramètres LSAA-NAME, LSAA-PATH et LSAA-VALUE sont remplies.

Dieu merci que j'ai un seul attribut par tag, donc je peux contourner le problème en lisant le contenu du tableau et mettant la valeur dans p_retval, mais ça sera une solution temporaire qui n'est pas très jolie. De toute les façons, je veux savoir comment (Je suis null en RPG 400).

Merci infiniment pour vos éventuels retours.

Cordialement.