Consommer Des Services Web en RPG ILE
Consommer Des Services Web en RPG ILE
Consommer Des Services Web en RPG ILE
Les avantages des Services Web ne sont plus à démontrer aujourd’hui, ils sont devenus le
nouveau point de convergence des acteurs du marché de l’informatique qui en font un
nouveau standard accepté de tous. Le vieux rêve de faire communiquer en temps réel
différents programmes issus de différentes plates-formes hétérogènes et ceci quelque soit
les distances, est consommé. Que ce soit dans votre intranet pour faire communiquer vos
différents applicatifs, ou sur internet pour accéder à un service gratuit ou payant, ils sont
l’avenir et leur implémentation au cœur de l’IBM i est devenue une sinécure.
De nombreux articles définissent avec précision ce qu’est un Service Web, leur utilité et la
technologie employée, iSeries News a d’ailleurs publié déjà de nombreux articles sur le sujet,
les plus remarquables rédigés par Skott Klement et son projet open-source HTTPAPI. Le
succès de ce projet a fait réagir les équipes d’IBM à Rochester. Ainsi, la V6R1 nous a apporté
un lot important de nouveautés concernant les Services Web, dont nombre d’entre elles ont
été portées en V5R4 par PTF.
Nous possédons dorénavant en V5R4 un serveur de Service Web intégré à l’OS qui vous
permettra en quelques clics de transformer un programme ILE RPG ou COBOL en Service
Web tout en s’affranchissant de déployer Websphère Application Server, mais nous
traiterons ce sujet dans un autre article.
La nouveauté qui nous concerne, le portage du projet Apache Fondation Axis C++ version 1.5
dans l’IBM i. Axis est un Framework open-source qui offre en outre la possibilité de générer
automatiquement des WSDL correspondant à des classes Java ou inversement à créer des
classes Java, C ou C++ sur la base d'un WSDL, et c’est ce dernier point qui va nous intéresser
dans cet article. Ainsi, toute la complexité d’accès au programme distant avec le protocole
HTTP à travers des messages SOAP est masquée dans ces classes proxy. Il nous reste plus
qu’à appeler ces programmes générés pour consommer un Service Web comme indiqué sur
la figure 1.
RPG LE
C/C++ stubs Client Axis SOAP Serveur
COBOL LE
Figure 1
Ainsi, les étapes nécessaires pour consommer un service web sont :
Pour connaître les limitations l’Axis C++ 1.5 dans l’IBM i, je vous conseille de visualiser le
README.TXT situé dans le répertoire /Qibm/ProdData/OS/Webservices/V1/Client/. Extraits :
Pour le tester, on saisi en ligne le code boursier « IBM » et on obtient en réponse le message
XML (figure 2)
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="
http://www.webserviceX.NET/"><StockQuotes><Stock><Symbol>IBM</
Symbol><Last>128.63</Last><Date>11/17/2009</Date><Time>4:00p
m</Time><Change>+0.42</Change><Open>127.43</Open><High>12
8.655</High><Low>127.40</Low><Volume>7751233</Volume><MktC
ap>169.0B</MktCap><PreviousClose>128.21</PreviousClose><Percent
ageChange>+0.33%</PercentageChange><AnnRange>69.50 -
128.61</AnnRange><Earns>9.74</Earns><P-E>13.16</P-
E><Name>INTL BUSINESS MAC</Name></Stock></StockQuotes>
</string>
Figure 2
/QIBM/ProdData/OS/WebServices/V1/client/BIN/wsdl2ws.sh -lc 1
-o/home/webservices 2
/home/webservices/StockQuote.wsdl
3
Code generation completed. Generated files in directory '/home/webservices'.
Figure 3
A l’issu de la commande (figure 3), des sources de programmes en C (si -LC n’avait pas été
indiqué au paramètre du C++ aurait été généré) ont été créés dans le répertoire à
partir du WSDL fourni en .
Pour consommer notre service web depuis notre RPG, il nous faudra au minimum appeler
les fonctions prototypées Get_StockQuoteSoap_stub(), GetQuote() ainsi que la fonction
Destroy_StockQuoteSoap_stub(). Mais avec quels paramètres ?
*--------------------------------------------------------------------
* Prototypes et interfaces
*--------------------------------------------------------------------
DgetStub PR * ExtProc('get_StockQuoteSoap_stub’)
D pEndpoint * Value
*
DdestroyStub PR ExtProc('destroy_StockQuoteSoap_Stub’)
D AxisHandle * Value
*
DWebservice PR * ExtProc('GetQuote')
D AxisHandle * Value
D Parameter1 * Value
*
*--------------------------------------------------------------------
* Déclarations diverses.
*--------------------------------------------------------------------
D pResultat S *
D Resultat S 32565 Varying
D WsStubP S *
*--------------------------------------------------------------------
* Web service logic. The code will attempt to invoke the Web Service
*--------------------------------------------------------------------
/FREE
// Get a Web service stub. The host and port for the endpoint may need
// to be changed to match host and port of Web service. You can pass
// *NULL to getStub() if the endpoint in the WSDL file is correct.
WsStubP = getStub(*NULL);
Parameter = 'IBM' + x'00';
pResultat = WebService(WsStubP : %addr(Parameter));
Resultat = %str(pResultat);
destroyStub(WsStubP);
*inlr = *on;
Figure 5
N’est-ce pas formidable ? En quelques lignes de code, vous consommez déjà votre premier
Service Web en invoquant directement la bourse de New York. Le problème, StockQuote
renvoie un fichier XML complet comme montré à la figure 2, il vous faudra soit extraire ces
données par des %scan, %substr etc… ou simplement en utilisant le nouveau code opération
XML-INTO de la V5R4. Je vous rassure, tous les Services Web ne renvoient pas forcément un
résultat dans un champ caractère contenant du XML. Mais avec StockQuote c’est le cas.
Pour affecter proprement le contenu du XML dans des zones, il vous faudra décrire une Data
Structure ayant la même forme que le XML résultant et possédant les mêmes noms de zone.
Le but de cet article n’est pas de vous apprendre à utiliser XML-INTO, ce code opération est
bien documenté, mais pour l’exemple, voici ce qu’il faudra rajouter à votre programme :
*--------------------------------------------------------------------
* Data Structure pour XML-INTO
*--------------------------------------------------------------------
D StockQuotes DS Qualified
D Stock LikeDS(Stocks)
D Stocks DS Qualified
D Symbol 20
D Last 20
D Date 20
D Time 20
D Change 20
D Open 20
D High 20
D Low 20
D Volume 20
D MktCap 20
D PreviousClose 20
D PercentageChange...
D 20
D AnnRange 20
D Earns 20
D P_E 20
D Name 20
*--------------------------------------------------------------------
…
Figure 6
J’ai déclaré chacune des zones en caractère de position 20 alphanumérique, mais à vous
de préférer les résultats dans d’autres types de zones avec des longueurs différentes.
Déclarer une zone P-E n’est pas possible en RPG, à cause du caractère spécial « - ». Je
substitue donc, avant mon XML-INTO, P-E par P_E qui lui, est accepté.
Compilation et liage des modules
Il faut maintenant compiler le tout, c'est-à-dire les Stubs C/C++ d’Axis ainsi que notre ILE RPG
pour en faire un programme unique.
CRTCMOD MODULE(QTEMP/MOD001)
SRCSTMF('/home/webservices/StockQuote.C')
AUT(*USE) ENUM(*INT)
INCDIR('/home/webservices'
'/QIBM/PRODDATA/OS/WEBSERVICES/V1/CLIENT/INCLUDE')
CRTRPGMOD MODULE(QTEMP/MOD002)
SRCFILE(WEBSERVICE/QRPGLESRC) SRCMBR(STOCKQUOTE)
Figure 7
Conclusion
Consulter la bourse ou la météo en temps réel, envoyer des SMS en masse, contrôler un
Swift IBAN/BIC, etc… tout cela est simple à faire en ILE RPG ou COBOL ! Les services SOAP
sont nombreux et diversifiés sur la toile, mais pensez-y aussi pour faire communiquer vos
applicatifs intranet entre eux surtout s’ils résident sur des plates-formes hétérogènes.
Patrick THOMAS