我最近启动了一个项目,需要从 NetSuite 向 Boomi 端点发出 HTTP Post 请求。我发现这个非常好的 example 值得借鉴,但它缺少步骤 #8 中对 SuiteScript 正常工作至关重要的库。
下面的代码是我取出并更改以尝试满足我的需求的代码,它在 NetSuite 内部运行没有错误(据我所知),但似乎没有连接到端点。我希望找到一个简化版本,通过基本身份验证连接到端点并传递最少的 XML/JSON 数据。
function Customer_callBoomi()
{
var objType = nlapiGetContext().getSetting('SCRIPT', 'custscriptset_value_object_type');
var BOOMI_USER = nlapiGetContext().getSetting('SCRIPT', 'custscriptset_value_boomi_user');
var BOOMI_PASSWORD = nlapiGetContext().getSetting('SCRIPT', 'custscriptset_value_boomi_password');
var BOOMI_URL = nlapiGetContext().getSetting('SCRIPT', 'custscriptset_value_boomi_url');
try
{
/*Get Record Internal ID.*/
var customerId = nlapiGetRecordId();
var stInputXML = '<ID value=\"' + customerId + '\" type=\"' + objType + '\"/>';
/*create authentication header.*/
var arBoomiHeader = new Array();
var sAuthoizationString = Base64.encode(BOOMI_USER + ':' + BOOMI_PASSWORD);
arBoomiHeader['Content-Type']= 'application/xml';
arBoomiHeader["Authorization"] = "Basic " + sAuthoizationString;
// Suitelet invokes Boomi's real time integration workflow and receives response.
var objBoomiResponse = nlapiRequestURL(BOOMI_URL,stInputXML,arBoomiHeader);
// If there is no timout exception then
if (objBoomiResponse)
{
// if response status is Success
if ((objBoomiResponse.getCode() == '200') || (objBoomiResponse.getCode() == '201') || (objBoomiResponse.getCode() == '202'))
{
// Success!
} else {
// something bad happened
}
}
}
catch (e)
{
var stExceptionDetails = '';
if (e.getDetails != undefined)
{
stExceptionDetails = e.getCode() + ': ' + e.getDetails();
}
else
{
stExceptionDetails = e.toString();
}
}
}
这是原始代码:
当我尝试在没有上述库的情况下运行它时,我收到了类似于下面的错误,除了它说“记录器”。这就是为什么我走上了删除该对象的提及以适应丢失的库的原因:
// Script for Real Time Event Trigger
var stLoggerTitle = 'Real-Time Integration with BOomi';
function EmployeeUpsert_callBoomi(type)
{
var logger = new Logger();
logger.enableDebug();
logger.debug('Entry Log', 'Begin EmployeeUpsert_callBoomi');
var objType = nlapiGetContext().getSetting('SCRIPT', 'custscriptset_value_object_type');
var BOOMI_USER = nlapiGetContext().getSetting('SCRIPT', 'custscriptset_value_boomi_user');
var BOOMI_PASSWORD = nlapiGetContext().getSetting('SCRIPT', 'custscriptset_value_boomi_password');
var BOOMI_URL = nlapiGetContext().getSetting('SCRIPT', 'custscriptset_value_boomi_url');
logger.debug('BOOMI_USER',BOOMI_USER);
logger.debug('BOOMI_PASSWORD', BOOMI_PASSWORD);
logger.debug('BOOMI_URL', BOOMI_URL);
try
{
/*Get Record Internal ID.*/
var sEmployeeRecIntId = nlapiGetRecordId();
var stInputXML = '<ID value=\"' + sEmployeeRecIntId + '\" type=\"' + objType + '\"/>';
logger.debug('Record ID', sEmployeeRecIntId);
logger.debug('Object Type', objType);
/*create authentication header.*/
var arBoomiHeader = new Array();
var sAuthoizationString = Base64.encode(BOOMI_USER + ':' + BOOMI_PASSWORD);
arBoomiHeader['Content-Type']= 'application/xml';
arBoomiHeader["Authorization"] = "Basic " + sAuthoizationString;
// Suitelet invokes Boomi's real time integration workflow and receives response.
logger.debug(stLoggerTitle, '['+new Date() + ']Initiate Boomi Request');
var objBoomiResponse = nlapiRequestURL(BOOMI_URL,stInputXML,arBoomiHeader);
logger.debug(stLoggerTitle, '['+new Date() + ']Process Boomi Response');
// If there is no timout exception then
if (objBoomiResponse)
{
logger.debug(stLoggerTitle,'HTTP Response Code=' + objBoomiResponse.getCode());
// if response status is Success
if ((objBoomiResponse.getCode() == '200') || (objBoomiResponse.getCode() == '201') || (objBoomiResponse.getCode() == '202'))
{
// Success!
} else {
// something bad happened
}
}
}
catch (e)
{
var stExceptionDetails = '';
if (e.getDetails != undefined)
{
stExceptionDetails = e.getCode() + ': ' + e.getDetails();
}
else
{
stExceptionDetails = e.toString();
}
// login execution logs
logger.error(stLoggerTitle, 'Exception Details: '+stExceptionDetails);
}
logger.debug('Exit Log', 'Exit EmployeeUpsert_callBoomi Successfully.');
}
想通了
修改后的代码:
define(['N/https', 'N/log', 'N/runtime', 'N/encode'], function(https, log, runtime, encode) {
function afterSubmit(context) {
try {
// Retrieve script parameters
var endpointUrl = runtime.getCurrentScript().getParameter({
name: 'custscript5'
});
var username = runtime.getCurrentScript().getParameter({
name: 'custscript6'
});
var password = runtime.getCurrentScript().getParameter({
name: 'custscript7'
});
// Get internal ID of the current record
var recordId = context.newRecord.id;
// Define your payload
var payload = {
recordId: recordId
};
// Convert payload to string
var payloadString = JSON.stringify(payload);
// Define headers
var arBoomiHeader = new Array();
var sAuthoizationString = encodeBase64(username + ':' + password);
arBoomiHeader['Content-Type']= 'application/JSON';
arBoomiHeader["Authorization"] = "Basic " + sAuthoizationString;
// Send HTTPS POST request
var response = https.post({
url: endpointUrl,
body: payloadString,
headers: arBoomiHeader
});
// Log response
log.debug({
title: 'HTTPS Response',
details: response.body
});
// Process response as needed
} catch (e) {
// Log error
log.error({
title: 'Error',
details: e
});
}
}
// Function to encode a string to base64
function encodeBase64(str){
var reencoded = encode.convert({
string: str,
inputEncoding: encode.Encoding.UTF_8,
outputEncoding: encode.Encoding.BASE_64,
});
return reencoded;
}
return {
afterSubmit: afterSubmit
};
});