Aufrufen eines Webdienstes

Dieses Beispiel zeigt, wie direkt über ein Makro ein AJAX / REST-Aufruf an einen Webdienst ausgeführt wird. Sie können Daten über Ihre Hostanwendung in den Aufruf des Webdienstes oder umgekehrt über den Webdienst in Ihre Hostanwendung integrieren.

In diesem Beispiel wird der 'Verastream Host Integrator (VHI) CICSAcctsDemo REST'-Dienst aufgerufen. Sie können den Code natürlich auch problemlos anpassen und einen anderen Webdienst aufrufen. Sie sind nicht an den VHI-Dienst gebunden.

In diesem Beispiel wird der Aufruf über einen im Sitzungsserver konfigurierten Proxy durchgeführt (wie unten beschrieben), um „Same-Origin-Policy“-Komplikationen zu vermeiden. Wenn Sie einen Webdienst verwenden, der die Cross-origin Resource Sharing (CORS, Ressourcenfreigabe zwischen verschiedenen Ursprüngen) unterstützt, und wenn Sie einen modernen Browser verwenden, ist der Proxy nicht erforderlich.

Die jQuery-Bibliothek ist in Makros verfügbar, sie können zum Aufrufen von REST-Diensten also direkt die $.post()-Funktion verwenden.

In dem Beispiel wird außerdem beschrieben, wie ein jQuery REST-Aufruf in einem neuen Promise-Muster umbrochen wird. Das über die nachstehende benutzerdefinierte Funktion zurückgegebene promise-Muster ermöglicht die Verwendung von „yield“ im Hauptmakrocode. Dadurch kann die Hauptmakroausführung warten, bis der Dienstaufruf abgeschlossen ist, bevor sie fortgesetzt wird.

 var macro = createMacro(function*() {
  'use strict';
  
  // Einige Variablen für eine spätere Verwendung erstellen;
  var username;
  var password;
  var accountNumber;
  var accountDetails;
  
  // Eine Funktion erstellen, die einen AJAX / REST-Aufruf an einen VHI-Webdienst ausführt.
  // Kann für den Aufruf eines beliebigen Webdienstes (nicht nur VHI) angepasst werden.
  // Wenn nicht CORS verwendet wird, muss die Anforderung wahrscheinlich einen
  // Proxy auf dem Sitzungsserver durchlaufen. Siehe Beispielhinweise für weitere Informationen.
  /**
    * Hartcodierte Unterstützungsfunktion zum Einschließen von AJAX / REST-Parametern, zum Aktivieren des
    * REST-Dienstes und zum Zurückgeben der Ergebnisse in einem Promise-Objekt.
    * @param {Number} Kontonummer zum Senden an die REST-Abfrage.
    * @param {String} Benutzername für den Zugriff auf den REST-Dienst.
    * @param {String} Passwort für den Zugriff auf den REST-Service.
    * @return {Promise} enthält $.post()-Ergebnisse, die mit yield kompatibel sind.
  */
  var getAccountDetails = function (acctNum, username, password) {
    var url = "proxy1/model/CICSAcctsDemo/GetAccountDetail";
    var args = {"filters": {"AcctNum": acctNum}, "envVars": {"Username": username, "Password": password}};
    
    // jQuery AJAX / HTTP POST-Aufruf in einem neuen Promise-Objekt umbrechen.
    // Das hier zurückgegebene Promise-Objekt ermöglicht dem Makro über yield / wait
    // auf seinen Abschluss zu warten.
    return Promise.resolve($.post(url, JSON.stringify(args)))
      .catch(function (error) {
      // Fehler zuordnen, die im jQuery-Aufruf an unser Promise-Objekt auftreten.
      throw new Error('REST API Error: ' + error.statusText);
    });
  };
  
  // Start generiertes Makro
  var ps = session.getPresentationSpace();
  try {
    // Konnte hier mit dem Host interagieren, sich bei einer Hostanwendung anmelden usw.
    // Benutzername und Kennwort erfassen
    username = yield ui.prompt('Username:');
    password = yield ui.prompt('Kennwort:', null, true);
    accountNumber = yield ui.prompt('Kontonummer:');
    if (!username || !password || !accountNumber) {
      throw new Error('Kein Benutzername oder Kennwort angegeben');
    }
    
    // Externen REST-Dienst aktivieren, und yields / wartet auf den Abschluss des Aufrufs.¨
    accountDetails = yield getAccountDetails(accountNumber, username, password);
    
    // Jetzt haben wir die Daten von unserem externen Dienst.
    // Können die Daten in unsere lokale Hostanwendung integrieren oder die Daten einfach dem Benutzer anzeigen.
    // In diesem Beispiel zeigen wir einfach die sich ergebenden Kontodetails an.
    if (accountDetails.result && accountDetails.result.length > 0) {
      yield ui.message(accountDetails.result[0].FirstName + ' $' + accountDetails.result[0].AcctBalance);
    } else {
      yield ui.message('Kein Datensatz für folgendes Konto gefunden: ' + accountNumber);
    }
  } catch (error) {
    // Wenn während des AJAX / REST-Aufrufs
    // oder beim Erfassen von Benutzername/Kennwort ein Fehler auftritt, befinden wir uns hier.
    yield ui.message(error.message);
  }
});

// Unser Makro ausführen
return macro();;

Proxy-Unterstützung für die Skripterstellung aus verschiedenen Ursprüngen

Bei Webdiensten, die CORS nicht unterstützen, treten bei AJAX/REST-Aufrufen Fehler auf, wenn sie versuchen, auf einen nicht aus der Host Access for the Cloud-Anwendung stammenden Server zuzugreifen. Dabei handelt es sich um eine Browser-Sicherheitsfunktion.

Der Host Access for the Cloud-Server bietet eine Möglichkeit, explizit einen Proxy zu verbürgten Remoteservern bereitzustellen.

  • Öffnen Sie ..\<Installationsverzeichnis>\sessionserver\microservice\sessionserver\service.yml zur Bearbeitung.

  • Fügen Sie im Abschnitt env Folgendes hinzu:

    name: zfe.proxy.mappings
         value: proxy-path=proxy-to-address

    Dabei bezieht sich „proxy-path“ auf die gewünschte URL-Zuordnung und „proxy-to-address“ auf die URL, bei der der Aufruf über einen Proxy gesendet wird.

  • In diesem Beispiel:

    name: zfe.proxy.mappings
         value: proxy1=http://remote-vhi-server:9680/vhi-rs/

    Aufrufe für <Server:Port>/proxy1 werden über einen Proxy an http://remote-vhi-server:9680/vhi-rs/ gesendet.

  • Mehrere Proxyzuordnungen können angegeben werden, indem die einzelnen Zuordnungen durch ein Komma getrennt werden.

  • Bitte beachten Sie: Ein REST-Server unterstützt zwar CORS-Titel, ältere Browser tun dies jedoch nicht. Daher kann dieses Beispiel weiterhin relevant sein.

TIPP:Die service.yml-Datei kann ersetzt werden, wenn Sie Host Access for the Cloud neu bereitstellen. Denken Sie daran, immer Ihre Dateien zu sichern.