Web Service SOAP avec BLOB

RPG (3 et 4, free), CL, SQL, etc...
ROMJERIPA
Messages : 19
Enregistré le : mer. 27 janv. 2016, 16:05:35

Web Service SOAP avec BLOB

Message 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

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

BLOB

Message 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
Christian Massé (Volubis.fr)

ROMJERIPA
Messages : 19
Enregistré le : mer. 27 janv. 2016, 16:05:35

Message par ROMJERIPA »

Merci pour votre réponse, je regarde cela tout de suite...

ROMJERIPA
Messages : 19
Enregistré le : mer. 27 janv. 2016, 16:05:35

Message 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

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

BLOB

Message par cmasse »

Si, si, la pause café" parle bien de format mime, voir cette image


Image

ici text/html
Christian Massé (Volubis.fr)

ROMJERIPA
Messages : 19
Enregistré le : mer. 27 janv. 2016, 16:05:35

Message par ROMJERIPA »

Au temps pour moi... Je regarde plus en détail...

Merci Christian

ROMJERIPA
Messages : 19
Enregistré le : mer. 27 janv. 2016, 16:05:35

Message 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

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

base64

Message 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 ?
Christian Massé (Volubis.fr)

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

base64

Message 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
Christian Massé (Volubis.fr)

ROMJERIPA
Messages : 19
Enregistré le : mer. 27 janv. 2016, 16:05:35

Message 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

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

Message 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.
Christian Massé (Volubis.fr)

ROMJERIPA
Messages : 19
Enregistré le : mer. 27 janv. 2016, 16:05:35

Message par ROMJERIPA »

Je vais essayé sans encodage en BASE64...
Je vous tiens informés...

Merci

ROMJERIPA
Messages : 19
Enregistré le : mer. 27 janv. 2016, 16:05:35

Message 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'...

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

CGI

Message 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; 
Christian Massé (Volubis.fr)

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

base64

Message 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;                                           
Christian Massé (Volubis.fr)

Répondre