Zuletzt bearbeitet vor einem Monat
von Andre Knieschewski

SuperX REST Schnittstelle

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

REST-Schnittstelle

Ab dem SuperX-Kernmodul 6.0 steht eine REST-Schnittstelle zur Verfügung, über die zentrale Funktionen von SuperX auch über Weboberflächen, Skripte und externe Anwendungen angesprochen werden können.

Die REST-Schnittstelle ergänzt die bestehenden SuperX-Funktionen. Vorhandene ETL-, Batch- und Maskenprozesse werden dabei nicht ersetzt, sondern über HTTP-Endpunkte zusätzlich erreichbar gemacht.

Zu den wichtigsten Einsatzbereichen gehören:

  • Komponentenverwaltung und ETL-Jobs
  • Status- und Protokollabfragen
  • SuperX-Masken und deren Eingabefelder
  • Ausführung von Masken und Abruf der Ergebnistabellen
  • Export von Berichtsergebnissen
  • Einbindung von SuperX-Funktionen in eigene Weboberflächen

In den folgenden Beispielen wird diese Beispielinstallation verwendet:

https://demo.superx-testserver.de/superx/

Bei einer eigenen Installation müssen lediglich Domain und gegebenenfalls der Kontextpfad angepasst werden.


Grundlagen

Die REST-Endpunkte befinden sich unterhalb von:

https://demo.superx-testserver.de/superx/ds/api/

Die Schnittstelle liefert überwiegend JSON zurück. Lesende Aufrufe werden in der Regel mit HTTP GET ausgeführt. Einige Funktionen benötigen HTTP POST, insbesondere das Ausführen von SuperX-Masken.

Die REST-Schnittstelle verwendet die normale SuperX-Authentifizierung. Wird sie aus einer bereits angemeldeten Browser-Sitzung aufgerufen, kann die vorhandene Session verwendet werden.


Einrichtung und Voraussetzungen

Die REST-Schnittstelle ist Bestandteil des Kernmoduls 6.0 und der SuperX-Webapp. Eine separate REST-Anwendung muss nicht installiert werden.

Voraussetzung ist zunächst eine grundsätzlich funktionierende SuperX-Installation:

  • die SuperX-Webapp ist über Tomcat erreichbar,
  • die Datenbankverbindung funktioniert,
  • ein aktueller Kernstand ist installiert,
  • die benötigten Modulverzeichnisse sind eingebunden,
  • die ETL- und Jobdefinitionen wurden eingelesen.

Aktuelles Kernpaket verwenden

Für die REST-Schnittstelle und die Komponentenverwaltung sollte ein aktuelles Kernpaket ab Kern 6.0 verwendet werden.

Beispiel:

wget https://super-ics.de/superx/dist/kern6.0b_superx_utf8_POSTGRES_patch.tar.gz

Bei einem Kern-Upgrade sollte darauf geachtet werden, dass keine veralteten Bibliotheken aus einem älteren Kernstand in WEB-INF/lib liegen bleiben.

Vor Änderungen sollten lokale Anpassungen und projektspezifische Konfigurationen gesichert werden.

Nach einem Upgrade sollten insbesondere folgende Dateien geprüft werden:

WEB-INF/classes/spring-batch.properties
WEB-INF/classes/hikari.properties
WEB-INF/classes/quartz.properties

Datenbankverbindung prüfen

Die REST-Schnittstelle verwendet die Datenbankverbindung der Webapp. In der dbforms-config.xml sollte der SpringBeanConnectionProvider verwendet werden:

<dbconnection connectionProviderClass="de.superx.db.SpringBeanConnectionProvider"
              default="true"
              id="datasourceBean"
              isJndi="false"
              isPow2="true"/>

Wenn hier noch eine ältere oder projektspezifische Verbindungsdefinition verwendet wird, kann die REST-Schnittstelle zwar grundsätzlich erreichbar sein, aber beim Zugriff auf Komponenten, Jobs oder Masken fehlschlagen.

module_ignore.properties prüfen

Für die Komponentenverwaltung muss folgende Datei vorhanden sein:

WEB-INF/conf/edustore/db/module/module_ignore.properties

Beispielinhalt:

ignore.modules=kennx,gxstage,bil

Fehlt die Datei, können beim Einlesen der Komponenten oder beim Aufruf der Komponentenliste Fehler auftreten.

Modulverzeichnisse bereitstellen

Die Komponentenverwaltung liest verfügbare Komponenten und ETL-Jobs aus:

WEB-INF/conf/edustore/db/module

Modulverzeichnisse können direkt dort abgelegt oder per symbolischem Link eingebunden werden.

Beispiel:

cd $WEBAPP/WEB-INF/conf/edustore/db/module
ln -s $MODUL_VERZEICHNIS .

