Beispiel 2: Abrufen bestimmter Datensätze aus einer Drittanbieterquelle

  • Freigeben Version: Yokohama
  • Aktualisiert 30. Januar 2025
  • 3 Minuten Lesedauer
  • In diesem Beispiel erstellen wir ein Skript zum Abrufen bestimmter Arten von Incident-Datensätzen aus einer Drittanbieterquelle.

    Informationen zur Remotetabellen-API finden Sie unter:
    /**
     * Using `v_query`, add the rows to `v_table`
     */
    (function executeQuery(v_table, v_query) {
    	if (v_query.isGet()) {
    		bySysId(v_table, v_query, v_query.getSysId());
    	}
    	else if (v_query.getParameter("caller_id")) {
    		byCallerId(v_table, v_query, v_query.getParameter("caller_id"));
    	}
    	else {
    		fetchAllIncidents(v_table, v_query);
    	}
    ​
    	/**
    	 * fetch all incidents records from the remote instance
    	 */
    	function fetchAllIncidents(v_table, v_query) {
    		// Uses RestMessage with name 'Remote Instance Incidents' and function 'All Incidents'
    		// Create a RestMessage first which calls an external REST service
    		var restMessage = new sn_ws.RESTMessageV2('Remote Instance Incidents', 'All Incidents');
    		loadData(v_table, v_query, restMessage);
    	}
    ​
    	/**
    	 * fetches a specific record from the remote instance with Sys Id being `sys_id`
    	 */
    	function bySysId(v_table, v_query, sys_id) {
    		// Uses RestMessage with name 'Remote Instance Incidents' and function 'By SysId'
    		var restMessage = new sn_ws.RESTMessageV2('Remote Instance Incidents', 'By SysId');
    		// sets variable 'sys_id'
    		restMessage.setStringParameterNoEscape("sys_id", sys_id);
    		loadData(v_table, v_query, restMessage);
    	}
    ​
    	/**
    	 * fetches records from the remote instance with Caller (caller_id) being `caller_id`
    	 */
    	function byCallerId(v_table, v_query, caller_id) {
    		var restMessage = new sn_ws.RESTMessageV2('Remote Instance Incidents', 'By CallerId');
    		restMessage.setStringParameterNoEscape("caller_id", caller_id);
    		loadData(v_table, v_query, restMessage);
    	}
    ​
    	/**
    	 * Adds rows to `v_table` using `restMessage`
    	 */
    	function loadData(v_table, v_query, restMessage) {
    		try {
    			var response = restMessage.execute();
    			var responseBody = response.getBody();
    			
    			// if REST call ends up in an error, set the last error message which shows up
    			// at the bottom of the list view
    			if (response.haveError()) {
    				v_query.setLastErrorMessage(response.getErrorMessage());
    				// can use gs.error() or gs.addErrorMessage() while debugging
    				// gs.debug() messages visible in session debugger
    				// gs.debug(response.getErrorMessage());
    				return;
    			}
    		} catch (ex) {
    			v_query.setLastErrorMessage(ex.message);
    			// gs.debug(ex.message);
    			return;
    		}
    ​
    		var transformerDefinition = getTransformerDefinition();
    		var transformer = new sn_tfrm.Transformer(transformerDefinition, responseBody);
    		// transformer parses the responseBody and extracts rows
    		while (transformer.transform()) {
    			// row is field-value map e.g. { active:"true", number: "INC0000001"}
    			var row = transformer.getRow();
    			// you may do any additional transformations to the row like GlideDuration, GlideDataTime etc. For example,
    			// row.duration = new GlideDuration(row.duration);// finally add the row to the remote table
    			v_table.addRow(row);
    		}
    	}
    ​
    	/**
    	 * returns a sn_tfrm.TransformerDefinition, which defines the mapping of the table fields and elements in the response body
    	 */
    	function getTransformerDefinition() {
    		// create a rule list to map a field to its element path
    		var ruleList = new sn_tfrm.TransformerRuleList()
    			.fromJSON() // the response body is a JSON
    			// 'active' field maps to path '$.active'
    			.addRule("active", "$.active")
    			.addRule("caller_id", "$.caller_id.value")
    			.addRule("number", "$.number")
    			.addRule("short_description", "$.short_description")
    			.addRule("sys_id", "$.sys_id")
    			.addRule("updates", "$.sys_mod_count");
    ​
    		var recordPath = "$.result";
    		return new sn_tfrm.TransformerDefinition(ruleList, recordPath);
    	}
    ​
    })(v_table, v_query);

    Die folgenden Code-Fragmente sind in diesem Skript zu beachten:

    function fetchAllIncidents(v_table, v_query) {
    		// Uses RestMessage with name 'Remote Instance Incidents' and function 'All Incidents'
    		// Create a RestMessage first which calls an external REST service
    		var restMessage = new sn_ws.RESTMessageV2('Remote Instance Incidents', 'All Incidents');
    		loadData(v_table, v_query, restMessage);
    	}

    Sie können eine RESTMessage erstellen und direkt im Skript verwenden. In diesem Beispiel werden eine RESTMessageV2-API mit dem Namen Remote Instance Incidentsund die Funktion Alle Incidentsverwendet, die alle Incident-Daten abruft. Sobald eine Antwort vom Server zurückgegeben wurde, wird eine Fehlermeldung angezeigt, wenn beim Datenabruf Probleme auftreten.

    	function bySysId(v_table, v_query, sys_id) {
    		// Uses RestMessage with name 'Remote Instance Incidents' and function 'By SysId'
    		var restMessage = new sn_ws.RESTMessageV2('Remote Instance Incidents', 'By SysId');
    		// sets variable 'sys_id'
    		restMessage.setStringParameterNoEscape("sys_id", sys_id);
    		loadData(v_table, v_query, restMessage);
    	}
    

    Wenn Sie einen bestimmten Datensatz mit GlideRecord.get(“abfragen<sys_id> “) , dann ist v_query.isGet()` gleich „wahr“. Ruft den spezifischen Datensatz aus dem externen Service ab.

    function byCallerId(v_table, v_query, caller_id) {
    		var restMessage = new sn_ws.RESTMessageV2('Remote Instance Incidents', 'By CallerId');
    		restMessage.setStringParameterNoEscape("caller_id", caller_id);
    		loadData(v_table, v_query, restMessage);
    	}
    

    Sie können auch andere spezifische Abfragebedingungen im Skript behandeln, z. B. die Verwendung von caller_id im vorhergehenden Codefragment. Der Rest des Skripts funktioniert ähnlich wie Beispiel 1.

    	function getTransformerDefinition() {
    		// create a rule list to map a field to its element path
    		var ruleList = new sn_tfrm.TransformerRuleList()
    			.fromJSON() // the response body is a JSON
    			// 'active' field maps to path '$.active'
    			.addRule("active", "$.active")
    			.addRule("caller_id", "$.caller_id.value")
    			.addRule("number", "$.number")
    			.addRule("short_description", "$.short_description")
    			.addRule("sys_id", "$.sys_id")
    			.addRule("updates", "$.sys_mod_count");
    ​
    		var recordPath = "$.result";
    		return new sn_tfrm.TransformerDefinition(ruleList, recordPath);
    	}
    ​
    })(v_table, v_query);

    Wenn beim Datenabruf keine Probleme auftreten, wird der Datentext für die Datensätze abgerufen. Anschließend verwendet es die Transformator-API, um die erforderlichen Datentransformationen durchzuführen, extrahiert Zeilen und fügt dann der Remotetabelle eine Zeile für jeden Datensatz hinzu.

    getTransformerDefinition definiert das Schema des Datensatzes im externen API-Antworttext. Ordnet jedes der Felder im Tabellenskript einem Element im externen Datensatz zu. Externe Datenelemente außerhalb dieser Zuordnung sind in der Remotetabelle nicht verfügbar.