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

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