Exemplo de Scripted REST API - streaming versus serialização de objeto

  • Versão de lançamento: Washingtondc
  • Atualizado 1 de fev. de 2024
  • 5 min. de leitura
  • Esses exemplos demonstram como enviar uma resposta JSON usando streaming e usando a serialização de objeto padrão.

    Fluxo 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 streaming.

    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 do tipo de conteúdo. 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 streaming.

    Este exemplo demonstra um script de Recurso REST de script que retorna uma matriz de registros de incidentes usando streaming.

    /**
     *  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 resposta a seguir.

    
    //  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 enviar apenas um número limitado de registros por consulta, use o método GlideRecord com escopo/Global - chooseWindow(Number firstRow, Number lastRow, Boolean forceCount). O artigo da comunidade Registro de Glide paginado + Suporte ao método de GR expandido exemplifica como usar chooseWindow() para obter paginação, que você pode adaptar ao seu próprio caso de uso específico.

    Construindo 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 streaming, 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 resposta a seguir.

    
    /*
     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"
     }]
     }
     */