Exemplo de Scripted REST API - streaming vs. serialização de objetos
Esses exemplos demonstram como enviar uma resposta JSON usando streaming e usando a serialização de objeto padrão.
Streaming versus serialização de objeto
Ao enviar uma resposta, você pode enviar uma resposta como um fluxo ou serializar um objeto. Há vantagens e desvantagens em qualquer abordagem. Escolha uma técnica com base nas necessidades da sua integração.
Geralmente, se o objeto de resposta for simples, puder ser representado como XML ou JSON e tiver um tamanho consistente, use a serialização de objeto. Se estiver usando um formato diferente de XML ou JSON ou se o tamanho da resposta variar, use o fluxo.
Fluxo da resposta
O uso de respostas de fluxo oferece vantagens em tempo de resposta, desempenho da instância e flexibilidade de conteúdo, mas adiciona complexidade adicional ao script. Ao usar o streaming, você é responsável por formatar a resposta, definir o status da resposta e definir o cabeçalho Content-Type. Ao transmitir uma resposta, o usuário solicitante recebe uma resposta rapidamente porque a resposta inteira não precisa ser criada antes de iniciar o fluxo.
Este exemplo demonstra um script de Recurso REST de script que retorna uma matriz de registros de incidentes usando fluxo.
/**
* Sample Scripted REST Resource that returns custom JSON objects with properties from Incident GlideRecords
* This sample uses ServiceNow JavaScript API to query incident records
* and then iterates over those records to build and stream a custom JSON object that
* includes some values from the incidents
*/
(function runOperation(/*RESTServiceRequest*/ request, /*RESTServiceResult*/ response) {
var writer = response.getStreamWriter(),
hdrs = {},
table = 'incident',
record_limit = 100,
gr = new GlideRecord(table);
hdrs['Content-Type'] = 'application/json';
response.setStatus(200);
response.setHeaders(hdrs);
gr.setLimit(record_limit);
gr.query();
// start building response object
writer.writeString("{\"results\":[");
// iterate over incident records and build JSON representations to be streamed out.
while (gr.next()) {
var incidentObj = {};
incidentObj.number = gr.number + '';
incidentObj.short_description = gr.short_description + '';
writer.writeString(global.JSON.stringify(incidentObj));
if (gr.hasNext()) {
writer.writeString(",");
}
}
// close the response object
writer.writeString("]}");
})(request, response);
Uma solicitação para este recurso retorna a seguinte resposta.
// sample response
/*
HTTP/1.1 200 OK
Content-Type: application/json
Server: ServiceNow
// sample response number of records returned has been truncated for this example
{
"results": [
{
"number": "INC0011301",
"short_description": "lorem ipsum short description 0 my new incident"
},
{
"number": "INC0011302",
"short_description": "lorem ipsum short description 1 my new incident"
},
{
"number": "INC0011303",
"short_description": "lorem ipsum short description 2 my new incident"
},
{
"number": "INC0011304",
"short_description": "lorem ipsum short description 3 my new incident"
},
{
"number": "INC0011309",
"short_description": "lorem ipsum short description 8 my new incident"
},
{
"number": "INC0011310",
"short_description": "lorem ipsum short description 9 my new incident"
},
{
"number": "INC0011311",
"short_description": "lorem ipsum short description 0 my new incident"
},
{
"number": "INC0011312",
"short_description": "lorem ipsum short description 1 my new incident"
},
{
"number": "INC0011313",
"short_description": "lorem ipsum short description 2 my new incident"
},
{
"number": "INC0011314",
"short_description": "lorem ipsum short description 3 my new incident"
},
{
"number": "INC0011315",
"short_description": "lorem ipsum short description 4 my new incident"
},
{
"number": "INC0011326",
"short_description": "lorem ipsum short description 15 my new incident"
}
]
}
*/
Paginação de fluxo
Para paginar tabelas grandes para que você envie somente um número limitado de registros por consulta, use o método GlideRecord com escopo/Global - chooseWindow(Number firstRow, Number lastRow, Booliano forceCount). O artigo da comunidade Registro Glide paginado + Suporte ao método GR expandido exemplifica como usar chooseWindow() para obter a paginação, que você pode adaptar ao seu caso de uso específico.
Como criar um objeto
O uso da serialização de objeto permite que você aproveite a serialização e a negociação de conteúdo fornecidas pela ServiceNow. Ao serializar um objeto em vez de fluxo, o objeto inteiro deve ser criado e serializado antes que o cliente receba uma resposta. Isso pode atrasar a resposta ou exigir uma grande quantidade de recursos do sistema se o objeto de resposta for muito grande. A serialização de objeto está disponível somente para respostas XML ou JSON. As respostas que usam um formato diferente devem usar fluxo.
Este exemplo retorna os mesmos dados de incidente que o exemplo de streaming, mas coleta todos os dados de resposta em uma matriz antes de enviar a resposta.
/**
* Sample Scripted REST Resource returns an array of custom JSON objects that include 2 incident properties.
* This sample uses ServiceNow JavaScript API to query incident records and then iterates
* over those records building a custom JSON object that includes 2 values from the incident records.
* note that because we are returning a simple JSON object we can rely on built in serialization
* to set the content-type header as well as response status. The 'result_arr' object will not be returned
* until it has been completely built and stored
*/
(function runOperation(/*RESTServiceRequest*/ request, /*RESTServiceResult*/ response) {
var table = 'incident',
record_limit = 100,
result_arr = [],
gr = new GlideRecord(table);
gr.setLimit(record_limit);
gr.query();
// iterate over incident records and build JSON representations to be streamed out.
while (gr.next()) {
var incidentObj = {};
incidentObj.number = gr.number + '';
incidentObj.short_description = gr.short_description + '';
result_arr.push(incidentObj);
}
return result_arr;
})(request, response);
Uma solicitação para este recurso retorna a seguinte resposta.
/*
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Server: ServiceNow
// sample response number of records returned has been truncated for this example
{
"result": [{
"short_description": "lorem ipsum short description 0 my new incident",
"number": "INC0011301"
}, {
"short_description": "lorem ipsum short description 1 my new incident",
"number": "INC0011302"
}, {
"short_description": "lorem ipsum short description 2 my new incident",
"number": "INC0011303"
}, {
"short_description": "lorem ipsum short description 3 my new incident",
"number": "INC0011304"
}, {
"short_description": "lorem ipsum short description 4 my new incident",
"number": "INC0011305"
}, {
"short_description": "lorem ipsum short description 5 my new incident",
"number": "INC0011306"
}, {
"short_description": "lorem ipsum short description 6 my new incident",
"number": "INC0011307"
}, {
"short_description": "lorem ipsum short description 7 my new incident",
"number": "INC0011308"
}, {
"short_description": "lorem ipsum short description 8 my new incident",
"number": "INC0011309"
}, {
"short_description": "lorem ipsum short description 9 my new incident",
"number": "INC0011310"
}]
}
*/