Beispiel 2: Abrufen bestimmter Datensätze aus einer Drittparteiquelle
In diesem Beispiel erstellen wir ein Skript, um bestimmte Arten von Incident-Datensätzen aus einer Drittparteiquelle abzurufen.
/**
* 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);
Diese Code-Fragmente sind in diesem Skript von Bedeutung:
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 sie direkt im Skript verwenden. In diesem Beispiel wird eine RESTMessageV2-API mit dem Namen verwendet Remote-Instanz-Incidents , Und die Funktion Alle Incidents , Wodurch alle Incident-Daten abgerufen werden. 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 abfragen GlideRecord.get(„<sys_id>“) , Dann v_query.isGet()` Ist „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 verarbeiten, z. B. mit Anrufer_ID Im vorangehenden Code-Fragment. Der Rest dieses 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 sie die Transformator-API, um erforderliche Datenumwandlungen 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. Jedes der Felder im Tabellenskript wird einem Element im externen Datensatz zugeordnet. Externe Datenelemente außerhalb dieser Zuordnung sind in der Remote-Tabelle nicht verfügbar.