Import and Export XML using rest api
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-06-2022 10:42 AM
Hello - we have a requirement to automate domain creation using rest api.
The issue we are facing is that the sys_id of the domain will be different across all 3 instances (prod / test / dev) if using only the rest api method. We are wondering if there's a way we can create the domain in DEV using rest api, but have a separate call to export and import the XML to the subsequent instances.
Has anyone been successful exporting and import xml between instances using rest api?
Thank you.
- Labels:
-
Instance Configuration
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-10-2025 03:47 AM - edited 01-10-2025 04:12 AM
Hello, as the easiest method to do this is to use the REST API, there is no need to traverse the JSON to XML and back.
I wrote a simple class that is able to synchronize records based on the table name.
New records are created, if not avaliable on the target system.
Class:
var lib_clone = Class.create();
lib_clone.prototype = {
tables : [],
notFoundCount : 0,
ldebug : new lib_debug(),
initialize: function() {
},
setTables: function() {
for(var i = 0; i < arguments.length; i++) {
this.tables.push(arguments[i]);
}
},
mainLoop: function() {
//this.ldebug.debugFormat('lib_clone', 'start');
for(var a = 0; a < this.tables.length; a++) {
var gr = new GlideRecord(this.tables[a]);
//gr.setLimit(1000);
gr.query();
while(gr.next()) {
if(this.isRecordPresent(this.tables[a], gr.sys_id.toString())) {
//this.ldebug.debugFormat('lib_clone', 'found');
} else {
//this.ldebug.debugFormat('lib_clone', 'not found', gr.sys_id.toString());
this.pushRecord(this.tables[a], gr.sys_id.toString());
}
}
}
this.ldebug.debugFormat('lib_clone', 'notFoundCount', this.notFoundCount);
},
isRecordPresent: function(strtable, strsysid) {
var request = new sn_ws.RESTMessageV2();
request.setEndpoint('https://targetinstance1.service-now.com/api/now/table/'+strtable+'/'+strsysid);
request.setAuthenticationProfile('basic', 'base64pw');//Base64 encoded username:password
request.setQueryParameter('sysparm_exclude_reference_link', 'true');
request.setHttpMethod('GET');
request.setRequestHeader("Accept", "application/json");
request.setRequestHeader("Content-Type", "application/json");
var response = request.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
var parsedData = JSON.parse(responseBody);
//this.ldebug.debugFormat('lib_clone', httpStatus, responseBody);
if(httpStatus != 404) {
return true;
}
return false;
},
pushRecord: function(strtable, strsysid) {
this.pushRecordDev(strtable, strsysid);
this.pushRecordTest(strtable, strsysid);
},
pushRecordDev: function(strtable, strsysid) {
this.ldebug.debugFormat('lib_clone', 'push record', strtable, strsysid);
var gr = new GlideRecord(strtable);
gr.get(strsysid);
var request = new sn_ws.RESTMessageV2();
request.setEndpoint('https://targetinstance1.service-now.com/api/xxx/v1/direct/datasync/'+strtable);
request.setAuthenticationProfile('basic', 'base64pw');//Base64 encoded username:password
request.setQueryParameter('sysparm_exclude_reference_link', 'true');
var requestBody = { };
for(var k in gr) {
if(!gr[k].nil()) {
requestBody[k] = gr.getValue(k);
}
}
request.setRequestBody(JSON.stringify(requestBody));
request.setHttpMethod('POST');
request.setRequestHeader("Accept", "application/json");
request.setRequestHeader("Content-Type", "application/json");
//this.ldebug.debugFormat('lib_clone', 'push record', JSON.stringify(requestBody));
var response = request.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
//var parsedData = JSON.parse(responseBody);
//this.ldebug.debugFormat('lib_clone', httpStatus, responseBody);
},
pushRecordTest: function(strtable, strsysid) {
this.ldebug.debugFormat('lib_clone', 'push record', strtable, strsysid);
var gr = new GlideRecord(strtable);
gr.get(strsysid);
var request = new sn_ws.RESTMessageV2();
request.setEndpoint('https://targetinstance2.service-now.com/api/xxx/v1/direct/datasync/'+strtable);
request.setAuthenticationProfile('basic', 'base64pw');//Base64 encoded username:password
request.setQueryParameter('sysparm_exclude_reference_link', 'true');
var requestBody = { };
for(var k in gr) {
if(!gr[k].nil()) {
requestBody[k] = gr.getValue(k);
}
}
request.setRequestBody(JSON.stringify(requestBody));
request.setHttpMethod('POST');
request.setRequestHeader("Accept", "application/json");
request.setRequestHeader("Content-Type", "application/json");
//this.ldebug.debugFormat('lib_clone', 'push record', JSON.stringify(requestBody));
var response = request.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
//var parsedData = JSON.parse(responseBody);
//this.ldebug.debugFormat('lib_clone', httpStatus, responseBody);
},
type: 'lib_clone'
};
Scripted rest API
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var ldebug = new global.lib_debug('scripted_rest_sn_sync_target');
//ldebug.setEnableDebug(true);
ldebug.debugFormat('ServiceNow data Synchronization Target', 'start');
var pathParams = request.pathParams;
var requestString = requestBody.dataString;
var queryParms = request.queryParams;
var requestBody = request.body;
var requestData = requestBody.data;
var grt = new GlideRecord(pathParams.TableName.toString());
grt.initialize();
if(requestData.sys_id.toString() != "") {
ldebug.debugFormat('ServiceNow data Synchronization Target', 'setNewGuidValue', requestData.sys_id.toString());
var grcheck = new GlideRecord(pathParams.TableName.toString());
grcheck.addQuery('sys_id', requestData.sys_id.toString());
grcheck.query();
if(grcheck.getRowCount() == 1) {
response.setError(new sn_ws_err.ConflictError('sys_id already present on target system'));
return response;
}
grt.setNewGuidValue(requestData.sys_id.toString());
}
for(var k in requestData) {
if(requestData.hasOwnProperty(k)) {
ldebug.debugFormat('ServiceNow data Synchronization Target', k, requestData[k]);
grt[k] = requestData[k];
}
}
grt.insert();
})(request, response);
Execute this on the source system (as it is only push mechanism currently):
var lclone = new lib_clone();
//lclone.setTables('sys_user', 'customer_contact', 'sys_user_grmember', 'sys_user_has_role');
lclone.setTables('sys_user', 'customer_contact');
lclone.mainLoop();