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.

Help with Scripted Rest API

Abhijit Das7
Tera Expert

HI Everyone,

 

I have a Scripted REST API, which is used to post images in work notes of Incident, case, etc. Till now, we were only posting images, but now requirement is to send videos (mp4) with images as well. How can I change my code so that I can post videos as well with  same code.

 

 

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    // implement resource here

    var requestBody = request.body.dataString;
    var parser = new global.JSON();
    var parsedData = parser.decode(requestBody);
    var refId = parsedData.refId;   
    var imageName = parsedData.imageName; 
    var imageType = parsedData.imageType;
    var imageValue = parsedData.imageValue;
 
    var table = parsedData.object_name;
    if (table == 'wm_order' || table == 'wm_task' || table == 'incident' || table == 'sn_customerservice_case' || table == 'pm_project') {
        var rec = new GlideRecord(table);
        rec.addQuery('number', refId);
        var sysID = rec.sys_id;
        rec.query();
        if (rec.next()) {
                   if (imageName && imageValue && imageType != '') {
                    sa = new GlideSysAttachment();
                sa.writeBase64(rec, imageName, imageType, imageValue);
            }
            var responseBody = {};
            responseBody.status = "Success";
            responseBody.message = " SNOW Operation performed successfully";
            response.setBody(responseBody);
        } else {
            var responseBodyFailure = {};
            responseBodyFailure.status = "Failure";
            responseBodyFailure.message = "org.mozilla.javascript.EvaluatorException: GlideRecord.addQuery() - incorrect value";
            response.setBody(responseBodyFailure);
        }


    } else {
        var responseBodyTableFailure = {};
        responseBodyTableFailure.status = "Failure";
        responseBodyTableFailure.message = " org.mozilla.javascript.EvaluatorException: GlideRecord.addQuery() - invalid table name:" + table + "(sys_ws_operation.526056a71b46d910a662ece5624bcbd5.operation_script; line 17)";
        response.setBody(responseBodyTableFailure);

    }


})(request, response);

 

 

cc: @Ankur Bawiskar @Pavankumar_1 

 

Thanks in advance

 

1 ACCEPTED SOLUTION

Chetan Mahajan
Mega Sage

Hello @Abhijit Das7 ,

                                     As per your script your getting image in payload, So first of all you should get Vid as well in Payload you can ref below example to modify Payload Structure.

{
    "refId": "incident123",
    "attachments": [
        {
            "resp_name": "image.jpg",
            "resp_type": "image/jpeg",
            "resp_data": "base64_encoded_image_data"
        },
        {
            "resp_name": "video.mp4",
            "resp_type": "video/mp4",
            "resp_data": "base64_encoded_video_data"
        }
    ],
    "object_name": "incident"
}

Now you will get both Image and Video in your payload, Once you get it, then you can iterate value from Attachments object.

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    var requestBody = request.body.dataString;
    var parser = new global.JSON();
    var parsedData = parser.decode(requestBody);
    var refId = parsedData.refId;
    var table = parsedData.object_name;
    var attachments = parsedData.attachments;

    if (table == 'wm_order' || table == 'wm_task' || table == 'incident' || table == 'sn_customerservice_case' || table == 'pm_project') {
        var rec = new GlideRecord(table);
        rec.addQuery('number', refId);
        var sysID = rec.sys_id;
        rec.query();

        if (rec.next()) {
            for (var i = 0; i < attachments.length; i++) {
                var attachment = attachments[i];
                var name = attachment.name;
                var type = attachment.type;
                var data = attachment.data;

                if (name && type && data) {
                    sa = new GlideSysAttachment();
                    sa.writeBase64(rec, name, type, data);
                }
            }

            var responseBody = {};
            responseBody.status = "Success";
            responseBody.message = "SNOW Operation performed successfully";
            response.setBody(responseBody);
        } else {
            var responseBodyFailure = {};
            responseBodyFailure.status = "Failure";
            responseBodyFailure.message = "org.mozilla.javascript.EvaluatorException: GlideRecord.addQuery() - incorrect value";
            response.setBody(responseBodyFailure);
        }
    } else {
        var responseBodyTableFailure = {};
        responseBodyTableFailure.status = "Failure";
        responseBodyTableFailure.message = "org.mozilla.javascript.EvaluatorException: GlideRecord.addQuery() - invalid table name:" + table + "(sys_ws_operation.526056a71b46d910a662ece5624bcbd5.operation_script; line 17)";
        response.setBody(responseBodyTableFailure);
    }
})(request, response);

Kindly mark correct and helpful if applicable

View solution in original post

2 REPLIES 2

Chetan Mahajan
Mega Sage

Hello @Abhijit Das7 ,

                                     As per your script your getting image in payload, So first of all you should get Vid as well in Payload you can ref below example to modify Payload Structure.

{
    "refId": "incident123",
    "attachments": [
        {
            "resp_name": "image.jpg",
            "resp_type": "image/jpeg",
            "resp_data": "base64_encoded_image_data"
        },
        {
            "resp_name": "video.mp4",
            "resp_type": "video/mp4",
            "resp_data": "base64_encoded_video_data"
        }
    ],
    "object_name": "incident"
}

Now you will get both Image and Video in your payload, Once you get it, then you can iterate value from Attachments object.

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    var requestBody = request.body.dataString;
    var parser = new global.JSON();
    var parsedData = parser.decode(requestBody);
    var refId = parsedData.refId;
    var table = parsedData.object_name;
    var attachments = parsedData.attachments;

    if (table == 'wm_order' || table == 'wm_task' || table == 'incident' || table == 'sn_customerservice_case' || table == 'pm_project') {
        var rec = new GlideRecord(table);
        rec.addQuery('number', refId);
        var sysID = rec.sys_id;
        rec.query();

        if (rec.next()) {
            for (var i = 0; i < attachments.length; i++) {
                var attachment = attachments[i];
                var name = attachment.name;
                var type = attachment.type;
                var data = attachment.data;

                if (name && type && data) {
                    sa = new GlideSysAttachment();
                    sa.writeBase64(rec, name, type, data);
                }
            }

            var responseBody = {};
            responseBody.status = "Success";
            responseBody.message = "SNOW Operation performed successfully";
            response.setBody(responseBody);
        } else {
            var responseBodyFailure = {};
            responseBodyFailure.status = "Failure";
            responseBodyFailure.message = "org.mozilla.javascript.EvaluatorException: GlideRecord.addQuery() - incorrect value";
            response.setBody(responseBodyFailure);
        }
    } else {
        var responseBodyTableFailure = {};
        responseBodyTableFailure.status = "Failure";
        responseBodyTableFailure.message = "org.mozilla.javascript.EvaluatorException: GlideRecord.addQuery() - invalid table name:" + table + "(sys_ws_operation.526056a71b46d910a662ece5624bcbd5.operation_script; line 17)";
        response.setBody(responseBodyTableFailure);
    }
})(request, response);

Kindly mark correct and helpful if applicable

Ankur Bawiskar
Tera Patron
Tera Patron

@Abhijit Das7 

if 3rd party is able to send base64 for video then it should work fine as well similar to image

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader