Attachment for soap via webservice

srinivas gupta
Tera Contributor

Hi,

@ankurbiswas 
I have tired diffrent solutions for Attachements for via web service. I have written BR for this 

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

    // Code to check if incident already exist on the other system
    var s = new sn_ws.SOAPMessageV2('Lemongrass''getRecords');
    s.setStringParameterNoEscape('getRecords.number', current.number);
    var response = s.execute();
    var ResponseBody = response.getBody();
    var status = response.getStatusCode();
    var xmlDoc = new XMLDocument2();
    xmlDoc.parseXML(ResponseBody);
    var num = xmlDoc.getNodeText('//number');
    var sysId = xmlDoc.getNodeText('//sys_id');
    //var status = xmlDoc.getNodeText('status_code');
    gs.addInfoMessage(status);
    gs.addInfoMessage(num);
    if (num) {
        //Updating the record if record already exist in the other system
        var s2 = new sn_ws.SOAPMessageV2('Lemongrass''update');
        s2.setStringParameterNoEscape('update.sys_id', sysId);
        s2.setStringParameterNoEscape('update.short_description', current.short_description);
        s2.setStringParameterNoEscape('update.resolved_by', current.resolved_by);
        s2.setStringParameterNoEscape('update.sys_id', sysId);
        s2.setStringParameterNoEscape('update.resolved_at', current.resolved_at);
        s2.setStringParameterNoEscape('update.urgency', current.urgency);
        s2.setStringParameterNoEscape('update.closed_by', current.closed_by);
        s2.setStringParameterNoEscape('update.hold_reason', current.hold_reason);
        s2.setStringParameterNoEscape('update.caller_id', current.caller_id);
        s2.setStringParameterNoEscape('update.category', current.category);
        s2.setStringParameterNoEscape('update.close_notes', current.close_notes);
        s2.setStringParameterNoEscape('update.close_code', current.close_code);
        if (current.state == '6' || current.state == '7' || current.state == '8')
            s2.setStringParameterNoEscape('update.state''7');
        else
            s2.setStringParameterNoEscape('update.state', current.state);
        s2.setStringParameterNoEscape('update.impact', current.impact);
        s2.setStringParameterNoEscape('update.number', current.number);
        s2.setStringParameterNoEscape('update.active', current.active);
        s2.setStringParameterNoEscape('update.work_notes', current.work_notes);
        s2.setStringParameterNoEscape('update.contact_type', current.contact_type);
        s2.setStringParameterNoEscape('update.subcategory', current.subcategory);
        s2.setStringParameterNoEscape('update.priority', current.priority);
        s2.setStringParameterNoEscape('update.description', current.description);
        s2.setStringParameterNoEscape('update.location', current.location);
        s2.setStringParameterNoEscape('update.assignment_group', current.assignment_group);
        s2.setStringParameterNoEscape('update.comments', current.comments);
        s2.setStringParameterNoEscape('update.cmdb_ci', current.cmdb_ci);
        s2.setStringParameterNoEscape('update.closed_at', current.closed_at);
        s2.setStringParameterNoEscape('update.opened_by', current.opened_by);
        s2.setStringParameterNoEscape('update.correlation_id', current.sys_id);

        //////////////////////////////Attachment Code////////////////////////

        var StringUtil = new GlideStringUtil();
        var attachments = new GlideSysAttachment();
        var fileName, contentType;
        var gR = new GlideRecord('sys_attachment');
        gR.addEncodedQuery('table_name=incident^table_sys_id='+current.sys_id);
        gR.query();
        gs.info("123  Records Found"+gR.getRowCount());
        while(gR.next()){
        try {
        var binData =   attachments.getBytes(gR);
        var encData =   StringUtil.base64Encode(binData);
        gs.log('XML Respons for payload='+encData);
        //Calling Attachment API
        var s = new sn_ws.SOAPMessageV2('attachment''insert');
        s.setStringParameterNoEscape('source''incident:'+current.correlation_id);
        s.setStringParameterNoEscape('payload', encData);
        s.setStringParameterNoEscape('topic''AttachmentCreatorV2');
        s.setStringParameterNoEscape('agent''AttachmentCreatorV2');
        s.setStringParameterNoEscape('name', gR.file_name+':'+gR.content_type);
        gs.info("123  Request Body Found"+s.getRequestBody());
        var response = s.execute();
        var responseBody = response.getBody();
        
        var status = response.getStatusCode();
        gs.log("attachment ==== "+status+", resbody = "+responseBody);
        }
        catch(ex) {
        var message = ex.getMessage();
        gs.log("attachment ==== message == "+message);
        }
        }
        
        //////////////////////////////Attachment Code////////////////////////

        var response2 = s2.execute();
        var responseBody2 = response2.getBody();
        var status2 = response2.getStatusCode();
    } else {
        gs.addErrorMessage(num);
        var s1 = new sn_ws.SOAPMessageV2('Lemongrass''insert');
        s1.setStringParameterNoEscape('insert.description', current.description);
        s1.setStringParameterNoEscape('insert.work_notes', current.work_notes);
        s1.setStringParameterNoEscape('insert.impact', current.impact);
        s1.setStringParameterNoEscape('insert.state', current.state);
        s1.setStringParameterNoEscape('insert.close_code', current.close_code);
        s1.setStringParameterNoEscape('insert.closed_by', current.closed_by);
        s1.setStringParameterNoEscape('insert.closed_at', current.closed_at);
        s1.setStringParameterNoEscape('insert.number', current.number);
        s1.setStringParameterNoEscape('insert.close_notes', current.close_notes);
        s1.setStringParameterNoEscape('insert.comments', current.comments);
        s1.setStringParameterNoEscape('insert.resolved_by', current.resolved_by);
        s1.setStringParameterNoEscape('insert.category', current.category);
        s1.setStringParameterNoEscape('insert.caller_id', current.caller_id);
        s1.setStringParameterNoEscape('insert.urgency', current.urgency);
        s1.setStringParameterNoEscape('insert.location', current.location);
        s1.setStringParameterNoEscape('insert.cmdb_ci', current.cmdb_ci);
        s1.setStringParameterNoEscape('insert.short_description', current.short_description);
        s1.setStringParameterNoEscape('insert.contact_type', current.contact_type);
        s1.setStringParameterNoEscape('insert.subcategory', current.subcategory);
        s1.setStringParameterNoEscape('insert.resolved_at', current.resolved_at);
        s1.setStringParameterNoEscape('insert.assignment_group', current.assignment_group);
        s1.setStringParameterNoEscape('insert.priority', current.priority);
        s1.setStringParameterNoEscape('insert.opened_by', current.opened_by);
        s1.setStringParameterNoEscape('insert.hold_reason', current.hold_reason);
        s1.setStringParameterNoEscape('insert.correlation_id', current.sys_id);
        var response1 = s1.execute();
        var responseBody1 = response1.getBody();
        var status1 = response1.getStatusCode();
        gs.log('target resopnse body' + responseBody1);

    }
})(current, previous);
Please go through it get the crt solution for this
Thanks
4 REPLIES 4

