- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-21-2021 10:25 PM
Hello wonderful community!
I'm looking to create a Scripted REST API for a scoped application. The goal is to take a simple JSON-formatted body that contains the field & a new value and use it to update one or more records. But the field is dynamic as the field is being collected through user input in a python script. I'm having trouble iterating through the JSON object and doing what I'd like. If it's not possible to have the field be dynamic and I have to check a lot of different fields to see if they exist in the request, so be it, but I'd rather not do that if I don't have to. Any help is appreciated!
Resource path: /api/<namespace>/<app_id>/edit_records?number=0000001
Data being sent in the PUT body looks like: {"u_field_name": "this is my new value!"}
Sample code:
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var queryParams = request.queryString;
var requestedRecords = new GlideRecord("sn_table_name_here");
requestedRecords.addEncodedQuery(queryParams);
requestedRecords.query();
if (requestedRecords.getRowCount() > 0) {
//which makes more sense, data or dataString?
var parsedData = JSON.parse(request.body.dataString);
gs.info("This is the JSON object passed: " + parsedData);
//Loop through the data and update record(s)
// Ideally I could do something like
// requestedRecords.setValue(field,field[0]); and it would update, but alas
for (var field in parsedData) {
gs.info("parsedData parameter is: " + field); //currently "replaceAll" minus the quotes is the only thing returned
}
}
})(request, response);
Thank you!
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-21-2021 10:34 PM
As you said you will be getting the request body with PUT method
You can use this
Enhance it as per your requirement
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var parsedData = JSON.parse(request.body.dataString);
var key = [];
for(var i in parsedData){
key.push(i);
}
// now you have the name of the field in array key
var query = key[0] + '=' + parsedData[key[0]];
var requestedRecords = new GlideRecord("sn_table_name_here");
requestedRecords.addEncodedQuery(query);
requestedRecords.query();
if (requestedRecords.getRowCount() > 0) {
// record found and update
if(requestedRecords.next()){
requestedRecords[key[0]] = parsedData[key[0]];
requestedRecords.update();
}
}
})(request, response);
Regards
Ankur
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-21-2021 10:34 PM
As you said you will be getting the request body with PUT method
You can use this
Enhance it as per your requirement
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var parsedData = JSON.parse(request.body.dataString);
var key = [];
for(var i in parsedData){
key.push(i);
}
// now you have the name of the field in array key
var query = key[0] + '=' + parsedData[key[0]];
var requestedRecords = new GlideRecord("sn_table_name_here");
requestedRecords.addEncodedQuery(query);
requestedRecords.query();
if (requestedRecords.getRowCount() > 0) {
// record found and update
if(requestedRecords.next()){
requestedRecords[key[0]] = parsedData[key[0]];
requestedRecords.update();
}
}
})(request, response);
Regards
Ankur
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-21-2021 11:23 PM
Thank you for the helpful suggestion! Unfortunately I'm now running into another problem and I can't understand why this is happening.
Code snippet:
var parsedData = JSON.parse(request.body.dataString);
gs.info("parsedData = " + parsedData);
var key = [];
for (var i in parsedData) {
key.push(i);
}
gs.info("new idea: " + key[0] + " = " + parsedData[key[0]]);
The output of the code is:
1. parsedData = {"u_field_name": "this is my new value!"}
2. new idea: replaceAll =
function (from, to) {
return this.replace(from.toString(), to, "g");
}
The above code snippet is immediately after the start of the 'process' function. Maybe it's because of the "JSON.parse" function?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-21-2021 11:37 PM
Hi,
but there is only 1 key in your json i.e. the field name
so array should have only 1 element i.e. u_field_name
Can you share what request body you are sending?
Regards
Ankur
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-22-2021 11:25 AM
Hi Ankur!
Your reply made me revisit my python script and I found that I was serializing the JSON object twice! I was using x = json.dumps(data) and then later in requests.put(url, json=x, ....)
Thank you so much for your help! If there wasn't a pandemic going on right now I'd give you a hug.
