Exemplo 2: Recuperando registros específicos de uma fonte de terceiros
Neste exemplo, criamos um script para recuperar tipos específicos de registros de incidentes de uma origem de terceiros.
/**
* 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);
Estes snippets de código são importantes neste script:
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);
}
Você pode criar uma RestMessage e usá-la diretamente no script. Neste exemplo, ele usa uma API RESTMessageV2 com o nome de Incidentes de instância remotae a função Todos os incidentes, que obtém todos os dados do incidente. Depois que uma resposta é retornada do servidor, uma mensagem de erro é exibida se forem encontrados problemas na recuperação de dados.
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);
}
Quando você consulta um registro específico usando GlideRecord.get (“<sys_id> “) , Então v_query.isGet ()` é `verdadeiro`. Ele busca o registro específico do serviço externo.
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);
}
Você também pode lidar com qualquer outra condição de consulta específica no script, como usar caller_id no snippet de código anterior. O restante deste script funciona de maneira semelhante ao Exemplo 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);Se nenhum problema for encontrado na recuperação de dados, ele obterá o corpo dos dados para os registros. Em seguida, ele usa a API do Transformador para executar as transformações de dados necessárias, extrai linhas e adiciona uma linha para cada registro à tabela remota.
getTransformerDefinition define o esquema do registro no corpo da resposta da API externa. Ele mapeia cada um dos campos no script da tabela para um elemento no registro externo. Quaisquer elementos de dados externos fora deste mapeamento não estão disponíveis na tabela remota.