Exemplo de REST API com script - streaming versus serialização de objetos
Esses exemplos demonstram como enviar uma resposta JSON usando streaming e usando serialização de objetos padrão.
Streaming versus serialização de objetos
Ao enviar uma resposta, você pode enviar uma resposta como um fluxo ou serializar um objeto. Qualquer uma das abordagens tem vantagens e desvantagens. Escolha uma técnica com base nas necessidades da sua integração.
Em geral, se o objeto de resposta for simples, puder ser representado como XML ou JSON e for um tamanho consistente, use a serialização de objetos. Se estiver usando um formato diferente de XML ou JSON ou se o tamanho da resposta variar, use o streaming.
Streaming da resposta
O uso de respostas de fluxo fornece 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 a transmissão.
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 apenas um número limitado de registros por consulta, use GlideRecord com escopo - chooseWindow(Number firstRow, Number LastRow, boolian forceCount) método. O artigo da Comunidade Registro Glide paginado e suporte ao método GR expandido exemplifica como usar EscolhoJanela() para alcançar a paginação, que você pode adaptar ao seu próprio caso de uso específico.
Criando um objeto
O uso da serialização de objetos 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 contínuo, 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 objetos está disponível somente para respostas XML ou JSON. Respostas que usam um formato diferente devem usar fluxo.
Este exemplo retorna os mesmos dados de incidente que o exemplo de fluxo, 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"
}]
}
*/