Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AS/400 Discussion :

HTTPAPI, RPG et COBOL


Sujet :

AS/400

  1. #1
    Membre à l'essai
    HTTPAPI, RPG et COBOL
    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/ftpapi/200812/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.

  2. #2
    Membre à l'essai

  3. #3
    Membre éclairé
    Bonjour,

    Çà m'a l'air un peu compliqué tout çà.
    Personnellement, j'ai résolu tout mes problèmes de XML en utilisant la solution décrite ici :
    http://www.mysamplecode.com/2011/06/...into_5653.html

    Tu n'as qu'à analyser les tags d'un fichier complet, et stocker la description.
    Ensuite à chaque import, dans tes programmes tu as juste à tester de quel tag il s'agit, traitement simplissime.

  4. #4
    Membre à l'essai
    Bonjour;

    Merci m4k-Hurrican pour la proposition, mais j'ai parcouru un long chemin, c'est difficile de revenir en arrière.

    Je veux savoir SVP comment récupérer le contenu du tag depuis le tableau des pointeurs, auriez-vous SVP une idée ?