[Résolu] Problème avec DATA-INTO et YAJLINTO HTTP_POST

RPG (3 et 4, free), CL, SQL, etc...
Répondre
BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

[Résolu] Problème avec DATA-INTO et YAJLINTO HTTP_POST

Message par BrigitteG »

Bonjour,

Voir le message plus bas concernant YAJLINTO

L'appel de web service et traitement des données est tout nouveau pour moi.

Dans mon programme j'ai défini

Code : Tout sélectionner

dcl-s profil   varchar(200);
dcl-s url      varchar(2000);
dcl-s response varchar(5000);
dcl-ds adresse;
    access_token varchar(1000);
    userName char(5);
    departement char(2);
end-ds;      
Après avoir formaté mes variables j'appelle

Code : Tout sélectionner

exec SQL
         values
          QSYS2.HTTP_POST(:url, :profil, :option) into :response;
J'obtiens comme résultat
{"access_token":"eyJhbGciOiJ…uyRa-Bfzax7s ","userName":"GDS71","departement":"71"}██

J'utilise data-into pour récupérer la valeur de access_token.

Code : Tout sélectionner

Data-into adresse %Data(response:'doc=string trim=all') %parser('JSONPARSE');

J'ai comme erreur et là je n'arrive pas à la comprendre :oops: .

ID message . . . . . . : RNX0356
Message . . . . : Le document pour l'opération DATA-INTO ne correspond pas à la variable RPG ; code raison 1.
Cause . . . . . : Lors de l'analyse syntaxique d'un document pour l'opération DATA-INTO, l'analyseur syntaxique a détecté que le document ne correspond pas à la variable RPG "adresse", or, cela n'est pas autorisé par les options.
Code raison : 1. La sous-zone exacte pour laquelle l'erreur a été détectée est adresse. Les options sont "doc=string trim=all". Le nom du document est *N ; *N indique le document n'est pas un fichier externe.
L'analyseur syntaxique est 'JSONPARSE'. *N indique que l'analyseur syntaxique est un pointeur de procédure.

Pouvez-vous m'aider ?

Je vous en remercie d'avance.
Modifié en dernier par BrigitteG le mar. 18 avr. 2023, 12:45:14, modifié 5 fois.

nbonnet
Messages : 198
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: Problème avec DATA-INTO

Message par nbonnet »

Bonjour,

Le parseur attend une structure JSON avec le même nom que la DS, donc ceci fonctionne :

Code : Tout sélectionner

response = '{"adresse": {"access_token":"eyJhbGciOiJuyRaBfzax7s ", '"userName":"GDS71","departement":"71"}}' ;
data-into adresse
        %data(response
            : 'doc=string case=any trim=all')
        %parser('JSONPARSE');
Avec le résultat actuel, il faudrait lire 3 fois pour extraire les 3 valeurs :

Code : Tout sélectionner

data-into access_token
        %data(response
            : 'doc=string case=any trim=all allowextra=yes')
        %parser('JSONPARSE');
Dans tous les cas, ajouter :
case=any : ignorer la casse des éléments JSON (d'autant plus que RPG considère toutes les variables en majuscule)
allowextra=yes : ignorer les données supplémentaires

Quelques liens :
https://www.ibm.com/docs/en/i/7.5?topic ... o-variable
https://www.ibm.com/docs/en/i/7.5?topic ... ation-code
https://www.ibm.com/docs/en/i/7.5?topic ... -variables
Nathanaël

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: Problème avec DATA-INTO

Message par BrigitteG »

:D merci beaucoup

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: Problème avec DATA-INTO et YAJLINTO

Message par BrigitteG »

Bonjour,

J'ai voulu remplacé JSONPARSE par YAJLINTO en utilisant la même écriture que pour JSONPARSE. Mais cela ne fonctionne pas.

Code : Tout sélectionner

dcl-ds adresse Qualified Inz;
        access_token varchar(1000);
        userName char(5);
        departement char(2);
end-ds; 

Code : Tout sélectionner

 exec SQL
    values
          QSYS2.HTTP_POST(:url, :profil, :option) into :response; 
Ma zone response

Code : Tout sélectionner

RESPONSE =                                                             
          ....5...10...15...20...25...30...35...40...45...50...55...60 
     1   '{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodH'
    61   'RwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2'
   121   'NsYWltcy9uYW1lIjoiR0RTNzEiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm'
   181   '9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9wb3N0YWxjb2RlIjoiNz'
   241   'EiLCJuYmYiOjE2ODE4TksImV4cCI6MTY4MTg5MDcxOSwiaXNzIjoiaH'
   301   'R0cHM6Ly9sb2NhbGhvc3Q6NzEyMiIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3'
   361   'N0OjcxMjIifQ.4Y7bbwrTLqs2Sdq8na86Z1L6DsECfXruDTr9JrFwSbY","u'
   421   'serName":"GDS71","departement":"71"}██                      '
   481   '                                                            '
Avant l'exécution du data-into je regarde adresse

Code : Tout sélectionner

ADRESSE.ACCESS_TOKEN =           
          ....5...10...15...20...
     1   '                       
    61   '                       
   121   '                       
   181   '                       ..
ADRESSE.USERNAME = '     '  
ADRESSE.DEPARTEMENT = '  '  

Code : Tout sélectionner

DATA-INTO adresse %DATA('{"adresse":'+%trim(response)+'}'
        :'case=any allowextra=yes') %PARSER('YAJLINTO'); 
Message . . . . : Le document pour l'opération DATA-INTO ne correspond pas à
la variable RPG ; code raison 4.
Cause . . . . . : Lors de l'analyse syntaxique d'un document pour l'opération
DATA-INTO, l'analyseur syntaxique a détecté que le document ne correspond
pas à la variable RPG "adresse", or, cela n'est pas autorisé par les
options. Code raison : 4. La sous-zone exacte pour laquelle l'erreur a été
détectée est adresse.access_token. Les options sont "case=any ...

4. The document is missing information to match subfields.

Je ne vois pas quelle information il manque.

Est-ce que YAJLINTO peut traiter les données provenant du sql ? Tous les exemples que je trouve font référence à un fichier json sur l'ifs. Ce que je n'ai pas.

Je vous remercie d'avance pour votre aide.

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: [Résolu] Problème avec DATA-INTO et YAJLINTO HTTP_POST

Message par BrigitteG »

Fonctionnement différent entre JSONPARSE & YAJLINTO

Code : Tout sélectionner

dcl-ds adresse Inz;
        access_token varchar(1000);
        userName char(5);
        departement char(2);
end-ds;

Code : Tout sélectionner

DATA-INTO adresse %DATA(%trim(response) :'case=any allowextra=yes') %PARSER('YAJLINTO'); 

Répondre