Page 1 sur 2

Web Service SOAP avec BLOB

Posté : mer. 27 janv. 2016, 17:16:42
par ROMJERIPA
Bonjour,

Je cherche à exposer un web service depuis le systeme i (7.2) qui retournerait un Blob.
Je cherche donc à créer un programme RPGLE qui aurait en entrée (PR / PI) un champs BLOB de façon à pouvoir exporter ce programme comme web service soap via "IBM WEB administration for i".

D'où ma question: comment déclarer un blob en carte D sur mes PR et PI en entrée de programme ?

Si vous avez une idée : je suis preneur...

Merci

BLOB

Posté : mer. 27 janv. 2016, 18:15:51
par cmasse
C'est pas tout à fait comme cela que ça se passe.

BLOB est un concept DB2, en HTTP ce sont les formats MIME qui s'appliquent.

lors de la déclaration du web service (idéalement de type REST) on peut préciser un type mime retour par exemple image/gif (par défaut *XML_AND_JSON).

Charge au programme de mettre dans le paramètre en question, une suite d'octets valide en fonction du type mime déclaré. Pourquoi pas un BLOB lu dans DB2?

Voir un exemple avec du HTML venu d'un CLOB, sur la pause Café 71
http://www.volubis.fr/Pausecaf/PAUSECAF71.html

Posté : jeu. 28 janv. 2016, 09:12:28
par ROMJERIPA
Merci pour votre réponse, je regarde cela tout de suite...

Posté : jeu. 28 janv. 2016, 09:26:41
par ROMJERIPA
Je ne comprends pas bien...
(Le ausecafé71 ne fait pas référence au mime type...)

Peut être n'ai-je pas donné assez de détail quant à mon besoin...

Nous cherchons à créer un programme RPGLE qui serait exposé en tant que web service SOAP. Ce web servie (et donc le programme RPGLE) recevrait en entrée un identifiant de document et fournirait en retour le document PDF correspondant.

Je pensais (visiblement à tort au vue de la réponse de CMASSE) que pour pouvoir renvoyer le document PDF, il me faudrait utiliser un format BLOB.
Je comprends que ce n'est pas la solution à exploiter.
Par contre je ne vois pas comment procéder, je vais reprendre mes recherches en ce sens...

Bien entendu: toutes informations, conseils, explications sont les bienvenus...

Merci

BLOB

Posté : jeu. 28 janv. 2016, 11:06:48
par cmasse
Si, si, la pause café" parle bien de format mime, voir cette image


Image

ici text/html

Posté : jeu. 28 janv. 2016, 11:15:24
par ROMJERIPA
Au temps pour moi... Je regarde plus en détail...

Merci Christian

Posté : mar. 02 févr. 2016, 16:55:11
par ROMJERIPA
Ne trouvant que peu de solution sur le net, j'ai mis en place les API de SCOTT KLEMENT (IFSIO et BASE64).
Ainsi via mon programme RPGLE je retourne bien mon PDF converti en binaire en réponse à l'appel du web service.

Je me heurte maintenant à un nouveau problème: comment reconvertir le binaire reçu en un fichier PDF ???

Actuellement si je récupère les données en binaire et que je les place dans notepad++ par exemple et que je fais un saveas xxxxx.pdf : le pdf n'est pas lisible, acrobat refuse de l'ouvrir en signalant qu'il n'est pas bien formaté ou qu'il est corrompu...

Quelqu'un a t'il déjà rencontré ce type de problème et surtout quelqu'un aurait-il une solution à m'apporter, svp ?

Merci

base64

Posté : mar. 02 févr. 2016, 17:37:13
par cmasse
Effectivement, j'ai un incident d'ouvert (PMR), IBM ne sait pas me dire si le serveur de web services sait retourner du binaire. (a suivre...)

les API de Scott Klement, sont une bonne idée, du coup comme vous faites "à la main", vous faites comme vous voulez :wink:

