REST-Schnittstelle

Bei der REST-Schnittstelle findet die Kommunikation zwischen der Client-Anwendung und jadice server über normale HTTP-Aufrufe und die Methoden GET, POST und DELETE statt. Die Nachrichten werden dabei im XML- oder JSON-Format ausgetauscht.

Abbildung 7.3. Schematischer Aufbau der REST-Schnittstelle

Die REST-Schnittstelle nimmt über verschiedene Methoden Anfragen entgegen, führt die Verarbeitung durch und sendet Antworten im XML- oder JSON-Format zurück.

Tipp

Zur Entwicklung und zum Debugging von SOAP-Anfragen empfehlen wir soapUI und Postman.

Aufbau der REST-Schnittstelle

Um die REST-Schnittstelle nutzen zu können, muss sie zunächst wie im Abschnitt „Konfiguration REST-Schnittstelle“ beschrieben aktiviert werden und ist unter http://<hostname>:9001/jadiceServer/ erreichbar. Zur besseren Lesbarkeit wird der Hostname der URL (http://<hostname>:9001) in den nachfolgenden Abschnitten weggelassen.

Die folgenden Abschnitte geben eine kurze Übersicht über die zur Verfügung stehenden Methoden. Im Abschnitt „Ablauf der Verarbeitung über REST wird gezeigt, wie daraus der Ablauf einer Konvertierung zusammengesetzt wird.

Integrierte Dokumentation

