Et bien c'est bon cela fonctionne à présent: EN SOAP
Je lis mon pdf généré sur l'IFS, j'appelle l'API de Scott KLEMENT BASE64 et je retourne la chaine convertie dans le paramètre en sortie du Web Service (RPGLE).
La chaîne retournée, une fois décodée peut être enregistrée au format PDF et être ouverte via Acrobat.
Je vais épurer mon source des différents tests effectués et je le posterai ici de façon à ce qu'il puisse éventuellement être utile à quelqu'un...
H DFTACTGRP(*NO)
H ACTGRP('SOAP') PGMINFO(*PCML: *MODULE)
F* ---------------------------------------------------------------
F* Ce programme:
F* - Est un programme SQLRPGLE déployé comme
F* Web Service SOAP via IBM Web Administration for i
F* ---------------------------------------------------------------
F* Ce programme (WS000RP)
F* - Est appelé par le Web Service SOAP
F* - Lis un fichier PDF stocké dans l'IFS (MonPDF.PDF)
F* - Encode ce fichier PDF en BASE64
F* - Retourne le fichier PDF dans une chaîne de caractère
F* au format BASE64
F* ---------------------------------------------------------------
// Répertoire de liage de l'API Scott KLEMENT BASE64
CTL-OPT BNDDIR('BASE64BND');
D* ---------------------------------------------------------------
D* Zones de travail
D* ---------------------------------------------------------------
DCL-S NOM_PDF VARCHAR(255);
*
* Variable pour appel de l'API BASE64
*
DCL-S WEncodeDataLen INT(10);
DCL-S WEncodeData CHAR(65535);
DCL-S WReadData CHAR(19998);
DCL-S WI INT(10);
DCL-S Wlen INT(10);
DCL-S WInFile INT(10);
*
/COPY QCPYSRC,BASE64_H
/COPY QCPYSRC,IFSIO_H
*
D* ---------------------------------------------------------------
D* Paramètres
D* ---------------------------------------------------------------
DCL-PR WS000RP extpgm('WS000RP');
// Variable alimentée en retour avec le PDF au format BASE64
WS_DOC_PDF varchar(8386552:4);
END-PR;
DCL-PI WS000RP;
// Variable alimentée en retour avec le PDF au format BASE64
WS_DOC_PDF varchar(8386552:4);
END-PI;
//-----------------------------------------------------------------------
// Initialisations
//-----------------------------------------------------------------------
exec sql set option commit = *none;
//-----------------------------------------------------------------------
// Ouverture du PDF depuis l'IFS via l'API IFSIO de S.KLEMENT
//-----------------------------------------------------------------------
NOM_PDF = '/IFS/MonPDF.pdf';
WInFile = OPEN(%Trim(NOM_PDF): O_RDONLY);
//-----------------------------------------------------------------------
// Encodage du PDF en Base64
// - lecture par bloc de 19998 octets ( %SIZE(WReadData)=19998 )
//-----------------------------------------------------------------------
Wlen = READ(WInFile: %ADDR(WReadData): %SIZE(WReadData));
DOW Wlen >= 1;
// Encodage en BASE64
WEncodeDataLen = base64_encode(
%ADDR(WReadData) // Données à encoder
:%Len(%trimr(WReadData)) // Longueur données à encoder
:%ADDR(WEncodeData) // Résultat de l'encodage
:%len(WEncodeData)); // Longueur des données encodées
// Alimentation du paramètre en retour WS_DOC_PDF
// avec la chaîne de caractères encodés en BASE64
WS_DOC_PDF = %Trim(WS_DOC_PDF)
+ %Subst(WEncodeData:1:WEncodeDataLen);
WI = WI + 1;
DSPLY WI;
WLen = READ(WInFile: %ADDR(WReadData): %Size(WReadData));
ENDDO;
CALLP CLOSE(WInFile);
Je viens de constater que mon source ne marche pas dans tous les cas...
Je poursuis mes recherches et reviens au plus vite pour mettre à jour ce post...
H DFTACTGRP(*NO)
H ACTGRP('SOAP') PGMINFO(*PCML: *MODULE)
F* ---------------------------------------------------------------
F* Ce programme:
F* - Est un programme SQLRPGLE déployé comme
F* Web Service SOAP via IBM Web Administration for i
F* ---------------------------------------------------------------
F* Ce programme (WS000RP)
F* - Est appelé par le Web Service SOAP
F* - Lis un fichier PDF stocké dans l'IFS (MonPDF.PDF)
F* - Encode ce fichier PDF en BASE64
F* - Retourne le fichier PDF dans une chaîne de caractère
F* au format BASE64
F* ---------------------------------------------------------------
// Répertoire de liage de l'API Scott KLEMENT BASE64
CTL-OPT BNDDIR('BASE64BND');
D* ---------------------------------------------------------------
D* Zones de travail
D* ---------------------------------------------------------------
DCL-S NOM_PDF VARCHAR(255);
*
* Variable pour appel de l'API BASE64
*
DCL-S WEncodeDataLen INT(10);
DCL-S WEncodeData CHAR(65535);
DCL-S WReadData CHAR(19998);
DCL-S WI INT(10);
DCL-S Wlen INT(10);
DCL-S WInFile INT(10);
*
/COPY QCPYSRC,BASE64_H
/COPY QCPYSRC,IFSIO_H
*
D* ---------------------------------------------------------------
D* Paramètres
D* ---------------------------------------------------------------
DCL-PR WS000RP extpgm('WS000RP');
// Variable alimentée en retour avec le PDF au format BASE64
WS_DOC_PDF varchar(8386552:4);
END-PR;
DCL-PI WS000RP;
// Variable alimentée en retour avec le PDF au format BASE64
WS_DOC_PDF varchar(8386552:4);
END-PI;
//-----------------------------------------------------------------------
// Initialisations
//-----------------------------------------------------------------------
exec sql set option commit = *none;
//-----------------------------------------------------------------------
// Ouverture du PDF depuis l'IFS via l'API IFSIO de S.KLEMENT
//-----------------------------------------------------------------------
NOM_PDF = '/IFS/MonPDF.pdf';
WInFile = OPEN(%Trim(NOM_PDF): O_RDONLY);
//-----------------------------------------------------------------------
// Encodage du PDF en Base64
// - lecture par bloc de 19998 octets ( %SIZE(WReadData)=19998 )
//-----------------------------------------------------------------------
Wlen = READ(WInFile: %ADDR(WReadData): %SIZE(WReadData));
DOW Wlen >= 1;
// Encodage en BASE64
WEncodeDataLen = base64_encode(
%ADDR(WReadData) // Données à encoder
:%Len(%trimr(WReadData)) // Longueur données à encoder
:%ADDR(WEncodeData) // Résultat de l'encodage
:%len(WEncodeData)); // Longueur des données encodées
// Alimentation du paramètre en retour WS_DOC_PDF
// avec la chaîne de caractères encodés en BASE64
WS_DOC_PDF = %Trim(WS_DOC_PDF)
+ %Subst(WEncodeData:1:WEncodeDataLen);
WI = WI + 1;
DSPLY WI;
WReadData = '';
WLen = READ(WInFile: %ADDR(WReadData): %Size(WReadData));
ENDDO;
CALLP CLOSE(WInFile);
// Fin Prog
*inlr = *on;
Bonjour,
Pour retourner un blob à l'aide d'un webservice, vous pouvez créer un webservice rest basé sur une procédure sql. Pour cela, vous devez créer une procédure sql ayant un paramètre de sortie de type blob. Exposez votre procédure sql à l'aide iws, spécifiez le type mime du blob retourné, application/pdf par exemple et le tour est joué !
Pour charger votre blob à partir d'un fichier présent sur l’ifs, utilisez la fonction sql get_blob_from_file