Web services et format numérique
Bonjour,
C'est plus une constatation qu'une question.
J'ai remarqué que lors de l'exposition d'un service Web depuis l'AS400,
pour tout ce qui est numérique, il faut utiliser le type integer.
Exemple :
J'ai exposé un service avec 3 paramètres : 2 caractères et 1 tableau de DS. (dim 999).
La DS à une variable caractère et une numérique signée. --> ça ne fonctionnait pas.
Par contre si je remplace la variable numérique signée par un integer et ça passe.
Faut-il toujours utiliser le type integer pour une variable numérique lors de l'exposition d'un programme AS400?
Merci d'avance.
Florian
C'est plus une constatation qu'une question.
J'ai remarqué que lors de l'exposition d'un service Web depuis l'AS400,
pour tout ce qui est numérique, il faut utiliser le type integer.
Exemple :
J'ai exposé un service avec 3 paramètres : 2 caractères et 1 tableau de DS. (dim 999).
La DS à une variable caractère et une numérique signée. --> ça ne fonctionnait pas.
Par contre si je remplace la variable numérique signée par un integer et ça passe.
Faut-il toujours utiliser le type integer pour une variable numérique lors de l'exposition d'un programme AS400?
Merci d'avance.
Florian
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
non, non
Non, je ne vois pas. je viens d'exposer ce test là, ca marche pafaitement
Attention, dans une DS, il est prudent d'initialiser (CLEAR)
Code : Tout sélectionner
**FREE
ctl-opt PGMINFO(*PCML:*MODULE);
dcl-pi *n;
param1 packed(3 : 0);
param2 packed(3 : 0);
end-pi;
param2 = param1 * 2;
return;
Christian Massé (Volubis.fr)
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
pareil
Pareil, ce code fonctionne
Code : Tout sélectionner
**FREE
ctl-opt PGMINFO(*PCML:*MODULE);
dcl-ds dstemp template;
p1 packed(3 : 0);
p2 packed(3 : 0);
END-DS;
dcl-s i int(5);
dcl-pi *n;
dsparm likeds(dstemp) dim(10);
end-pi;
for i = 1 to 10;
dsparm(i).p2 = dsparm(i).p1 * 2;
ENDFOR;
return;
Christian Massé (Volubis.fr)
Nous on avait ceci:
ce code fonctionne:
Est-ce qu'on a fait une erreur quelque part?
Code : Tout sélectionner
d LigneCCFL ds
d ccfl_conti 2a inz('')
d ccfl_nulib 7s 0 inz(0)
d ACCONGCFL pi
d i_dtcon 8s 0
d i_nucon 7s 0
d o_t_ccfl likeds(LigneCCFL) dim(999)
Code : Tout sélectionner
d LigneCCFL ds
d ccfl_conti 2a inz('')
d ccfl_nulib 10i 0 inz(0)
d ACCONGCFL pi
d i_dtcon 8s 0
d i_nucon 5s 0
d o_t_ccfl likeds(LigneCCFL) dim(999)
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
INZ(*likeds)
L’initialisation à 0 de la DS qui sert de modèle (LigneCCFL) n'est pas répercutée sur o_t_ccfl ,sauf à utiliser INZ(*LIKEDS).Mais ici ce n'est pas possible -> on ne peut pas initialiser par INZ un paramètre.
Arrivez vous à debuger le pgm ? est-ce que ca plante avant ?
Avez vous essayé le packé, plutôt que le numérique étendu (S) ?
Arrivez vous à debuger le pgm ? est-ce que ca plante avant ?
Avez vous essayé le packé, plutôt que le numérique étendu (S) ?
Christian Massé (Volubis.fr)
Nous avons essayé en mettant du packé mais on a le message suivant:
soap:Server java.lang.NumberFormatException: Low-order nibble of the byte at array offset 17 is not valid. Byte value: 00.
soap:Server java.lang.NumberFormatException: Low-order nibble of the byte at array offset 17 is not valid. Byte value: 00.
Code : Tout sélectionner
d LigneCCFL ds
d ccfl_conti 2a inz('')
d ccfl_nulib 7p 0 inz(0)
d ACCONGCFL pi extpgm('ACCONGCFL')
d p_dtcon 8s 0
d p_nucon 5s 0
d p_t_ccfl likeds(LigneCCFL) dim(999)
J'ai un peu avancé sur le sujet depuis le temps 
En fait j'ai fais des tests sur le déploiement.
C'est étrange car quand je veux déployer un service avec une DS en input/output il ne veut pas que je laisse le "detect length fields".
Mais du coup l'ordre des paramètres à l'envoi et au retour n'est pas le même. Il me répond comme ça :
La réponse est :