Die REST-Schnittstelle verfügt über eine integrierte Dokumentation im Open API-Format (auch bekannt als swagger. Unter der URL /jadiceServer/swagger.json kann sie im JSON-Format bzw. unter /jadiceServer/swagger.yaml im YAML-Format abgerufen werden.

Unter der URL /jadiceServer/api-docs?url=/jadiceServer/swagger.json finden Sie eine interaktive Dokumentation der REST-Schnittstelle. Dort können Sie direkt aus dem Browser heraus die verfügbaren Methoden aufrufen:

Abbildung 7.4. Darstellung von Swagger UI

Mittels Swagger UI kann die REST-Schnittstelle aus dem Brower heraus bedient werden.


File-Service

Um Dateien hochzuladen, damit jadice server sie anschließend verarbeiten kann, oder um Ergebnisdateien von jadice server abzurufen, ist der File-Service zuständig. Dieser ist unter der URL /jadiceServer/files erreichbar.

Folgende Methoden sind damit möglich:

POST auf /jadiceServer/files
Hochladen einer neuen Datei. Der Rückgabewert ist die ID, unter der diese Datei in den nachfolgenden Schritten abrufbar ist (im Folgenden {fileId}).
GET auf /jadiceServer/files/{fileId}
Lädt eine Datei herunter. Ihr Dateiname und MIME-Type werden in die üblichen Header-Felder Content-Disposition und Content-Type übertragen.
DELETE auf /jadiceServer/files/{fileId}
Löscht eine Datei vom Server.

Template-Service

Über den Template-Service kann erfragt werden, welche Job-Templates zur Verfügung stehen. Sie folgen der im Abschnitt „Definition von Job-Templates“ dargestellten Syntax und liegen i. d. R. im Unterordner /server-config/jobtemplates.

Folgende Methoden stellt der Template-Service zur Verfügung:

GET auf /templates
Lädt die Liste aller verfügbaren Job-Templates herunter. Die Liste stellt die IDs dar, unter denen die einzelnen Job-Templates referenziert werden können (im Folgenden {templateId}).
GET auf /templates/{templateId}
Lädt ein bestimmtes Job-Template herunter. Da diese im XML-Format definiert werden, ist hier keine Rückgabe im JSON-Format möglich.

Job-Service

Der Job-Service wird dafür genutzt, um Konvertierungsanfragen an jadice server abzusenden und um sich über deren Fortschritt zu informieren. Ferner bündelt er die Informationen über die Ergebnis-Dokumente und Log-Meldungen, die während der Verarbeitung erzeugt werden.

Der Jobs-Service stellt folgende Methoden zur Verfügung:

POST auf /jadiceServer/jobs
Erstellen eines neuen Jobs, dessen Verarbeitung sofort angestoßen wird. Der Rückgabewert ist die ID, unter der dieser Job nachverfolgt werden kann (im Folgenden {jobID}).
GET auf /jadiceServer/jobs/{jobId}
Ruft den aktuellen Job-Zustand ab.
DELETE auf /jadiceServer/jobs/{jobId}
Entfernt die Informationen zu diesem Job vom Server. Falls dieser sich noch in der Verarbeitung befindet, wird er automatisch abgebrochen.

Ablauf der Verarbeitung über REST

Nachdem im vorherigen Abschnitt die einzelnen REST-Services kurz vorgestellt wurden, soll hier nun examplarisch der Ablauf einer Konvertierung dargestellt werden. Abbildung 7.5, „Sequenzdiagramm der Verarbeitung über REST zeigt diesen Ablauf in der Übersicht als UML-Sequenzdiagramm.

Abbildung 7.5. Sequenzdiagramm der Verarbeitung über REST


In den folgenden Schritten folgt eine textuelle Beschreibung, sowie je ein exemplarischer Request der Clientanwendung und die zugehörige Antwort von jadice server. In den Beispielen wird die Kommunikation im JSON-Format bevorzugt.

Anmerkung

  • In den Beispielen werden die HTTP-Header-Felder, die nicht zum Verständnis beitragen, weggelassen.
  • Der HTTP-Header und der Body werden durch eine Leerzeile getrennt dargestellt.
  • Zur besseren Lesbarkeit werden Umbrüche und Einrückungen in die JSON-Objekte eingefügt.

  1. Bevor ein Job an jadice server abgeschickt werden kann, muss zunächst ausgewählt werden, welches Job-Template verwendet werden soll. Um in Erfahrung zu bringen, welche Job-Templates zur Verfügung stehen, wird der Template-Service mit dem GET-Request auf /jadiceServer/templates/ ausgerufen. Das Ergebnis ist die Liste aller zur Verfügung stehenden Templates (bzw. deren IDs) im JSON- oder XML-Format. Wenn Sie auch den Inhalt des Templates kennen möchten, so kann das über den GET-Request auf /jadiceServer/templates/{templateId} heruntergeladen werden.

    Beispiel 7.13. Abfrage der verfügbaren Job-Templates

    Request Response
    GET /jadiceServer/templates HTTP/1.1
    Host: <hostname>:9001
    Accept: application/json
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
     "templates": [
      "mail2pdf.xml",
      "one-node.xml",
      "x2pdf.xml"
     ]
    }

    Beispiel 7.14. Abfrage eines einzelnen Job-Templates

    Request Response
    GET /jadiceServer/templates/x2pdf.xml HTTP/1.1
    Host: <hostname>:9001
    Accept: application/xml
    HTTP/1.1 200 OK
    Content-Type: application/xml
    
    <job (...) >
     (...)
    </job>

  2. Die zu verarbeitenden Dateien werden auf den Server hochgeladen: Für jede Datei, die konvertiert werden soll, erfolgt ein Upload in Form eines POST-Request mit dem Content-Type multipart/form-data auf /jadiceServer/files. Als Ergebnis gibt der Server die File-Id zurück, unter der diese Datei anschließend referenziert werden kann.

    Beispiel 7.15. Hochladen einer Datei

    Request Response
    POST /jadiceServer/files HTTP/1.1
    Host: <hostname>:9001
    Accept: text/plain
    Content-Type: multipart/form-data; boundary=----Boundary-12345
    
    ------Boundary-12345
    Content-Disposition: form-data; name="file"; filename="my-file.txt"
    Content-Type: text/plain
    
    Lorem Ipsum...
    ------Boundary-12345--
    HTTP/1.1 201 Created
    Content-Type: text/plain
    
    stream-uuid-0001


  3. Anschließend kann mit diesen Angaben ein Job formuliert werden, der an den JobService in Form eines POST-Requests auf /jadiceServer/jobs geschickt wird. Der Service gibt die Job-Id zurück, unter der dieser Job nachverfolgt werden kann.

    Beispiel 7.16. Starten eines Jobs

    Request Response
    POST /jadiceServer/jobs HTTP/1.1
    Host: <hostname>:9001
    Accept: text/plain
    Content-Type: application/json
    
    {
      "templateId": "x2pdf.xml",
      "templateParameters": {},
      "inputFiles": [
        {
          "fileId": "stream-uuid-0001"
        }
      ]
    }
    HTTP/1.1 201 Created
    Content-Type: text/plain
    
    job-uuid-0001


  4. Der aktuelle Zustand des Jobs wird über den GET-Request auf /jadiceServer/jobs/{jobId} ermittelt. Es muss gewartet werden, bis dieser im Zustand FINISHED ist. Falls der Job nicht erfolgreich verarbeitet werden kann, endet er im Zustand FAILED, siehe Job.State.

    Beispiel 7.17. Aktuellen Status des Jobs abfragen

    Request Response
    GET /jadiceServer/jobs/job-uuid-0001 HTTP/1.1
    Host: <hostname>:9001
    Accept: application/json
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
     "templateId":"x2pdf.xml",
     "templateParameters":{},
     "id":"job-uuid-0001",
     "state":"FINISHED",
     "inputFiles":[
      {
       "fileId":"stream-uuid-0001",
       "nodeId":null
      }
     ],
     "resultFiles":[
      {
       "fileId":"stream-uuid-0002",
       "nodeId":"node2"
      }
     ]
    }


  5. Die erzeugten Dateien, deren File-Ids in der Antwort des Job-Service genannt werden, können einzeln über je einen GET-Request auf /jadiceServer/files/{fileId} heruntergeladen werden.

    Beispiel 7.18. Herunterladen einer Datei

    Request Response
    GET /jadiceServer/files/stream-uuid-0002 HTTP/1.1
    Host: <hostname>:9001
    Accept: application/octet-stream
    HTTP/1.1 200 OK
    Content-Type: application/pdf
    Content-Disposition: attachment; filename=my-file.pdf
    Content-Description: my-file.pdf
    
    %PDF-1.4...


  6. Abschließend müssen alle Resourcen, die nicht mehr für eine weitere Konvertierung benötigt werden, gelöscht werden:

    • Die hochgeladenen und die erzeugten Dateien werden jeweils per DELETE-Request auf /jadiceServer/files/{fileId} gelöscht.

      Beispiel 7.19. Löschen einer Datei

      Request Response
      DELETE /jadiceServer/files/stream-uuid-0001 HTTP/1.1
      Host: <hostname>:9001
      Accept: application/json
      HTTP/1.1 204 No Content


    • Der Job wird per DELETE-Request auf /jadiceServer/jobs/{jobId} gelöscht.

      Beispiel 7.20. Löschen des Jobs

      Request Response
      DELETE /jadiceServer/jobs/job-uuid-0001 HTTP/1.1
      Host: <hostname>:9001
      Accept: application/json
      HTTP/1.1 204 No Content


    Wichtig

    Das Löschen von nicht mehr benötigten Dateien und Jobs ist essenziell. Diese Ressourcen werden nicht automatisch von jadice server gelöscht und belegen u. U. unnötigen Platz auf der Festplatte und im Arbeitsspeicher.