Zusätzliche Kern-ETL-Dateien prüfen

Für einzelne Funktionen der Komponentenverwaltung werden zusätzliche ETL-Dateien benötigt, insbesondere für das Entladen und Wiedereinspielen von Konfigurationen.

Quellverzeichnis im SuperX-Git:

SUPERX_GIT/superx/WEB-INF/conf/edustore/db/install/conf/his1/edustore_update

Zielverzeichnis in der Webapp:

$WEBAPP/WEB-INF/conf/edustore/db/install/conf/his1/edustore_update

Benötigte Dateien:

  • edustore_kern_man_unload_config_ids.xml
  • edustore_kern_man_unload_config_pg.xml
  • edustore_kern_man_upload_config_ids.xml
  • edustore_kern_man_upload_config_pg.xml

Falls diese Dateien im verwendeten Kernpaket noch fehlen, müssen sie aus dem SuperX-Git ergänzt werden.

ETL-Steuerdaten einlesen

Nach Änderungen an Kern, Modulverzeichnissen oder Jobdefinitionen müssen die ETL-Steuerdaten neu eingelesen werden.

Beispiel:

cd $WEBAPP
java -classpath "./superx/WEB-INF/classes/:./superx/WEB-INF/lib/*:./superx/WEB-INF/lib_ext/*" \
  "de.superx.bin.ComponentAdminCLI" -r

Der Parameter -r liest die Komponenten- und Jobdefinitionen neu ein.

Alternativ kann dafür auch der entsprechende REST-Endpunkt verwendet werden:

https://demo.superx-testserver.de/superx/ds/api/etl/job/writeJobsToDb

Einzelnen Job über die CLI testen

Wenn unklar ist, ob ein Fehler in der REST-Schnittstelle oder bereits in der ETL-Konfiguration liegt, kann ein einzelner Job testweise direkt über die CLI gestartet werden.

Beispiel:

cd $WEBAPP
java -classpath "./superx/WEB-INF/classes/:./superx/WEB-INF/lib/*:./superx/WEB-INF/lib_ext/*" \
  "de.superx.bin.ComponentAdminCLI" -e hrstage_load_and_transform

Funktioniert der Job bereits über die CLI nicht, sollten zunächst Moduldateien, Pfade, Datenbanktabellen und ETL-Konfiguration geprüft werden.

Tomcat neu starten

Nach Änderungen an Bibliotheken, Klassen, Spring-Konfigurationen oder Moduldateien sollte Tomcat neu gestartet werden.

Beispiel:

systemctl restart tomcat10

Je nach Installation kann der Dienst auch anders heißen.

REST-Schnittstelle prüfen

Nach der Einrichtung sollten zunächst einfache Listenaufrufe getestet werden:

https://demo.superx-testserver.de/superx/ds/api/etl/list
https://demo.superx-testserver.de/superx/ds/api/etl/job/list

Wenn beide Aufrufe JSON zurückliefern, ist die REST-Schnittstelle für die Komponentenverwaltung grundsätzlich erreichbar.

Für Masken kann zusätzlich ein einfacher Formularaufruf getestet werden:

https://demo.superx-testserver.de/superx/ds/api/form/71030

Fehlersuche bei der Einrichtung

Bei Problemen sollten insbesondere folgende Punkte geprüft werden:

Problem Prüfung
REST-Endpunkt liefert HTTP 500 Tomcat-Log prüfen, Datenbankverbindung und Spring-Konfiguration kontrollieren.
Komponentenliste ist leer oder fehlerhaft Modulverzeichnis und module_ignore.properties prüfen.
Jobs fehlen ETL-Steuerdaten mit ComponentAdminCLI -r oder über /etl/job/writeJobsToDb neu einlesen.
Job funktioniert über REST nicht Denselben Job testweise über die CLI starten und Tomcat-Log prüfen.
Spezialjobs fehlen Zusätzliche ETL-XML-Dateien im Verzeichnis edustore_update prüfen.
REST-Aufruf funktioniert nach einem Upgrade nicht Bibliotheken in WEB-INF/lib sowie spring-batch.properties, hikari.properties und quartz.properties prüfen.
POST auf eine Maske liefert "Required request body is missing" Einen JSON-Body mitsenden, mindestens {}.
POST liefert "application/octet-stream is not supported" Header Content-Type: application/json setzen.

In einzelnen Testumgebungen kann es beim Einlesen der ETL-Steps außerdem zu Konflikten mit vorhandenen Datenbankindizes kommen. Ein solcher Eingriff sollte nur vorgenommen werden, wenn die konkrete Fehlermeldung darauf verweist.


Komponentenverwaltung und ETL

