ServiceNowからmaltipart形式でファイルデータをSalesforceに連携するMuleアプリケーションの紹介
はじめに
ServiceNowとServiceNow間でレコードとファイルを連携連携する機会があり、ServiceNowからマルチパートのリクエストを送信しSalesforceに連携するサンプルMuleアプリケーションを開発した。サンプルプログラムの利用方法について紹介する。
Muleアプリケーション内の連携処理は以下の通り。

利用手順
利用手順は以下の通り。
- Mule:MuleアプリケーションをCloudHubに配置する。
- SNOW:リクエストモジュールを配置する。
- SNOW:スクリプトバッチでリクエストを実行して、Salesforceで結果を確認する。
手順詳細
1.Mule:MuleアプリケーションをCloudHubに配置する。
CloudHubにデプロイするMuleアプリケーションをGitHubからダウンロードする。
SalesforceにOAuth認証を設定する。
MuleSoftのプロパティファイルに、SalesforceのOAuth認証情報を設定する。
sfdc.tokenEndpoint= https://login.salesforce.com/services/oauth2/token
sfdc.cosumerKey= XXXXX
sfdc.cosumerSecret= XXXXX
sfdc.username= XXXXX@XXXXX.com
sfdc.password= XXXXX
MuleアプリケーションをCloudHubにデプロイし、APIインスタンスと紐づける。
2.SNOW:リクエストモジュールを配置する。
ServiceNowにリクエスト送信用のプログラムを設定する。
var boundary = "--" + "SNOWToSFDCBoundary";
var starter = "--" + boundary + "\r\n";
var footer = "\r\n--" + boundary + "--";
var incidentId = 'e8caedcbc0a80164017df472f39eaed1'; //INC0000003 - PDF FILE
//var incidentId = '8d6246c7c0a80164012fb063cecd4ace'; //INC0000006 - IMAGE
var extId = "1234";
var reqStr = makeApplicationBody(incidentId) + makeAttachedFileBody(incidentId) + footer;
sender(reqStr, boundary);
/*HTTP Request Sender*/
function sender(body) {
gs.info("--sender-Start--");
var Url = 'https://{MuleApplication Endpoint}/api/submit/${sys_id}';
var httpreq = new sn_ws.RESTMessageV2();
httpreq.setHttpMethod('POST');
httpreq.setEndpoint(Url);
httpreq.setStringParameter('sys_id', extId);
// httpreq.setRequestHeader("jwt", makeJWT());
httpreq.setRequestHeader("X-Correlation-ID", createUUID());
httpreq.setRequestHeader("Accept", '*/*');
httpreq.setRequestHeader("Content-Type", 'multipart/form-data; charset=utf-8; boundary=' + boundary);
httpreq.setRequestBody(body);
var response = httpreq.execute();
gs.info("Mule Test Status " + response.getStatusCode());
gs.info("Mule Test Body " + response.getBody());
}
function makeApplicationBody(id) {
//gs.info("--makeApplicationBody-Start--");
var body = "";
var ir = new GlideRecord('incident');
ir.addQuery("sys_id", id);
ir.query();
while (ir.next()) {
var obj = new Object();
obj.subject = "" + ir.number;
obj.status = "" + ir.state;
obj.origin = "Phone";
obj.type = "Electronic";
obj.reason = "SNOWtoSFDC";
obj.description = "" + ir.description;
var apppart = starter;
apppart += "Content-Disposition: form-data; name=\"application\"\r\n";
apppart += "Content-Type: application/json\r\n";
apppart += "\r\n";
apppart += JSON.stringify(obj);
apppart += '\r\n';
body = apppart;
}
gs.info(body);
return body;
}
function makeAttachedFileBody(id) {
//gs.info("--makeAttachedFileBody-Start--");
//var StringUtil = Packages.com.glide.util.StringUtil;
var StringUtil = new GlideStringUtil();
var body = "";
var ar = new GlideRecord('sys_attachment');
ar.addQuery("table_sys_id", id);
ar.query();
//gs.info("--makeAttachedFileBody-1--");
while (ar.next()) {
gs.info("--makeAttachedFileBody-2--");
var sar = new GlideSysAttachment();
var content = sar.getContentBase64(ar);
var fdata = starter;
gs.info("--makeAttachedFileBody-3--");
fdata += "Content-Disposition: form-data; name=\"attachedfiles\"; filename=\"" + encodeURI(ar.file_name) + "\"\r\n";
fdata += "Content-Type: " + ar.content_type + "\r\n";
fdata += "\r\n";
fdata += content;
body = fdata;
gs.info("--makeAttachedFileBody-4--");
}
gs.info(body);
return body;
}
function makeJWT() {
/*JWT Generator*/
var jwtAPI = new sn_auth.GlideJWTAPI();
var headerJSON = {"alg": "RS256","typ": "JWT"};
var header = JSON.stringify(headerJSON);
var jwtProviderSysId = "c8684abf2f437010c27e2ca62799b6ad";
var jwt = jwtAPI.generateJWT(jwtProviderSysId, header, null);
gs.info("JWT Token is " + "\r\n" + jwt);
return jwt;
}
function createUUID() {
/*SessionId Generator*/
var guid = gs.generateGUID();
var uuid = guid.substring(0, 8) + "-" +
guid.substring(8, 12) + "-" +
guid.substring(12, 16) + "-" +
guid.substring(16, 20) + "-" +
guid.substring(20, 32);
return uuid;
}
3.SNOW:スクリプトバッチでリクエストを実行して、Salesforceで結果を確認する。
Salesforceで添付ファイルがアップロードされたことを確認できた。

さいごに
いかがだったでしょうか?
ServiceNowからマルチパート形式でレコードデータとファイルデータを一緒に送信したい場合は是非活用してみてください。では、






