RESTful Webservices in todo4teams-Skripten
Im Abschnitt RESTful Webservices haben wir gezeigt, wie sie mit über ein REST-API Tickets in todo4teams erzeugen, ändern und abfragen können. todo4teams fungiert in dem Fall als Server, während Sie den Client implementieren.
Hier gehen wir den umgekehrten Weg und machen todo4teams zum Client eines externen RESTful Webservices. Sie können auf diese Weise Schnittstellen z.B. zu Microsoft Sharepoint, Salesforce, SAP oder vielen anderen Systemen herstellen. Wie Sie per RESTful-Webservices auf das entsprechende Zielsystem zugreifen, erfahren Sie bei jeweiligen Hersteller. Für eine grundlegende Einführung in REST und JSON nutzen Sie bitte die Suchmaschine ihrer Wahl.
In diesem Beispiel soll gezeigt werden, wie Sie einen Bestelldatensatz in einem Order-Managementsystem programmatisch verändern.
Der zu ändernde Datensatz hat die ID 7654. Um ihn zu ändern, muss ein HTTP-PUT-Request an die URL http://ordermanagemement.mycompany.net:8080/OrderManagement/rest/orders/7654 gesendet werden, der die Nutzdaten als JSON-Konstrukt beinhaltet.
In den (serverseitigen) todo4teams-Skripten (Start-Aktion, Übernahme-Aktion, Ende-Aktion) stehen Ihnen die Java-Bibliotheken des Jersey-Projektes (jersey.java.net) sowie net.sf.json für das JSON-Handling zur Verfügung.
Da hier viele Java-Klassen aus Fremdbibliotheken genutzt werden, bereitet unser Skript die Nutzung in Javascript mit folgenden Zeilen vor und macht die Java-Typen im Skript bekannt:
var StringArray = Java.type("java.lang.String[]");
var JsonType = Java.type("net.sf.json.JSONObject");
var ClientConfig = Java.type("org.glassfish.jersey.client.ClientConfig");
var ClientBuilder = Java.type("javax.ws.rs.client.ClientBuilder");
var Entity = Java.type("javax.ws.rs.client.Entity");
var UriBuilder = Java.type("javax.ws.rs.core.UriBuilder");
Die folgenden Zeilen erzeugen ein "WebTarget" - das Zielsystem unseres Services. Das Zielsystem akzeptiert json als Datenaustauschformat
var accept = new StringArray(1);
accept[0]=new java.lang.String("application/json");
var config = new ClientConfig();
var client = ClientBuilder.newClient(config);
var target = client.target(UriBuilder.fromUri("http://ordermanagemement.mycompany.net:8080/OrderManagement").build());
Die Nutzdaten werden als JSONObject vorbereit, um sie komfortabel ins JSON-Format übertragen zu können:
var orderid = 7654;
json.put("id", orderid);
json.put("state", 1);
json.put("approvalComment", "Ok, approved!");
Der eigentliche REST-Aufruf geschieht damit wie folgt. Das Nutzdatenauftrag wird in eine JSON-Zeichenkette konvertiert und an das Ziel gesendet:
accept[0]=new java.lang.String("application/json");
var response = target.path("rest").path("orders").path(orderid).request(accept).put(Entity.json(payload));
Die Aufrufe der path-Methode erzeugen den Pfad der oben angegebenen URL http://ordermanagemement.mycompany.net:8080/OrderManagement/rest/orders/7654. Über die accept-Methode wird dem WebTarget mitgeteilt, das die Datenübertragung im JSON-Format stattfindet. Alternativ könnte hier auch XML verwendet werden, wenn payload entsprechend als XML-Code erzeugt wird.
Als Ergebnis erhalten wir in response ein Objekt vom Typ javax.ws.rs.core.Response, das uns über das status-Attribut den HTTP-Status 204 anzeigt "No Content Die Anfrage wurde erfolgreich durchgeführt, die Antwort enthält jedoch bewusst keine Daten.".
Für ein einfaches Copy&Paste ist hier noch einmal das komplette Skript:
var JsonType = Java.type("net.sf.json.JSONObject");
var ClientConfig = Java.type("org.glassfish.jersey.client.ClientConfig");
var ClientBuilder = Java.type("javax.ws.rs.client.ClientBuilder");
var Entity = Java.type("javax.ws.rs.client.Entity");
var UriBuilder = Java.type("javax.ws.rs.core.UriBuilder");
var config = new ClientConfig();
var client = ClientBuilder.newClient(config);
var target = client.target(UriBuilder.fromUri("http://ordermanagemement.mycompany.net:8080/OrderManagement").build());
var json = new JsonType;
//json.putAll(order);
var orderid = 7654;
json.put("id", orderid);
json.put("state", 1);
json.put("approvalComment", "Ok, approved!");
var payload = json.toString();
var accept = new StringArray(1);
accept[0]=new java.lang.String("application/json");
var response = target.path("rest").path("orders").path(orderid).request(accept).put(Entity.json(payload));