Tushar
Kilo Sage
Kilo Sage

Hi @srinivas gupta 

 

I hope this helps -

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

    // check if the incident already exists on the other system
    var s = new sn_ws.SOAPMessageV2('Lemongrass', 'getRecords');
    s.setStringParameterNoEscape('getRecords.number', current.number);
    var response = s.execute();
    var ResponseBody = response.getBody();
    var status = response.getStatusCode();
    var xmlDoc = new XMLDocument2();
    xmlDoc.parseXML(ResponseBody);
    var num = xmlDoc.getNodeText('//number');
    var sysId = xmlDoc.getNodeText('//sys_id');
    gs.addInfoMessage(status);
    gs.addInfoMessage(num);
    if (num) {
        // Updating the record if the record already exists in the other system
        var s2 = new sn_ws.SOAPMessageV2('Lemongrass', 'update');
        s2.setStringParameterNoEscape('update.sys_id', sysId);
        s2.setStringParameterNoEscape('update.short_description', current.short_description);
        s2.setStringParameterNoEscape('update.resolved_by', current.resolved_by);
        s2.setStringParameterNoEscape('update.sys_id', sysId);
        s2.setStringParameterNoEscape('update.resolved_at', current.resolved_at);
        s2.setStringParameterNoEscape('update.urgency', current.urgency);
        s2.setStringParameterNoEscape('update.closed_by', current.closed_by);
        s2.setStringParameterNoEscape('update.hold_reason', current.hold_reason);
        s2.setStringParameterNoEscape('update.caller_id', current.caller_id);
        s2.setStringParameterNoEscape('update.category', current.category);
        s2.setStringParameterNoEscape('update.close_notes', current.close_notes);
        s2.setStringParameterNoEscape('update.close_code', current.close_code);
        if (current.state == '6' || current.state == '7' || current.state == '8')
            s2.setStringParameterNoEscape('update.state', '7');
        else
            s2.setStringParameterNoEscape('update.state', current.state);
        s2.setStringParameterNoEscape('update.impact', current.impact);
        s2.setStringParameterNoEscape('update.number', current.number);
        s2.setStringParameterNoEscape('update.active', current.active);
        s2.setStringParameterNoEscape('update.work_notes', current.work_notes);
        s2.setStringParameterNoEscape('update.contact_type', current.contact_type);
        s2.setStringParameterNoEscape('update.subcategory', current.subcategory);
        s2.setStringParameterNoEscape('update.priority', current.priority);
        s2.setStringParameterNoEscape('update.description', current.description);
        s2.setStringParameterNoEscape('update.location', current.location);
        s2.setStringParameterNoEscape('update.assignment_group', current.assignment_group);
        s2.setStringParameterNoEscape('update.comments', current.comments);
        s2.setStringParameterNoEscape('update.cmdb_ci', current.cmdb_ci);
        s2.setStringParameterNoEscape('update.closed_at', current.closed_at);
        s2.setStringParameterNoEscape('update.opened_by', current.opened_by);
        s2.setStringParameterNoEscape('update.correlation_id', current.sys_id);

        // Attachments handling code
        var attachments = new GlideSysAttachment();
        var attachmentGR = new GlideRecord('sys_attachment');
        attachmentGR.addQuery('table_name', 'incident');
        attachmentGR.addQuery('table_sys_id', current.sys_id);
        attachmentGR.query();

        while (attachmentGR.next()) {
            var fileContents = attachments.getBytes(attachmentGR); // Get attachment contents
            var base64EncodedFile = GlideStringUtil.base64Encode(fileContents); // Encode contents to base64
            
            // Now, you can use base64EncodedFile to attach the file to the SOAP message
            // Add your code here to attach the file to the SOAP message
            // For example, you may need to set a parameter in your SOAP message with the base64EncodedFile value.
        }

        var response2 = s2.execute();
        var responseBody2 = response2.getBody();
        var status2 = response2.getStatusCode();
    } else {
        // Handle the case where the incident doesn't exist in the other system
        // ...
    }
})(current, previous);

 

