I need to pass attachment into binary form from Servicenow to Zendesk.

Ahmer Faraz1
Tera Contributor

1. I created a Rest Message.
2. I created a Business Rule on the attachment Table.

3. I created one incident to add an attachment and trigger the business rule but the attachment pass in base 64 format only.


Business Rule-----------------------

var a = current.sys_id;

var gr = new GlideRecord('sys_attachment');
gr.addQuery('sys_id', a);
gr.query();
if (gr.next()) {
var StringUtil = new GlideStringUtil();
var sa = new GlideSysAttachment();
var binData = sa.getBytes(gr);
encData = StringUtil.base64Encode(binData);
}
try {

attachmentRec = new GlideRecord("incident");
attachmentRec.addQuery("sys_id", current.table_sys_id);
attachmentRec.query();

while (attachmentRec.next()) {
ZendeskNumber = attachmentRec.u_zendesk_external_inc_number;

}

body.content_type = current.content_type + "";
body.u_zendesk_external_inc_number = ZendeskNumber + "";
body.number = attachmentRec.number + "";
body.file_name = current.file_name + "";
// body.base_64_bytes = binData + "";

body = JSON.stringify(body);

 

var r = new sn_ws.RESTMessageV2('', '');
r.setStringParameterNoEscape('file_name', current.file_name);

r.setRequestBody(body);

response = r.execute();
responseBody = response.getBody();
requestBody = r.getRequestBody();
httpStatus = response.getStatusCode();
jsonObject = JSON.parse(responseBody);

sysID = jsonObject.result.sys_id;

1 ACCEPTED SOLUTION

If you want to sent file as binary as a request body then you can use below code. It basically convert the file into binary and set the request body. But you wont be able to sent json or any other parameter in requested body. You might need to use query parameter or header to sent other details depending on the API document. 

 

var r = new sn_ws.RESTMessageV2('Rest Message', 'Upload');
            r.setRequestBodyFromAttachment(current.sys_id); //sys_id of attachment

View solution in original post

13 REPLIES 13

im_atrey
Tera Contributor

Try this Code:

var StringUtil = new GlideStringUtil();

var attachments = new GlideSysAttachment();

var gR = new GlideRecord('sys_attachment');

gR.addEncodedQuery('table_name=incident^table_sys_id='+current.sys_id);

 gR.query();

while(gR.next())

{

var binData =   attachments.getBytes(gR);

 var encData =   StringUtil.base64Encode(binData);

 gs.print(binData);

 gs.print(encData);

 gs.print('**************');

}

(function executeRule(current, previous /*null when async*/ ) {

var response;
var responseBody;
var requestBody;
var httpStatus;
var jsonObject;
var attachmentRec;
var attachmentRec1;
var body = {};
var a = current.sys_id;
var ZendeskNumber;

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var gR = new GlideRecord('sys_attachment');
gR.addEncodedQuery('table_name=incident^table_sys_id=' + current.sys_id);
gR.query();
while (gR.next()) {
var binData = attachments.getBytes(gR);
var encData = StringUtil.base64Encode(binData);
gs.log('ZendeskNumber file is binData' + binData);
gs.log('ZendeskNumber file is encData' + encData);
}


try {


attachmentRec = new GlideRecord("incident");
attachmentRec.addQuery("sys_id", current.table_sys_id);
attachmentRec.query();

while (attachmentRec.next()) {
ZendeskNumber = attachmentRec.u_zendesk_external_inc_number;
}


// body.content_type = current.content_type + "";
// body.u_zendesk_external_inc_number = ZendeskNumber + "";
// body.number = attachmentRec.number + "";
// body.file_name = current.file_name + "";
// body.base_64_bytes = binData + "";
// gs.log('base 64 is1' + binData);
// body = JSON.stringify(body);
// gs.log('request body' + body);
// gs.log('body content_type' + current.content_type);
// gs.log('body number' + ZendeskNumber);
// gs.log('body file_name' + current.file_name);

 

var r = new sn_ws.RESTMessageV2('', '');
r.setAuthentication('basic', '6c78e0a9879da55029ebc8809bbb355c');

r.setRequestHeader('Content-Type', current.content_type);
r.setStringParameterNoEscape('file_name', current.file_name);
r.setRequestBodyFromAttachment(current.sys_id);

gs.log('file type ' + current.content_type);
gs.log('filename ' + current.file_name);
gs.log('fileid ' + current.sys_id);

// body = JSON.stringify(body);
// r.setRequestBody(body);
// gs.log('request body' + body);

response = r.execute();
responseBody = response.getBody();
requestBody = r.getRequestBody();
httpStatus = response.getStatusCode();
// jsonObject = JSON.parse(responseBody);
// gs.log("Zendesk Attachment Incident jsonObject: " + jsonObject);

// sysID = jsonObject.result.sys_id;
gs.log("Zendesk Attachment Incident Response: " + responseBody);
gs.log("Zendesk Attachment Incident HTTP Status: " + httpStatus);
gs.log("Zendesk Attachment Incident Request: " + requestBody);


var str = responseBody;
var n = str.includes("token");

if (n == true) {

var a1 = str.split('"token":"');
b = a1[1];
var c = b.split('",');
var d = c[0];
d = d.trim();
current.u_zendesk_token = d;
current.update();

 

 

}

} catch (ex) {
var message = ex.message;
}

 

 

 

})(current, previous);

Mathieu Lepoutr
Mega Guru

Hi @Ahmer Faraz1 

 

It seems that the issue you're facing is that the attachment passed in base64 format only, and you want to send it as an attachment in the REST message. In that case, you can modify your business rule to include the base64-encoded attachment in the request body as a string, then decode it on the receiving end.

 

Please have a look at Exalate when you have a chance, it is build for use-cases like this.

Mathieu Lepoutr
Mega Guru

hi Ahmer

 

By directly passing the binary data to the RESTMessageV2 using the setRequestBodyFromAttachment() method, you should be able to send the attachment in binary form to Zendesk.

 

Please change business rule to this:

 

 

var a = current.sys_id;

var gr = new GlideRecord('sys_attachment');
gr.addQuery('sys_id', a);
gr.query();
if (gr.next()) {
    var sa = new GlideSysAttachment();
    var binData = sa.getBytes(gr);
}

try {
    attachmentRec = new GlideRecord("incident");
    attachmentRec.addQuery("sys_id", current.table_sys_id);
    attachmentRec.query();

    while (attachmentRec.next()) {
        ZendeskNumber = attachmentRec.u_zendesk_external_inc_number;
    }

    body.content_type = current.content_type + "";
    body.u_zendesk_external_inc_number = ZendeskNumber + "";
    body.number = attachmentRec.number + "";
    body.file_name = current.file_name + "";

    var r = new sn_ws.RESTMessageV2('', '');
    r.setStringParameterNoEscape('file_name', current.file_name);

    r.setRequestBodyFromAttachment(current.file_name, binData); // Pass the binary data directly

    response = r.execute();
    response.getBody();
    response.getStatusCode();

} catch (ex) {
    // Handle any exceptions here
}

 

 

You might also consider exploring Exalate, which could potentially simplify and enhance the integration process between ServiceNow and Zendesk. Its my understanding this would be a way faster approach