Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

REST Message Pagination

Community Alums
Not applicable

Hello Everyone,

 

I have REST Message through which code loops through all the pages available in the 3rd party app and responds back to ServiceNow. Additionally, I want to stop processing once records are over.

 

Problem statement: The pointer loops through first page and does not go to next pages.

Script:

 

var baseUrl = "https:first_page/api/arsys/v1.0/entry/HPD:Help%20Desk?&q=%27Status%27%3C=%22Pending%22"; // first page 

function fetchRecords(baseUrl) {
    var r = new sn_ws.RESTMessageV2('Integration', 'get token');
    var TOKEN_SYS_PROP_NAME = '';
    var authBodyContent = 'dXNlcm5hbWU9YWtob3Nobm9vZEBhY29yaW8uY29tJnBhc3N3b3JkPTEyMzQ=';
    r.setStringParameterNoEscape('url', 'https://lausd-restapi.onbmc.com/api/jwt/login'); //
    var authBodyContentDecoded = GlideStringUtil.base64Decode(authBodyContent); //
    r.setRequestBody(authBodyContentDecoded);

    var response = r.execute();
    var responseBody = response.getBody();
    var httpStatus = response.getStatusCode();
    TOKEN_SYS_PROP_NAME = ("AR-JWT " + responseBody + '');
    gs.print(TOKEN_SYS_PROP_NAME);

    rm = new sn_ws.RESTMessageV2('global.Helix Integration', 'get helix incidents');
    rm.setStringParameterNoEscape('authToken', TOKEN_SYS_PROP_NAME);
    rm.setStringParameterNoEscape('url', baseUrl);

    var response1 = rm.execute();
    var responseBody1 = response1.getBody();
    var parsedResponse = JSON.parse(responseBody1);
    //var parser = new JSONParser();
    //var result = parsedResponse;
    var httpStatus1 = response.getStatusCode();
    //gs.print(result);

    if (parsedResponse.entries && parsedResponse.entries.length > 0) {
        processRecords(parsedResponse.entries);
    }

    if (parsedResponse._links) {
        baseUrl = JSON.stringify(parsedResponse._links.next);
        fetchRecords(JSON.stringify(parsedResponse._links.next));
    }

    else{
        gs.print("Processing completed");
    }

    function processRecords(entries) {
        for (var i = 0; i < entries.length; i++) {
            var num = entries[i].values["Incident Number"];
            var submitter = entries[i].values["Submitter"];
            var sub_date = entries[i].values["Submit Date"];
            var cat = entries[i].values["Category"];
            var ass_id = entries[i].values["Assignee Id"];
            var last_mod_by = entries[i].values["Last Modified By"];
            var last_mod_date = entries[i].values["Last Modified Date"];
            var status = entries[i].values["Status"];
            var desc = entries[i].values["Description"];
            var created_by = entries[i].values["Created_By"];
            var res_cat = entries[i].values["Resolution Category"];
            var site = entries[i].values["Site"];
            var res_cat_tier_3 = entries[i].values["Resolution Category Tier 3"];
            var res_cat_tier_2 = entries[i].values["Resolution Category Tier 2"];
            var resolution = entries[i].values["Resolution"];
            var urgency = entries[i].values["Urgency"];
            var impact = entries[i].values["Impact"];
            var incident_num = entries[i].values["Incident Number"];
            var priority = entries[i].values["Priority"];
            var assign_group = entries[i].values["Assigned Group"];
            var rep_source = entries[i].values["Reported Source"];
            var detailed_desc = entries[i].values["Detailed Description"];
            var ph_number = entries[i].values["Phone Number"];
            var product_name = entries[i].values["Product Name"];
            var cat_tier_1 = entries[i].values["Categorization Tier 1"];
            var last_res_date = entries[i].values["Last Resolved Date"];
            var closed_date = entries[i].values["Closed Date"];
            var srattach = entries[i].values["SRAttachment/Attachment"];
            var cat_tier_2 = entries[i].values["Categorization Tier 2"];
            var cat_tier_3 = entries[i].values["Categorization Tier 3"];
            var pro_cat_1 = entries[i].values["Product Categorization Tier 1"];
            var pro_cat_3 = entries[i].values["Product Categorization Tier 3"];
            var pro_cat_2 = entries[i].values["Product Categorization Tier 2"];
            var req_id = entries[i].values["SRID"];

            var inc = new GlideRecord('sn_customerservice_case');
            inc.addQuery('number', num);
            inc.query;

            if (!inc) {
                var grUser = new GlideRecord('sys_user');
                grUser.addQuery('email', submitter); // Replace with the actual email address
                grUser.query();

                if (grUser.next()) {
                    var sys_id = grUser.getUniqueValue(); // Or grUser.sys_id

                    var grGroup = new GlideRecord('sys_user_group');
                    grGroup.addQuery('name', assign_group); // Replace with the actual email address
                    grGroup.query();

                    var group_sys_id = grGroup.getUniqueValue();

                    var gr = new GlideRecord('sn_customerservice_case'); // Replace with target table name
                    gr.initialize();
                    gr.setValue('u_ticket_type', 'Incident'); // Replace FIELD_1 and KEY_1
                    gr.setValue('number', num);
                    gr.setValue('description', req_id);
                    gr.setValue('internal_user', sys_id);
                    gr.setValue('category', 'ServiceNow');
                    gr.setValue('category', 'Other');
                    gr.setValue('assignment_group', group_sys_id);
                    gr.setValue('u_this_issue_is_for', 'Employee(s)');
                    gr.setValue('sys_created_on', sub_date);
                    gr.setValue('assigned_to', ass_id);
                    gr.setValue('sys_updated_by', last_mod_by);
                    gr.setValue('sys_updated_on', last_mod_date);
                    gr.setValue('state', status);
                    gr.setValue('state', status);
                    gr.setValue('short_description', (req_id, ' :', desc));
                    gr.setValue('ticket_type', 'Incident');
                    gr.setWorkflow(false);
                    gr.insertWithReferences();
                }

            } else {
                gs.print(num+ "Record already exists in the table");
            }

        }

    }

}
fetchRecords(baseUrl);

 