Please, don't forget to mark my answer as correct if it solves your issue or mark it as helpful if it is relevant for you!

Regards,
Tushar

Hi,
its not working 

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

    // Code to check if incident already exist on the other system
    var s = new sn_ws.SOAPMessageV2('Lemongrass''getRecords');
    s.setStringParameterNoEscape('getRecords.number', current.number);
    var response = s.execute();
    var ResponseBody = response.getBody();
    var status = response.getStatusCode();
    var xmlDoc = new XMLDocument2();
    xmlDoc.parseXML(ResponseBody);
    var num = xmlDoc.getNodeText('//number');
    var sysId = xmlDoc.getNodeText('//sys_id');
    //var status = xmlDoc.getNodeText('status_code');
    gs.addInfoMessage(status);
    gs.addInfoMessage(num);
    if (num) {
        //Updating the record if record already exist in the other system
        var s2 = new sn_ws.SOAPMessageV2('Lemongrass''update');
        s2.setStringParameterNoEscape('update.sys_id', sysId);
        s2.setStringParameterNoEscape('update.short_description', current.short_description);
        s2.setStringParameterNoEscape('update.resolved_by', current.resolved_by);
        s2.setStringParameterNoEscape('update.sys_id', sysId);
        s2.setStringParameterNoEscape('update.resolved_at', current.resolved_at);
        s2.setStringParameterNoEscape('update.urgency', current.urgency);
        s2.setStringParameterNoEscape('update.closed_by', current.closed_by);
        s2.setStringParameterNoEscape('update.hold_reason', current.hold_reason);
        s2.setStringParameterNoEscape('update.caller_id', current.caller_id);
        s2.setStringParameterNoEscape('update.category', current.category);
        s2.setStringParameterNoEscape('update.close_notes', current.close_notes);
        s2.setStringParameterNoEscape('update.close_code', current.close_code);
        if (current.state == '6' || current.state == '7' || current.state == '8')
            s2.setStringParameterNoEscape('update.state''7');
        else
            s2.setStringParameterNoEscape('update.state', current.state);
        s2.setStringParameterNoEscape('update.impact', current.impact);
        s2.setStringParameterNoEscape('update.number', current.number);
        s2.setStringParameterNoEscape('update.active', current.active);
        s2.setStringParameterNoEscape('update.work_notes', current.work_notes);
        s2.setStringParameterNoEscape('update.contact_type', current.contact_type);
        s2.setStringParameterNoEscape('update.subcategory', current.subcategory);
        s2.setStringParameterNoEscape('update.priority', current.priority);
        s2.setStringParameterNoEscape('update.description', current.description);
        s2.setStringParameterNoEscape('update.location', current.location);
        s2.setStringParameterNoEscape('update.assignment_group', current.assignment_group);
        s2.setStringParameterNoEscape('update.comments', current.comments);
        s2.setStringParameterNoEscape('update.cmdb_ci', current.cmdb_ci);
        s2.setStringParameterNoEscape('update.closed_at', current.closed_at);
        s2.setStringParameterNoEscape('update.opened_by', current.opened_by);
        s2.setStringParameterNoEscape('update.correlation_id', current.sys_id);

        //////////////////////////////Attachment Code////////////////////////

        // var StringUtil = new GlideStringUtil();
        // var attachments = new GlideSysAttachment();
        // var fileName, contentType;
        // var gR = new GlideRecord('sys_attachment');
        // gR.addEncodedQuery('table_name=incident^table_sys_id='+current.sys_id);
        // gR.query();
        // gs.info("123  Records Found"+gR.getRowCount());
        // while(gR.next()){
        // try {
        // var binData =   attachments.getBytes(gR);
        // var encData =   StringUtil.base64Encode(binData);
        // gs.log('XML Respons for payload='+encData);
        // //Calling Attachment API
        var attachments = new GlideSysAttachment();
        var attachmentGR = new GlideRecord('sys_attachment');
        attachmentGR.addQuery('table_name''incident');
        attachmentGR.addQuery('table_sys_id', current.sys_id);
        attachmentGR.query();

        while (attachmentGR.next()) {
            var fileContents = attachments.getBytes(attachmentGR); // Get attachment contents
            var base64EncodedFile = GlideStringUtil.base64Encode(fileContents); // Encode contents to base64
            
            // Now, you can use base64EncodedFile to attach the file to the SOAP message
            // Add your code here to attach the file to the SOAP message
            // For example, you may need to set a parameter in your SOAP message with the base64EncodedFile value.
        }
         try {
        var s = new sn_ws.SOAPMessageV2('attachment''insert');
        s.setStringParameterNoEscape('source''incident:'+current.correlation_id);
        s.setStringParameterNoEscape('payload', base64EncodedFile);
        s.setStringParameterNoEscape('topic''AttachmentCreatorV2');
        s.setStringParameterNoEscape('agent''AttachmentCreatorV2');
        s.setStringParameterNoEscape('name', gR.file_name+':'+gR.content_type);
        gs.info("123  Request Body Found"+s.getRequestBody());
        var response = s.execute();
        var responseBody = response.getBody();
        
        var status = response.getStatusCode();
        gs.log("attachment ==== "+status+", resbody = "+responseBody);
        }
        catch(ex) {
        var message = ex.getMessage();
        gs.log("attachment ==== message == "+message);
        }
    
        

        //////////////////////////////Attachment Code////////////////////////

        var response2 = s2.execute();
        var responseBody2 = response2.getBody();
        var status2 = response2.getStatusCode();
    }else {
        gs.addErrorMessage(num);
        var s1 = new sn_ws.SOAPMessageV2('Lemongrass''insert');
        s1.setStringParameterNoEscape('insert.description', current.description);
        s1.setStringParameterNoEscape('insert.work_notes', current.work_notes);
        s1.setStringParameterNoEscape('insert.impact', current.impact);
        s1.setStringParameterNoEscape('insert.state', current.state);
        s1.setStringParameterNoEscape('insert.close_code', current.close_code);
        s1.setStringParameterNoEscape('insert.closed_by', current.closed_by);
        s1.setStringParameterNoEscape('insert.closed_at', current.closed_at);
        s1.setStringParameterNoEscape('insert.number', current.number);
        s1.setStringParameterNoEscape('insert.close_notes', current.close_notes);
        s1.setStringParameterNoEscape('insert.comments', current.comments);
        s1.setStringParameterNoEscape('insert.resolved_by', current.resolved_by);
        s1.setStringParameterNoEscape('insert.category', current.category);
        s1.setStringParameterNoEscape('insert.caller_id', current.caller_id);
        s1.setStringParameterNoEscape('insert.urgency', current.urgency);
        s1.setStringParameterNoEscape('insert.location', current.location);
        s1.setStringParameterNoEscape('insert.cmdb_ci', current.cmdb_ci);
        s1.setStringParameterNoEscape('insert.short_description', current.short_description);
        s1.setStringParameterNoEscape('insert.contact_type', current.contact_type);
        s1.setStringParameterNoEscape('insert.subcategory', current.subcategory);
        s1.setStringParameterNoEscape('insert.resolved_at', current.resolved_at);
        s1.setStringParameterNoEscape('insert.assignment_group', current.assignment_group);
        s1.setStringParameterNoEscape('insert.priority', current.priority);
        s1.setStringParameterNoEscape('insert.opened_by', current.opened_by);
        s1.setStringParameterNoEscape('insert.hold_reason', current.hold_reason);
        s1.setStringParameterNoEscape('insert.correlation_id', current.sys_id);
        var response1 = s1.execute();
        var responseBody1 = response1.getBody();
        var status1 = response1.getStatusCode();
        gs.log('target resopnse body' + responseBody1);

    }
})(current, previous);
i have changed this code its not saving the data in eccqueue  table nd attchaments table based on that what should i write the code.

Ankur Bawiskar
Tera Patron
Tera Patron

@srinivas gupta 

is lemongrass an external app with which you are integrating?

Did you check how it expects the attachment data?

What debugging have you done so far?

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

we have created the name of soap message is lemon grass its is not external app. We are trying to attachement from one instance to another instance.