Einleitung
Hallo! Mein Name ist Klaus Mödinger und ich bin Kommanditist der comSID GmbH & Co. KG.
In diesem Tech Tip zeige ich ein Beispiel dafür, wie man um vorhandene RPG-Programme eine "Web Service-Schale" legen kann. Damit können RPG-Programme von beliebigen Endgeräten aus aufgerufen werden.
Die Architektur des Vorschaubilds wird man so in der Praxis nicht haben wollen. ;-) Das Bild soll lediglich symbolisieren, dass RPG-Logik mit einem Web Service-Wrapper drumherum ganz neue Möglichkeiten eröffnet.
Das RPG-Programm
Für Demonstrationszwecke kann das Beispiel-RPG nicht einfach genug sein. Dieses hier hängt zwei 10A-Felder zusammen, wobei das erste Feld getrimmt wird:
0001.00 *********************************************** 0002.00 * Project: Website Blog: Tech Tipps 0003.00 * Custom.: --- 0004.00 * 0005.00 * Created: 2020/06/10 K. Moedinger 0006.00 * Changed: ----/--/-- 0007.00 * 0008.00 * Purpose: Simple RPG Module that concatenates 0008.01 * two strings. Used as a demo module 0009.00 * to be called from Web Service. 0010.00 * 0011.00 * Remarks: 0012.00 *********************************************** 0013.00 H DFTACTGRP(*NO) 0014.00 0015.00 ***********************************************
0016.00 * Prototypes 0017.00 *********************************************** 0018.00 * Main program 0019.00 D cat PR EXTPGM('cat100R') 0020.00 D paString1 10A 0021.00 D paString2 10A 0022.00 D paResult 20A 0023.00 0024.00 *********************************************** 0025.00 * Main program 0026.00 *********************************************** 0027.00 D cat PI 0028.00 D paString1 10A 0029.00 D paString2 10A 0030.00 D paResult 20A 0031.00 0032.00 /FREE 0033.00 0034.00 paResult = %TRIM(paString1) + paString2; 0035.00 DSPLY paResult; 0036.00 0037.00 *INLR = *ON; 0038.00 0039.00 /END-FREE 0040.00
Beim Übersetzen des Programms muss unbedingt der Compilerschalter PGMINFO (*PCML *MODULE) gesetzt werden! Damit wird in das Kompilat eine Schnittstellenbeschreibung eingebunden, die der Web Service-Assistent auswertet.
Den Web Service erzeugen
Um den Web Service zu erstellen, loggt man sich mit dem Browser zunächst auf
http://as400/HTTPAdmin ein. ("as400" durch den Namen oder die IP-Adresse der IBM i ersetzen.)
Sofern nicht schon vorhanden, erstellt man einen neuen "Web Services Server". Der in meinem Beispiel heißt "WSERVICE" . Mit "Neuen Service impementieren" startet ein Assistent, mit dem der Web Service in 9 Schritten sprichwörtlich "zusammengeklickt" wird.
Es folgen nun neun Screenshots mit diesen 9 Schritten.
Hat man die 9 Schritte geschafft, wird der Service installiert:
Beispiel-Web Service-Client
Zum Testen des neu erzeugten Web Service schrieb ich mit Visual Studio eine kleine Konsolenapplikationn in C#/.NET 4.6. Ich hätte ebenso Netbeans und Java verwenden können. Den Dienstverweis nannte ich "ServiceCat100R". Hier der Source Code:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using wsclient_cat100r.ServiceCat100R; namespace wsclient_cat100r { class Program { static void Main(string[] args) { CAT100RServicesClient cat100r_client = new CAT100RServicesClient(); catInput input = new catInput(); input.PASTRING1 = "Hallo"; input.PASTRING2 = " Welt!"; input.PARESULT = ""; catResult result = new catResult(); result = cat100r_client.cat(input); Console.WriteLine(result.PARESULT); Console.ReadLine(); } } }
In Visual Studio braucht man zum Hinzufügen eines Dienstverweises die URL des WSDL. Diese findet sich hier:
Hat man alles richtig gemacht, generiert das Konsolenprogramm diese Ausgabe:
Schlusswort
In diesem Tech Tip wurde an vielen Stellen nicht sehr ins Detail gegangen. Ich hoffe dennoch, dass der grobe Abriss, wie man RPG-Logik in einen Web Service verpacken kann, dem einen oder anderen von Nutzen ist.
Die Dokumentation von IBM sollte beim Arbeiten mit Web Services immer griffbereit sein.
Kommentar schreiben