Chiamata di un servizio Web

Questo esempio illustra come effettuare una chiamata AJAX / REST direttamente da una macro a un servizio Web. È possibile integrare i dati dall'applicazione host alla chiamata al servizio Web o dal servizio Web all'applicazione host.

In questo esempio, viene chiamato il servizio REST CICSAcctsDemo di Verastream Host Integrator (VHI). È però possibile adattare facilmente il codice per chiamare qualsiasi servizio Web. Non si è limitati a VHI.

Nell'esempio, la chiamata passa attraverso un proxy configurato nel server di sessione (mostrato sotto) per evitare la complicazione "Same Origin Policy". Se si utilizza un servizio Web che supporta Cross-origin Resource Sharing (CORS) e si utilizza un browser recente, il proxy non è necessario.

Poiché la libreria jQuery è disponibile nelle macro, è possibile utilizzare direttamente la funzione $.post() per richiamare i servizi REST.

Questo esempio dimostra anche come eseguire il wrapping di una chiamata REST jQuery in una nuova promessa. La promessa restituita dalla funzione personalizzata sotto consente di utilizzare "yield" nel codice macro principale. Questo consente all'esecuzione della macro principale di attendere fino al completamento della chiamata del servizio prima di continuare.

 var macro = createMacro(function*() {
  'use strict';
  
  // Creare alcune variabili da utilizzare successivamente
  var username;
  var password;
  var accountNumber;
  var accountDetails;
  
  // Creare una funzione che effettuerà una chiamata AJAX / REST al servizio Web VHI.
  // Può essere modificata per chiamare qualsiasi servizio, non solo VHI.
  // Se non si utilizza CORS, è probabile che la richiesta debba passare
  // attraverso un proxy nel server di sessione. Per ulteriori informazioni, vedere le note dell'esempio.
  /**
   * Funzione helper codificata manualmente per incapsulare i parametri AJAX / REST, richiamare il
   * servizio REST e restituire i risultati in un oggetto Promise.
   * @param {Number} acctNum per inviare la query REST.
   * @param {String} username per accedere al servizio REST.
   * @param {String} password per accedere al servizio REST.
   * @return {Promise} contenente i risultati di $.post() compatibili con yield.
  */
  var getAccountDetails = function (acctNum, username, password) {
    var url = "proxy1/model/CICSAcctsDemo/GetAccountDetail";
    var args = {"filters": {"AcctNum": acctNum}, "envVars": {"Username": username, "Password": password}};
    
    // Eseguire il wrapping di una chiamata jQuery AJAX / HTTP POST in un nuovo oggetto Promise.
    // L'oggetto Promise restituito qui consente alla macro di eseguire yield / wait
    // per il completamento.
    return Promise.resolve($.post(url, JSON.stringify(args)))
      .catch(function (error) {
      // Mappare gli errori che si verificano nella chiamata jQuery all'oggetto Promise.
      throw new Error('REST API Error: ' + error.statusText);
    });
  };
  
  // Inizio della macro generata
  var ps = session.getPresentationSpace();
  try {
    // Qui è possibile interagire con l'host, accedere all'app host ecc.
    // Raccogliere nome utente e password
    username = yield ui.prompt('Username:');
    password = yield ui.prompt('Password:', null, true);
    accountNumber = yield ui.prompt('Account Number:');
    if (!username || !password || !accountNumber) {
      throw new Error('Username or password not specified');
    }
    
    // Richiamare il servizio REST esterno e utilizzare yield / wait per completare la chiamata.
    accountDetails = yield getAccountDetails(accountNumber, username, password);
    
    // Sono ora disponibili i dati del servizio esterno.
    // È possibile integrare i dati nell'app host locale o semplicemente mostrarli all'utente.
    // Per questo esempio, verranno semplicemente visualizzati i dettagli del conto.
    if (accountDetails.result && accountDetails.result.length > 0) {
      yield ui.message(accountDetails.result[0].FirstName + ' $' + accountDetails.result[0].AcctBalance);
    } else {
      yield ui.message('No records found for account: ' + accountNumber);
    }
  } catch (error) {
    // Se si è verificato un errore durante la chiamata AJAX / REST
    // o nella raccolta di nomeutente / password, l'operazione terminerà qui.
    yield ui.message(error.message);
  }
});

// Eseguire la macro
return macro();

Supporto di scripting proxy tra origini

Se sono presenti servizi Web che non supportano CORS, le chiamate AJAX/REST avranno esito negativo se tentano di accedere a un server diverso da quello in cui è stata originata l'applicazione Host Access for the Cloud. Si tratta di una funzione di sicurezza del browser.

Il server Host Access for the Cloud fornisce un modo esplicito per agire da proxy per i server remoti attendibili.

  • Aprire ..\<directory-installazione>\sessionserver\microservice\sessionserver\service.yml per effettuare modifiche.

  • Nella sezione env, aggiungere:

    name: zfe.proxy.mappings
         value: percorso-proxy=indirizzo-destinazione-proxy

    Dove percorso-proxy si riferisce alla mappatura URL desiderata e indirizzo-proxy=indirizzo-destinazione-proxy si riferisce all'URL dove la chiamata verrà trasferita tramite proxy.

  • In questo esempio:

    name: zfe.proxy.mappings
         value: percorso-proxy=indirizzo-destinazione-proxy

    Le chiamate effettuate a <server:port>/proxy1 saranno delegate a http://remote-vhi-server:9680/vhi-rs/

  • È possibile specificare più mappature proxy utilizzando una virgola per separare le singole mappature

  • Tenere presente che anche quando un server REST supporta intestazioni CORS, alcuni browser meno recenti potrebbero non supportarle, perciò questi esempio potrebbe comunque essere rilevante.

SUGGERIMENTO:Il file service.yml può essere sostituito quando si distribuisce nuovamente Host Access for the Cloud. Creare sempre una copia di backup dei file.