Generierung von REST-Clients

Mit Hilfe der Open API-Spezifikation der REST-Schnittstelle und dem Kommandozeilenwerkzeug swagger-codegen ist es möglich, eine Client-Bibliothek zu generieren, die in der gewünschten Implementierungssprache genutzt werden kann. Laden Sie dazu zunächst die Bibliothek swagger-codegen-cli-<version>.jar von http://swagger.io/swagger-codegen/ herunter.

Für welche Sprachen swagger-codegen Client-Bibliotheken erzeugen kann, verrät der Aufruf von java -jar swagger-codegen-cli-<version>.jar:

Available languages: [android, aspnet5, async-scala, cwiki, csharp, cpprest, dart, flash, python-flask,
go, groovy, java, jaxrs, jaxrs-cxf, jaxrs-resteasy, jaxrs-spec, inflector, javascript, javascript-closure-angular,
jmeter, nancyfx, nodejs-server, objc, perl, php, python, qt5cpp, ruby, scala, scalatra, silex-PHP, sinatra,
rails5, slim, spring, dynamic-html, html, html2, swagger, swagger-yaml, swift, tizen, typescript-angular2,
typescript-angular, typescript-node, typescript-fetch, akka-scala, CsharpDotNet2, clojure, haskell, lumen, go-server]

Ein einfacher Java-Client wird mit diesem Kommandozeilenaufruf erzeugt:

java -jar swagger-codegen-cli-<version>.jar generate
  --lang java
  --input-spec http://<hostname>:9001/jadiceServer/swagger.json

swagger-codegen bietet diverse Optionen, um die generierte Client-Bibliothek anzupassen. Im folgenden Beispiel werden der Ausgabeordner und die Namespaces angepasst:

java -jar swagger-codegen-cli-2.2.1.jar generate
  --lang java
  --input-spec http://<hostname>:9001/jadiceServer/swagger.json
  --output generated-client
  --invoker-package com.acme.invoker --model-package com.acme.model --api-package com.acme.api

Abbildung 7.6, „Von swagger-codegen erzeugtes Java-Projekt“ zeigt die Klassen, die als Ergebnis generiert werden.

Abbildung 7.6. Von swagger-codegen erzeugtes Java-Projekt

Die mit Hilfe von swagger-codegen generierten Klassen, können direkt in der IDE genutzt werden.


[jadice server Version 5.8.7.0: Dokumentation für Entwickler und Administratoren. Veröffentlicht: 2021-04-15]