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.

Scripted REST API not retrieving data

Menna Kearns
Tera Guru

Hello, I am having issues with a Scripted REST API retrieving external data via REST Message, which has the endpoint, basic auth, and default GET set up. Testing the REST message, it retrieves the XML data I expect. I also set the HTTP Log Level to “All” and everything looks good in the Outbound HTTP Logs.

Coming back to the scripted REST API, when I use the Explore REST API to test my code, I get a 200 response, but no data. I entered in some logging to try to debug the issue, and in my logs the REST Message Endpoint is correct, however by HTTP method is “undefined”. I am attempting to populate a table with the data. Any thoughts? Thank you!

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
	try {
		gs.log('Starting script execution...');
		var restMessage = new sn_ws.RESTMessageV2('Workday HR', 'Default GET');
		gs.log('REST Message Endpoint: ' + restMessage.getEndpoint());
		var restResponse = restMessage.execute();
		gs.log('REST Message HTTP Method: ' + restMessage.getHttpMethod());
		gs.log('REST Message Headers: ' + JSON.stringify(restMessage.getHeaders()));
		if (restResponse.getStatusCode() !== 200) {
			gs.error('Error ' + restResponse.getStatusCode() + ': ' + restResponse.getErrorMessage());
		}
		var responseBody = restResponse.getBody();
		gs.log('responseBody = ', responseBody);
		var xmlDoc = new GlideXMLDocument(responseBody);
		var reportEntries = xmlDoc.getNodeList('//wd:Report_Entry');
		for (var i = 0; i < reportEntries.getLength(); i++) {

			var positionName = reportEntries.item(i).getChildText('wd:Position_Name');
			var positionID = reportEntries.item(i).getChildText('wd:Position_ID');

			var gr = new GlideRecord('u_workday_hr_inbound');
			gr.u_position_name = positionName;
			gr.u_position_id = positionID;
			gs.log("positionName = ", positionName);
			gs.log("positionID = ", positionID);
			gr.insert();
		}
		gs.log('Script execution completed.');
	} catch (e) {
		gs.error('Error occurred: ' + e);
	}
	restResponse.setStatus(200);
	restResponse.setBody('Data inserted successfully.');
})(request, response);
1 ACCEPTED SOLUTION

Menna Kearns
Tera Guru

Hello, for anyone interested, I was able to get it working. My issues were:
1) var xmlDoc = new GlideXMLDocument(responseBody); should be var xmlDoc = new XMLDocument2();

2) I needed to parse the document via xmlDoc.parseXML(responseBody);
3) getChildText should be getTextContent

 

Fully re-worked code below. Still needs some refining, but it did the job and populated by table with the data.

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
	try {
		gs.log('Starting script execution...');
		var restMessage = new sn_ws.RESTMessageV2('Workday HR', 'Default GET');
		var restResponse = restMessage.execute();
		if (restResponse.getStatusCode() !== 200) {
			gs.error('Error ' + restResponse.getStatusCode() + ': ' + restResponse.getErrorMessage());
		}
		var responseBody = restResponse.getBody();
		var xmlDoc = new XMLDocument2();
		xmlDoc.parseXML(responseBody);
		var reportList = xmlDoc.getFirstNode("//wd:Report_Data");
		var reportEntries = reportList.getChildNodeIterator();
		while (reportEntries.hasNext()) {
		//for (var i = 0; i < reportEntries.getLength(); i++) {
			var reportEntry = reportEntries.next();
			var positionNode = reportEntry.getFirstChild('wd:Positions');
			var positionNameNode = positionNode.getFirstChild('wd:Position_Name');
			var positionIDNode = positionNode.getLastChild('wd:Position_ID');

			var positionName = positionNameNode.getTextContent();
			var positionID = positionIDNode.getTextContent();
			var gr = new GlideRecord('u_workday_hr_inbound');
			gr.u_position_name = positionName;
			gr.u_position_id = positionID;
			gr.insert();
		}
		gs.log('Script execution completed.');
	} catch (e) {
		gs.error('Error occurred: ' + e);
	}
	restResponse.setStatus(200);
	restResponse.setBody('Data inserted successfully.');
})(request, response);

 

View solution in original post

2 REPLIES 2

Harsh_Deep
Giga Sage
Giga Sage

Hello @Menna Kearns 

 

Can you please share Screenshots of your rest message.

Menna Kearns
Tera Guru

Hello, for anyone interested, I was able to get it working. My issues were:
1) var xmlDoc = new GlideXMLDocument(responseBody); should be var xmlDoc = new XMLDocument2();

2) I needed to parse the document via xmlDoc.parseXML(responseBody);
3) getChildText should be getTextContent

 

Fully re-worked code below. Still needs some refining, but it did the job and populated by table with the data.

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
	try {
		gs.log('Starting script execution...');
		var restMessage = new sn_ws.RESTMessageV2('Workday HR', 'Default GET');
		var restResponse = restMessage.execute();
		if (restResponse.getStatusCode() !== 200) {
			gs.error('Error ' + restResponse.getStatusCode() + ': ' + restResponse.getErrorMessage());
		}
		var responseBody = restResponse.getBody();
		var xmlDoc = new XMLDocument2();
		xmlDoc.parseXML(responseBody);
		var reportList = xmlDoc.getFirstNode("//wd:Report_Data");
		var reportEntries = reportList.getChildNodeIterator();
		while (reportEntries.hasNext()) {
		//for (var i = 0; i < reportEntries.getLength(); i++) {
			var reportEntry = reportEntries.next();
			var positionNode = reportEntry.getFirstChild('wd:Positions');
			var positionNameNode = positionNode.getFirstChild('wd:Position_Name');
			var positionIDNode = positionNode.getLastChild('wd:Position_ID');

			var positionName = positionNameNode.getTextContent();
			var positionID = positionIDNode.getTextContent();
			var gr = new GlideRecord('u_workday_hr_inbound');
			gr.u_position_name = positionName;
			gr.u_position_id = positionID;
			gr.insert();
		}
		gs.log('Script execution completed.');
	} catch (e) {
		gs.error('Error occurred: ' + e);
	}
	restResponse.setStatus(200);
	restResponse.setBody('Data inserted successfully.');
})(request, response);