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

Message par ROMJERIPA »

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

Merci

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

Message par ROMJERIPA »

Voici donc un exemple du code


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);

// Fin Prog
*inlr = *on;

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

Message par ROMJERIPA »

Bien entendu cette solution nécessite l'installation des API de Scott CLEMENT:

- BASE64 trouvée sur https://www.scottklement.com/base64/
- IFSIO_H trouvé sur https://www.scottklement.com/presentati ... ources.zip

Encore merci à CMASSE pour son attention et ses réponses...

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

Message par ROMJERIPA »

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

Merci

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

Message par ROMJERIPA »

Il manquait juste une ligne de réinitiallisation du tampon de lecture...

WReadData = '';

à placer avant la lecture (en fin de boucle DOW):
WLen = READ(WInFile: %ADDR(WReadData): %Size(WReadData));

Code : Tout sélectionner

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;

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

base64

Message par cmasse »

Excellent !


Le fichier en base64 doit-il être décodé du coté client avant d'être lu ou bien est-il lisible directement dans Acrobate sans traitement ?
Christian Massé (Volubis.fr)

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

Message par ROMJERIPA »

Il doit être décodé avant de pouvoir être ouvert via acrobat.

Bilbao400
Messages : 1
Enregistré le : dim. 26 déc. 2021, 19:43:15

Re: Web Service SOAP avec BLOB

Message par Bilbao400 »

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

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

Re: Web Service SOAP avec BLOB

Message par nbonnet »

Merci pour l'info !
Nathanaël

Répondre