Über die ETL-Schnittstelle können Komponenten angezeigt, Jobs ermittelt und Verarbeitungsläufe gestartet oder überwacht werden.

Der Basis-Pfad lautet:

https://demo.superx-testserver.de/superx/ds/api/etl


Übersicht der wichtigsten ETL-Aufrufe

Die in der Tabelle angegebenen Aufrufe sind relativ zu der Basis-URL. Ein vollständiger Aufruf sieht zum Beispiel so aus:

https://demo.superx-testserver.de/superx/ds/api/etl/list
Funktion Methode Aufruf Zweck
Komponenten anzeigen GET ds/api/etl/list Liefert die bekannten beziehungsweise installierten SuperX-Komponenten mit technischen Informationen.
Installierbare Komponenten GET ds/api/etl/installables/list Zeigt Komponenten, die grundsätzlich installiert werden können.
Alle ETL-Jobs GET ds/api/etl/job/list Liefert alle bekannten ETL- und Batch-Jobs.
Jobs einer Komponente GET ds/api/etl/job/list/hrstage Zeigt nur die Jobs einer bestimmten Komponente.
Jobdetails GET ds/api/etl/job/hrstage_load_and_transform Liefert technische Informationen zu einem bestimmten Job.
Jobdefinitionen neu einlesen GET ds/api/etl/job/writeJobsToDb Liest die vorhandenen Jobdefinitionen erneut in die Datenbank ein.
Job starten GET ds/api/etl/job/execute/eduetl/hrstage_load_and_transform Startet einen bestimmten Job und liefert eine JobExecutionId zurück.
Installation starten GET ds/api/etl/job/install/hrstage Startet die Installation einer Komponente.
Upgrade starten GET ds/api/etl/job/upgrade/hrstage Startet ein Upgrade einer installierten Komponente.
Alle Upgrades starten GET ds/api/etl/job/upgrade_all Startet beziehungsweise verarbeitet anstehende Upgrades mehrerer Komponenten.
Komponente deinstallieren GET ds/api/etl/job/uninstall/hrstage Startet die Deinstallation einer Komponente.
Unload starten GET ds/api/etl/unload/hrstage Startet den Unload einer Komponente.
Transform starten GET ds/api/etl/transform/hrstage Startet die Transformation bereits vorhandener Daten.
Complete starten GET ds/api/etl/complete/hrstage Startet modulabhängige Abschlussarbeiten.
Installationsfunktionen GET ds/api/etl/installFunctions/hrstage Zeigt zusätzliche Installationsfunktionen einer Komponente.
Laufende Jobs GET ds/api/etl/running Zeigt aktuell laufende Jobs.
Jobstatus GET ds/api/etl/jobExecutionStatus/12345 Liefert den aktuellen Status einer Jobausführung.
Joblog GET ds/api/etl/jobLog/12345 Liefert das Protokoll einer Jobausführung.
Jobausführungen GET ds/api/etl/jobExecutionInfos Liefert Informationen zu Jobausführungen.
Job stoppen GET ds/api/etl/stop/12345 Stoppt eine bestimmte Jobausführung.
Job starten oder fortsetzen GET ds/api/etl/start/12345 Spricht eine vorhandene Jobausführung erneut an.
Alle Jobs stoppen GET ds/api/etl/job/stopAll Stoppt alle laufenden Jobs.

Typischer ETL-Ablauf

Eine Anwendung sollte die verfügbaren Jobs möglichst nicht fest hinterlegen, sondern dynamisch über die REST-Schnittstelle ermitteln.

Ein typischer Ablauf für ein Modulupdate ist:

1. Komponenten laden
   /etl/list

2. Jobs des Moduls laden
   /etl/job/list/hrstage

3. Gewünschten Job starten
   /etl/job/execute/eduetl/hrstage_unload_load_transform

4. Jobstatus abfragen
   /etl/jobExecutionStatus/12345

5. Jobprotokoll anzeigen
   /etl/jobLog/12345

Der Start eines Jobs liefert normalerweise eine JobExecutionId. Diese ID wird anschließend für Status- und Logabfragen verwendet.

Spezialjobs wie beispielsweise

kern_unload_config_special
kern_upload_config_special

können ebenfalls über den generischen Execute-Endpunkt gestartet werden.


SuperX-Masken und Berichte

Auch SuperX-Masken können über die REST-Schnittstelle angesprochen werden. Dadurch lassen sich Maskendefinitionen, Eingabefelder und Ergebnisdaten unabhängig von der klassischen SuperX-Oberfläche verwenden.

Als Beispiel wird im Folgenden die Maske mit der TID 71030 verwendet.


Übersicht der wichtigsten Masken- und Berichtsaufrufe

Die in der Tabelle angegebenen Aufrufe sind relativ zu der Basis-URL. Ein vollständiger Aufruf sieht zum Beispiel so aus:

