Twitter
facebook
Warenkorb
31.05.12 12:43

Webservices aus RPG aufrufen

Kategorie: Programmierung
Von: Klaus-Peter Luttkus
Mit dem IBM Shell Script wsdl2ws.sh Webservice Stubs generien und aus eigenen RPG-Programmen aufrufen

Für die i-Betriebsystem-Versionen V5R4, V6R1 und V7R1 stellt IBM einen Programmgenerator bereit, der sogenannte RPG-Stubs generiert, mit denen dann auf Webservices zugegriffen werden kann.

Voraussetzungen

Folgende Voraussetzungen sind dabei zu beachten.

(Quelle: IBM)

Beachten Sie bitte weiter, dass Sie mindesten neben diesen Grundvoraussetzungen die aktuelle JAVA PTF-Gruppe installiert haben. 

Damit Sie die Funktionsfähigkeit eines Service testen können, sollten Sie sich auf alle Fälle die freie Version von SOAPUI herunterladen.

 

Nachdem Sie SOAPUI installiert haben, sollten Sie unbedingt den aufzurufenden Webservice testen

Webservice testen

Um den Test durchführen zu können, benötigen Sie das WSDL des Webservice bzw. dessen URI.

Sie erstellen sodann in SOAPUI ein neues Projekt, tragen dort den URI des Webservices ein und öffnen dann das Verzeichnis Request 1.

 

 

Sie sehen dann die request message für den Webservice. Dort wo ein Fragezeichen erscheint erwartet der Webservice einen an den Service zu übertragenden Parameter.

Tragen Sie hier einen für den Test plausiblen Wert ein.

 

Klicken Sie dann auf den kleinen grünen Pfeil links oben und der SOAPUI-Client führt eine Anfrage auf den zu testenden Webservice durch. Sie erhalten jetzt eine response message vom Webservice.

Ist die Nachricht plausibel, so können Sie den nächsten Schritt wagen.

RPG-Stubs generieren

Um jetzt die RPG-Stubs zu generieren, gehen Sie in einer 5250 Sitzung in die Qshell.

Gehen Sie mit dem Befehl cd in folgendes Verzeichnis

cd /qibm/proddata/os/webservices/v1/client/bin

und  lassen Sie sich danach mit dem Befehl ls –l den Inhalt des Verzeichnisses anzeigen

 

Im Verzeichnis sollten Sie folgende Shell-Scripte finden

  • wsdl2rpg.sh
  • wsdl2ws.sh

Ich werde hier das Script wsdl2ws.sh verwenden. Bei entsprechender Parametrisierung wird dieses Script wsdl2rpg.sh aufrufen. 

wsdl2ws.sh erwartet mehrere Parameter

  • -o:       IFS-Pfad in den generierte Quellen gestellt werden
  • -l:        die Sprache in der die Stubs generiert werden
  • -s:       Der IFS-Pfad zu einer Bibliothek in der die Stub-Objekte gespeichert werden.
    Wichtig: Es wird ein Service-Programm generiert
  •  Der URI des WSDL-Dokuments

In der Qshell würde dann der Aufruf von wsdl2ws.sh folgendermaßen aussehen

In nur wenigen Momenten werden dann die Stub - Quellen und – Objekte an den genannten Lokationen erstellt.

Um jetzte Ihr Webservice verarbeitendes Programm zu schreiben, sollte Sie sich ein wenig in den generierten RPG-Quellen orientieren können.

RPG-Stub Quellen analysieren

Die erste für Sie wichtige Datei heißt diesem Fall dsaWsPortType.rpgleinc, wobei dsaWs der Name des von mir angesprochenen Webservices ist. Sprechen Sie einen anderen Service an, so wird als Präfix der Name Ihres Webservice hier erscheinen.

Diese Quelle enthält die Prototypen von drei Prozeduren, die Sie später in Ihrem Programm aufrufen müssen:

Stub_create...

 