En fait j'ai fais des tests sur le déploiement.
C'est étrange car quand je veux déployer un service avec une DS en input/output il ne veut pas que je laisse le "detect length fields".
Mais du coup l'ordre des paramètres à l'envoi et au retour n'est pas le même. Il me répond comme ça :
Code : Tout sélectionner
accongaeResponse
return
Group 1
PRM_DTCON (decimal): null
PRM_NUCON (decimal): 91182
PRM_TYPOP (string): INI
Group 2
PRM_DS_CAE
Group 1
Group 2
Group 3
Group 4
Group 5
Group 6
Group 7
Group 8
Group 9
Group 10
Group 11
Group 12
PRM_DTCON (decimal): 20160219
PRM_NUCON (decimal): null
PRM_TYPOP (string): null
Code : Tout sélectionner
91182 INI 0 77 91182 0675830 ATLPF 0 DMD ACH 0 20160219 P 20160219 K 20160219
J'ai un autre exemple plus simple :
1 variable alpha en input / Output
1 ds en input / output
(case "detect lenght fields" décochée car ds en input/output)
Résultat :
Je ne comprends pas pourquoi le paramètre Transporteur revient deux fois?
C'est quoi cette notion de "group" ?
Je pense que mon problème vient de la.
1 variable alpha en input / Output
1 ds en input / output
(case "detect lenght fields" décochée car ds en input/output)
Résultat :
Code : Tout sélectionner
testswResponse
return
Group 1
TRANSPORTEUR (string): toto
Group 2
PRM_DSCLIENT
NOMCLIENT (string): Dupond
NUMEROCLIENT (decimal): 3
TRANSPORTEUR (string): null
C'est quoi cette notion de "group" ?
Je pense que mon problème vient de la.
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
tests
J'ai fait qq tests avec ce code
je ne vois pas du tout vos "groupes"
sous SOAPui
Envelope sent
Envelope receive
Code : Tout sélectionner
**free
ctl-opt PGMINFO(*PCML:*MODULE);
dcl-ds tempds template;
p1_retour char(1);
p2_retour char(2);
END-DS;
dcl-pi *n;
p1 char(1);
p2 likeds(tempds);
END-PI;
p2.p1_retour = p1;
p2.p2_retour = p1 + p1;
*INLR = *on;
sous SOAPui
Envelope sent
Code : Tout sélectionner
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tes="http://testwsio.wsbeans.iseries/">
<soapenv:Header/>
<soapenv:Body>
<tes:testwsio>
<arg0>
<p1>A</p1>
<p2>
<p1_RETOUR>?</p1_RETOUR>
<p2_RETOUR>?</p2_RETOUR>
</p2>
</arg0>
</tes:testwsio>
</soapenv:Body>
</soapenv:Envelope>
Code : Tout sélectionner
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:testwsioResponse xmlns:ns2="http://testwsio.wsbeans.iseries/">
<return>
<p1>A</p1>
<p2>
<p1_RETOUR>A</p1_RETOUR>
<p2_RETOUR>AA</p2_RETOUR>
</p2>
</return>
</ns2:testwsioResponse>
</soap:Body>
</soap:Envelope>
Christian Massé (Volubis.fr)
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
SoapUI
En cas de doute, faites vos tests sous soapUi qui est plus fiable et qui restitue exactement le flux HTTP.
A noter : POSTMAN est aussi très utile pour les web services REST.
A noter : POSTMAN est aussi très utile pour les web services REST.
Christian Massé (Volubis.fr)