REST Message Pagination
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-30-2025 09:14 PM
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:
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-30-2025 09:21 PM
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!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-30-2025 09:31 PM
Hello @Vishal Jaswal,
With the suggested code, it is giving below error at the end of first page:
And with below code:
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-30-2025 10:06 PM
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!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-30-2025 09:44 PM
@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.
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader