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