Beispiel für Scripted REST APIs – Streaming im Vergleich zu Objektserialisierung

  • Freigeben Version: Zurich
  • Aktualisiert 31. Juli 2025
  • 4 Minuten Lesedauer
  • Diese Beispiele zeigen, wie eine JSON-Antwort mithilfe von Streaming und Standard-Objektserialisierung gesendet wird.

    Streaming im Vergleich zu Objektserialisierung

    Beim Senden einer Antwort können Sie eine Antwort als Stream senden oder ein Objekt serialisieren. Beide Ansätze haben Vor- und Nachteile. Wählen Sie eine Technik aus, die auf den Anforderungen Ihrer Integration basiert.

    Wenn das Antwortobjekt einfach ist, als XML oder JSON dargestellt werden kann, und eine konstante Größe hat, verwenden Sie normalerweise die Objektserialisierung. Wenn Sie ein anderes Format als XML oder JSON verwenden oder die Größe der Antwort variiert, verwenden Sie Streaming.

    Streamen der Antwort

    Die Verwendung von Streaming-Antworten bietet Vorteile in Bezug auf Antwortzeit, Instanzleistung und Flexibilität der Inhalte, erhöht jedoch die Komplexität des Skripts. Wenn Sie Streaming verwenden, sind Sie für das Formatieren der Antwort, das Festlegen des Antwortstatus und das Festlegen der Content Typ-Kopfzeile verantwortlich. Beim Streamen einer Antwort erhält der anfordernde Benutzer schnell eine Antwort, da vor dem Starten des Streamings nicht die gesamte Antwort erstellt werden muss.

    In diesem Beispiel wird ein Skript für geskriptete REST-Ressourcen veranschaulicht, das mithilfe von Streaming ein Array von Incident-Datensätzen zurückgibt.

    /**
     *  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);
    

    Eine Anforderung an diese Ressource gibt die folgende Antwort zurück.

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

    Streaming-Paginierung

    Um große Tabellen zu paginieren, sodass Sie nur eine begrenzte Anzahl von Datensätzen pro Abfrage senden, verwenden Sie die Scoped GlideRecord – chooseWindow(Number firstRow, Number lastRow, Boolean forceCount) Methode. Der Community-artikel Paginierter Glide-Datensatz + erweiterte GR-Methodenunterstützung Veranschaulicht die Verwendung Select Window() Um eine Paginierung zu erreichen, die Sie an Ihren eigenen Anwendungsfall anpassen können.

    Ein Objekt erstellen

    Durch die Objektserialisierung können Sie die von ServiceNow bereitgestellte Serialisierung und Inhaltsverhandlung nutzen. Beim Serialisieren eines Objekts anstelle des Streamings muss das gesamte Objekt erstellt und serialisiert werden, bevor der Client eine Antwort erhält. Dies kann die Antwort verzögern oder eine große Menge an Systemressourcen erfordern, wenn das Antwortobjekt sehr groß ist. Die Objektserialisierung ist nur für XML- oder JSON-Antworten verfügbar. Antworten, die ein anderes Format verwenden, müssen Streaming verwenden.

    In diesem Beispiel werden dieselben Incident-Daten wie im Streaming-Beispiel zurückgegeben, es werden jedoch alle Antwortdaten in einem Array erfasst, bevor die Antwort gesendet wird.

    /**
     *  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);
    

    Eine Anforderung an diese Ressource gibt die folgende Antwort zurück.

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