https://demo.superx-testserver.de/superx/ds/api/form/71030
Funktion Methode Aufruf Zweck
Maskenaufbau laden GET ds/api/form/71030 Liefert die Eingabefelder der Maske mit Feldtypen, Defaultwerten, Auswahllisten und weiteren Eigenschaften.
Abhängige Felder aktualisieren POST ds/api/form/71030/inputupdate Berechnet abhängige Maskenfelder nach Änderung eines Eingabefeldes neu.
Informationen zur Maske GET ds/api/report?tid=71030 Liefert Metadaten der Maske wie TID, Name, Beschreibung und Sachgebiet.
Maske ausführen POST ds/api/report?tid=71030 Führt die Maske aus und liefert die Ergebnistabelle als JSON.
Ergebnis-Stylesheets GET ds/api/report/stylesheets?tid=71030 Zeigt die für die Maske verfügbaren Ergebnis-Stylesheets.
Sichten eines Feldes GET ds/api/report/views?tid=71030&fieldName=Institution Liefert die verfügbaren Sichten beziehungsweise Hierarchien eines Maskenfeldes.
Inhalt einer Sicht GET ds/api/report/view?tid=71030&fieldName=Institution&viewId=... Liefert den Inhalt einer bestimmten Sicht.
Bericht herunterladen POST ds/api/report/download?tid=71030 Erzeugt einen Export des Berichtsergebnisses.
Themenbaum GET ds/api/menu/tree Liefert den für den angemeldeten Benutzer sichtbaren SuperX-Themenbaum.
Teil des Themenbaums GET ds/api/menu?tid=71030 Liefert einen bestimmten Bereich des Themenbaums.

Masken verwenden

Der Aufruf

https://demo.superx-testserver.de/superx/ds/api/form/71030

liefert unter anderem:

  • Namen der Eingabefelder
  • Feldtypen
  • Beschriftungen
  • Pflichtfelder
  • Defaultwerte
  • Auswahllisten
  • Baum- beziehungsweise TreeSelect-Inhalte
  • verfügbare Stylesheets

Damit kann eine eigene Oberfläche die Eingabemaske dynamisch aufbauen.

Zum eigentlichen Ausführen einer Maske wird der Report-Endpunkt mit HTTP POST verwendet:

POST https://demo.superx-testserver.de/superx/ds/api/report?tid=71030

Der Request benötigt:

Content-Type: application/json

Auch wenn keine Maskenparameter gesetzt werden sollen, muss ein gültiger JSON-Body mitgegeben werden:

{}

Sollen Felder gesetzt werden, werden diese über den JSON-Body übergeben.

Beispiel:

{
  "Kennung": "admin",
  "Gruppe": "",
  "Name": "",
  "Institution": ""
}

Die Antwort enthält die Ergebnistabelle als JSON.


POST-Aufruf im Browser testen

GET-Aufrufe können direkt über die Adresszeile des Browsers getestet werden.

Für POST-Aufrufe kann beispielsweise in Firefox die Netzwerkanalyse verwendet werden:

  1. Entwicklertools mit F12 öffnen.
  2. Netzwerkanalyse auswählen.
  3. Einen REST-Aufruf markieren und Bearbeiten und erneut senden auswählen.
  4. Methode von GET auf POST ändern.
  5. Header ergänzen:
    Content-Type: application/json
  6. Unter Inhalt mindestens folgenden JSON-Body eintragen:
    {}
  7. Anfrage senden.

Ein korrekt übertragener leerer JSON-Body führt beispielsweise zu:

Content-Type: application/json
Content-Length: 2

Typische Fehler:

Fehler Ursache Lösung
Required request body is missing Der POST-Request enthält keinen Body. Mindestens {} als Inhalt mitsenden.
Content-Type 'application/octet-stream' is not supported Der Body wird ohne passenden Content-Type übertragen. Content-Type: application/json setzen.


Hinweise zur Verwendung

REST-Endpunkte können abhängig von ihrer Funktion Daten verändern oder umfangreiche Verarbeitungsläufe starten. Insbesondere Installation, Upgrade, Deinstallation und ETL-Jobs sollten daher nur für entsprechend berechtigte Benutzer verfügbar sein.

Für eigene Weboberflächen empfiehlt es sich, Komponenten, Jobs und Masken dynamisch über die REST-Schnittstelle zu ermitteln. Dadurch müssen neue Module, Spezialjobs oder zusätzliche Masken nicht fest in der Oberfläche hinterlegt werden.

Für die Komponentenverwaltung sind insbesondere die Kombinationen aus

/etl/list
/etl/job/list/{component}

und für Masken

/form/{tid}
/report?tid={tid}

relevant.