5 REPLIES 5

Vishal Jaswal
Giga Sage
Giga Sage

Hello @Community Alums 

Change this:

if (parsedResponse._links) {
    baseUrl = JSON.stringify(parsedResponse._links.next);
    fetchRecords(JSON.stringify(parsedResponse._links.next));
}


To this:

if (parsedResponse._links && parsedResponse._links.next) {
    var nextPageUrl = parsedResponse._links.next.href; // assuming should be href in the response payload
    gs.print("Fetching next page: " + nextPageUrl);
    fetchRecords(nextPageUrl); // Recursing with URL
} else {
    gs.print("Processing Finished");


 


Hope that helps!

Community Alums
Not applicable

Hello @Vishal Jaswal,

 

With the suggested code, it is giving below error at the end of first page:

Tejas12_1-1743395305163.png

 And with below code:

if (parsedResponse._links && parsedResponse._links.next) {
        var nextPageUrl = parsedResponse._links.next.toString(); // assuming should be href in the response payload
        gs.print("Fetching next page: " + nextPageUrl);
        fetchRecords(nextPageUrl); // Recursing with URL
 
Error:
Tejas12_2-1743395471513.png

 

 

 

Hello @Community Alums 

My bad as I should have seen the baseURL value carefully - I have done a similar thing where I retreieved all pending remedy tickets to ServiceNow and remedy team told me that a limit of 1000 records were supported per offset.

 

var limit = 1000;
var offset = 0;
var hasMoreRecords = true;

function fetchRecords(limit, offset) {
    var r = new sn_ws.RESTMessageV2('Integration', 'get token');
    var authBodyContent = 'dXNlcm5hbWU9YWtob3Nobm9vZEBhY29yaW8uY29tJnBhc3N3b3JkPTEyMzQ=';
    
    r.setStringParameterNoEscape('url', 'https://lausd-restapi.onbmc.com/api/jwt/login');
    var authBodyContentDecoded = GlideStringUtil.base64Decode(authBodyContent);
    r.setRequestBody(authBodyContentDecoded);

    var response = r.execute();
    var responseBody = response.getBody();
    var TOKEN_SYS_PROP_NAME = "AR-JWT " + responseBody;
    
    gs.print("Authentication Token Received");

    while (hasMoreRecords) {
        var apiUrl = "https:first_page/api/arsys/v1.0/entry/HPD:Help%20Desk?&q=%27Status%27%3C=%22Pending%22" +
                     "&offset=" + offset + "&limit=" + limit;

        var rm = new sn_ws.RESTMessageV2('global.Helix Integration', 'get helix incidents');
        rm.setStringParameterNoEscape('authToken', TOKEN_SYS_PROP_NAME);
        rm.setStringParameterNoEscape('url', apiUrl);

        var response1 = rm.execute();
        var responseBody1 = response1.getBody();
        var parsedResponse = JSON.parse(responseBody1);

        if (parsedResponse.entries && parsedResponse.entries.length > 0) {
            processRecords(parsedResponse.entries);
            offset += limit; // Increase offset for next page
        } else {
            hasMoreRecords = false; // Stop when no more records are returned
            gs.print("Processing completed. No more records.");
        }
    }
}

function processRecords(entries) {
    for (var i = 0; i < entries.length; i++) {
        var incident = entries[i].values;
        var num = incident["Incident Number"];
        var submitter = incident["Submitter"];
        var sub_date = incident["Submit Date"];
        var ass_id = incident["Assignee Id"]; //change this variable name as it doesn't sort of look good like maybe asg_id
        var last_mod_by = incident["Last Modified By"];
        var last_mod_date = incident["Last Modified Date"];
        var status = incident["Status"];
        var desc = incident["Description"];
        var req_id = incident["SRID"];
        var assign_group = incident["Assigned Group"];

        var inc = new GlideRecord('sn_customerservice_case');
        inc.addQuery('number', num);
        inc.query();

        if (!inc.hasNext()) {
            var grUser = new GlideRecord('sys_user');
            grUser.addQuery('email', submitter);
            grUser.query();

            if (grUser.next()) {
                var sys_id = grUser.getUniqueValue();
                var grGroup = new GlideRecord('sys_user_group');
                grGroup.addQuery('name', assign_group);
                grGroup.query();
                var group_sys_id = grGroup.getUniqueValue();

                var gr = new GlideRecord('sn_customerservice_case');
                gr.initialize();
                gr.setValue('u_ticket_type', 'Incident');
                gr.setValue('number', num);
                gr.setValue('description', req_id);
                gr.setValue('internal_user', sys_id);
                gr.setValue('category', 'ServiceNow');
                gr.setValue('assignment_group', group_sys_id);
                gr.setValue('u_this_issue_is_for', 'Employee(s)');
                gr.setValue('sys_created_on', sub_date);
                gr.setValue('assigned_to', ass_id);
                gr.setValue('sys_updated_by', last_mod_by);
                gr.setValue('sys_updated_on', last_mod_date);
                gr.setValue('state', status);
                gr.setValue('short_description', req_id + ' :' + desc);
                gr.setValue('ticket_type', 'Incident');
                gr.setWorkflow(false);
                gr.insertWithReferences();
            }
        } else {
            gs.print(num + " - Record already exists.");
        }
    }
}

// Start fetching records
fetchRecords(limit, offset);

Hope that helps!

Ankur Bawiskar
Tera Patron
Tera Patron

@Community Alums 

does 3rd party supports pagination and offset.

try this

 

var baseUrl = "https://first_page/api/arsys/v1.0/entry/HPD:Help%20Desk?&q=%27Status%27%3C=%22Pending%22"; // first page 

function fetchRecords(baseUrl) {
    var r = new sn_ws.RESTMessageV2('Integration', 'get token');
    var TOKEN_SYS_PROP_NAME = '';
    var authBodyContent = 'dXNlcm5hbWU9YWtob3Nobm9vZEBhY29yaW8uY29tJnBhc3N3b3JkPTEyMzQ=';
    r.setStringParameterNoEscape('url', 'https://lausd-restapi.onbmc.com/api/jwt/login');
    var authBodyContentDecoded = GlideStringUtil.base64Decode(authBodyContent);
    r.setRequestBody(authBodyContentDecoded);

    var response = r.execute();
    var responseBody = response.getBody();
    var httpStatus = response.getStatusCode();
    TOKEN_SYS_PROP_NAME = ("AR-JWT " + responseBody);
    gs.print(TOKEN_SYS_PROP_NAME);

    var rm = new sn_ws.RESTMessageV2('global.Helix Integration', 'get helix incidents');
    rm.setStringParameterNoEscape('authToken', TOKEN_SYS_PROP_NAME);
    rm.setStringParameterNoEscape('url', baseUrl);

    var response1 = rm.execute();
    var responseBody1 = response1.getBody();
    var parsedResponse = JSON.parse(responseBody1);
    var httpStatus1 = response1.getStatusCode();

    if (parsedResponse.entries && parsedResponse.entries.length > 0) {
        processRecords(parsedResponse.entries);
    }

    if (parsedResponse._links && parsedResponse._links.next) {
        var nextUrl = parsedResponse._links.next.href;
        gs.print("Fetching next page: " + nextUrl);
        fetchRecords(nextUrl);
    } else {
        gs.print("Processing completed");
    }

    function processRecords(entries) {
        for (var i = 0; i < entries.length; i++) {
            var num = entries[i].values["Incident Number"];
            var submitter = entries[i].values["Submitter"];
            var sub_date = entries[i].values["Submit Date"];
            var cat = entries[i].values["Category"];
            var ass_id = entries[i].values["Assignee Id"];
            var last_mod_by = entries[i].values["Last Modified By"];
            var last_mod_date = entries[i].values["Last Modified Date"];
            var status = entries[i].values["Status"];
            var desc = entries[i].values["Description"];
            var created_by = entries[i].values["Created_By"];
            var res_cat = entries[i].values["Resolution Category"];
            var site = entries[i].values["Site"];
            var res_cat_tier_3 = entries[i].values["Resolution Category Tier 3"];
            var res_cat_tier_2 = entries[i].values["Resolution Category Tier 2"];
            var resolution = entries[i].values["Resolution"];
            var urgency = entries[i].values["Urgency"];
            var impact = entries[i].values["Impact"];
            var incident_num = entries[i].values["Incident Number"];
            var priority = entries[i].values["Priority"];
            var assign_group = entries[i].values["Assigned Group"];
            var rep_source = entries[i].values["Reported Source"];
            var detailed_desc = entries[i].values["Detailed Description"];
            var ph_number = entries[i].values["Phone Number"];
            var product_name = entries[i].values["Product Name"];
            var cat_tier_1 = entries[i].values["Categorization Tier 1"];
            var last_res_date = entries[i].values["Last Resolved Date"];
            var closed_date = entries[i].values["Closed Date"];
            var srattach = entries[i].values["SRAttachment/Attachment"];
            var cat_tier_2 = entries[i].values["Categorization Tier 2"];
            var cat_tier_3 = entries[i].values["Categorization Tier 3"];
            var pro_cat_1 = entries[i].values["Product Categorization Tier 1"];
            var pro_cat_3 = entries[i].values["Product Categorization Tier 3"];
            var pro_cat_2 = entries[i].values["Product Categorization Tier 2"];
            var req_id = entries[i].values["SRID"];

            var inc = new GlideRecord('sn_customerservice_case');
            inc.addQuery('number', num);
            inc.query();

            if (!inc.next()) {
                var grUser = new GlideRecord('sys_user');
                grUser.addQuery('email', submitter); // Replace with the actual email address
                grUser.query();

                if (grUser.next()) {
                    var sys_id = grUser.getUniqueValue(); // Or grUser.sys_id

                    var grGroup = new GlideRecord('sys_user_group');
                    grGroup.addQuery('name', assign_group); // Replace with the actual email address
                    grGroup.query();

                    var group_sys_id = grGroup.getUniqueValue();

                    var gr = new GlideRecord('sn_customerservice_case'); // Replace with target table name
                    gr.initialize();
                    gr.setValue('u_ticket_type', 'Incident'); // Replace FIELD_1 and KEY_1
                    gr.setValue('number', num);
                    gr.setValue('description', req_id);
                    gr.setValue('internal_user', sys_id);
                    gr.setValue('category', 'ServiceNow');
                    gr.setValue('category', 'Other');
                    gr.setValue('assignment_group', group_sys_id);
                    gr.setValue('u_this_issue_is_for', 'Employee(s)');
                    gr.setValue('sys_created_on', sub_date);
                    gr.setValue('assigned_to', ass_id);
                    gr.setValue('sys_updated_by', last_mod_by);
                    gr.setValue('sys_updated_on', last_mod_date);
                    gr.setValue('state', status);
                    gr.setValue('short_description', req_id + ' : ' + desc);
                    gr.setValue('ticket_type', 'Incident');
                    gr.setWorkflow(false);
                    gr.insertWithReferences();
                }
            } else {
                gs.print(num + " Record already exists in the table");
            }
        }
    }
}

fetchRecords(baseUrl);

 

If my response helped please mark it correct and close the thread so that it benefits future readers.

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader