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).
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
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.
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 Callback( root.userdata : rootDepth(root) : element.name : elemPath(root: element) : p_retval : wwAttrAry );
3- En évaluant le tableau de pointeurs wwAttrAry, voici le résultat :
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)
> 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.
Partager