Mit diese Prozedur wird der Speicher für den Aufruf des Webservice instantiiert und initialisiert

Stub_destroy...

 

Mit diese Prozedur wird der Speicher für den Aufruf des Webservice freigegeben. 

Stub_op...

Mit dieser Prozedur wird der Webservice aufgerufen.

Beachten Sie, dass dieser Webservice einen Parameter erwartet (Value0), dessen Datentyp von xsd_string abgeleitet wird. Der Rückgabewert out wird hier von xsd_int abgeleitet.

Das RPG-Programm

Die Quelle des zu erstellenden Programm erzeuge ich ebenfalls im IFS.

Ich kommentiere nur die für die Problemstellung relevanten Bereiche

 

     h main(mainProc)

     h dftactgrp(*no)

     h actgrp(*new)

 

     h bnddir('GETCRDTP')

Erstellen Sie für die Erstellung des Programms ein Binderverzeichnis. Dieses muss mindestens zwei Einträge beinhalten

 

QAXIS10CC: dieses ist ein Serviceprogramm, dass via Lizenzprogramminstallation auf Ihrem System gespeichert ist

GETSPCDT: Dieses Serviceprogramm wurde durch wsdl2ws.sh erstellt

 

      /include dsaWsPortType.rpgleinc

 

Includieren Sie die durch wsdl2ws.sh generierte Quelle, die wir oben besprochen haben

          d mainProc...

     d                 PR                  extpgm('GETCRDTP')

     d inpCardNumber...

     d                                 A   len(30)

     d                                     const

     d outCardTypeNum                 2S 0

     d outErrorMessage...

     d                               A   len(100)

Ein- und Ausgabeparameter des Programms 

     p mainProc...

     p                 B

     d                 PI

     d inpCardNumber...

     d                                 A   len(30)

     d                                     const

     d outCardTypeNum                 2S 0

     d outErrorMessage...

     d                               A   len(100)

          d lclCardNumber...

     d                               A   len(30)

          d outCardTypeInt  S              5U 0 inz 

     d WsStub          DS                  likeds(This_t)

 

Die Datenstruktur WsStub repräsentiert den Speicher des Webservice im Programm. Leiten Sie die Struktur von This_t ab.

 

     d Input           DS                  likeds(xsd_string)

Das Feld Input ist der Eingabeparameter zum Webservice und muss hier von xsd_string abgeleitet werde.(siehe oben) 

     d Result          DS                  likeds(xsd_int)

Das Feld Result ist der Rückgabeparameter des Webservice und muss hier von xsd_int abgeleitet werde.(siehe oben) 

      /free

       

       clear WsStub;

       clear outErrorMessage;

 

       // Input zum Service versorgen

 

       clear input;

       lclCardNumber = inpCardNumber;

               input.value = %trim(lclCardNumber);

 

       // Stub holen

 

       if stub_create_dsaWsPortType(WsSTub) = *ON;

 

Den Speicher des Webservice instantiieren.

 

          if stub_op_validateCard(WsStub:Input:Result) = *on;

 

Den Webservice aufrufen..

                                 outCardTypeInt = Result.value;

             outCardTypeNum = outCardTypeInt;

Wird der Webservice erfolgreich aufgerufen, so wird der Rückgabewert Result.value in entsprechende Programmvariablen gestellt.

 

          else;

 

             outErrorMessage = WsSTub.excString;

 

Wird der Webservice nicht erfolgreich aufgerufen, so wird eine Fehlernachricht zurückgegeben.

 

          endif;

 

 

         stub_destroy_dsaWsPortType(WsStub);

 

Den Speicher des Webservice wird freigegeben.

       endif; 

       return;

      /end-free

     p                 E

Weitere Informationen Beispiele, Hinweise etc finden Sie auf der Homepage der IBM: 

http://www-03.ibm.com/systems/i/software/iws/index.html

 

Keine Kommentare
Kommentar schreiben

* - Pflichtfeld

*




*
Terminübersicht