Mais pourquoi BASE64 ? (c'est un format plutôt destiné aux attachements dans les mails)

et continuez vous à utiliser le serveur d'application intégré ou bien faites vous directement du CGI derrière Apache ?

base64

Posté : mer. 03 févr. 2016, 09:08:34
par cmasse
SI vous codez en base64 (c'est effectivement supporté par HTTP) indiquez bien dans les entêtes (HTTP header)

Code : Tout sélectionner

Content-Type: application/pdf
Content-Transfer-Encoding: base64

Posté : mer. 03 févr. 2016, 09:47:53
par ROMJERIPA
Bonjour,

Malheureusement je ne maitrise pas vraiment ce que je fais...
Je tatonne...

Je suis passé par les API de Scott KLEMENT car j'ai trouvé un forum où une personne indiquait qu'elle avait réussit à envoyer son document en retour de web service SOAP via ces solutions.
J'ai donc essayé de faire de la même façon (conversion du .PDF en BASE64 pour récupérer une chaine de caractère que je peux fournir en paramètre OUTPUT du web service).
Cela fonctionne...
Mais à présent je ne sais pas comment retransformer cette chaine en .PDF.

J'utilise en effet l'interface IBM Web Admninistration for i.

Par contre je retourne une chaine de caractère brute, et donc aucun HTTP Header ou attachement particulier...

Merci

Posté : mer. 03 févr. 2016, 11:04:51
par cmasse
je viens d'avoir la réponse du point service.

A aujourd'hui, le serveur de web service n'est pas prévu pour retourner de la donnée binaire.
they should submit a request for design change for this as it is not currently a supported feature.
je pense qu'il faut passer directement en CGI derrière Apache.

Posté : mer. 03 févr. 2016, 11:24:36
par ROMJERIPA
Je vais essayé sans encodage en BASE64...
Je vous tiens informés...

Merci

Posté : mer. 03 févr. 2016, 11:27:10
par ROMJERIPA
En fait je pense qu'il faut passer par l'encodage en BASE64 pour éviter les caractères qui seraient interprétés en XML.

En effet sans encodage j'ai une erreur 'The SOAP response failed schema validation'...

CGI

Posté : mer. 03 févr. 2016, 11:59:57
par cmasse
je ne pense pas que le serveur IWS puisse retourner du binaire (dixit IBM)

ce pgm fonctionne chez moi en CGI (attention ça pique les yeux)

Code : Tout sélectionner

**FREE
 ctl-opt pgminfo(*pcml : *module) ;
    // LINKER CE PGM AVEC QTMHCGI *SRVPGM   
 dcl-s photods SQLTYPE(blob : 102400);
 dcl-s SORTIE    char(102040);
 Dcl-s SORTIELG  int(10) INZ(%LEN(SORTIE));
 dcl-ds APIERR ;
         ERRLG  int(10) INZ(%len(apierr)) ;
         ERRLGDISPO int(10);
         ERRID   char(7);
         ERRRESERVE CHAR(1);
         ERRMSG   CHAR(50);
 end-ds;
 dcl-pr Qwrite  EXTPROC('QtmhWrStout');
       wsortie    like(sortie);
       wsortieLG  like(sortielg);
       wAPIERR   likeds(apierr);
 end-pr;
 dcl-s EOL char(1) inz(x'15');
 dcl-s empno char(6);

 empno = '000130';
   EXEC SQL
           SELECT Picture INTO :Photods
                 FROM Db2sample/Emp_Photo
         WHERE Empno = :Empno AND Photo_Format = 'gif';
 if sqlcode = 0;
       sortie = 'Content-type: image/gif' +EOL + EOL +
                  %subst(photods_data : 1 : photods_len) +
                  EOL ;
       sortielg = %len(%trimr(sortie));
       QWRITE(sortie : sortielg : apierr);
ENDIF;
*inLR = *on; 

base64

Posté : mer. 03 févr. 2016, 14:23:03
par cmasse
J'ai trouvé (pour les web services REST) en passant en base64 avec l'API de scott KLEMENT

Code : Tout sélectionner

**FREE
ctl-opt pgminfo(*pcml : *module) ;
dcl-pi *n;
        empno char(6);
        image char(102400);
        httpstatus int(10);
        httpheader char(100) dim(10);
END-PI;
dcl-s base64 char(102000);
dcl-s photods SQLTYPE(blob : 102400);
 /copy base64_h
    EXEC SQL
            SELECT Picture INTO :Photods
                 FROM Db2sample/Emp_Photo
         WHERE Empno = :Empno AND Photo_Format = 'gif';
if sqlcode = 0;
     httpstatus = 200;
      base64_encode(%addr(photods_data):photods_len:
                     %addr(base64):%size(base64));
      image = '<img src="data&#58;image/gif;base64,' + base64 + '">';
      httpheader&#40;1&#41; = 'Content-Type&#58; text/html';
      httpheader&#40;2&#41; = 'Content-Transfer-Encoding&#58; base64';
else;
      httpstatus = 404;
ENDIF;
*inLR = *on;