从 NetSuite SuiteScript 到 Boomi 端点的 HTTP Post

问题描述 投票:0回答:1

我最近启动了一个项目,需要从 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();
        }   
    }
}

这是原始代码:

当我尝试在没有上述库的情况下运行它时,我收到了类似于下面的错误,除了它说“记录器”。这就是为什么我走上了删除该对象的提及以适应丢失的库的原因:

enter image description here

// 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.');
}
http post netsuite suitescript
1个回答
0
投票

想通了

  1. 基本身份验证的用户名和密码、instanceID 和身份验证令牌忘记了这个怪癖。
  2. 脚本和文件名需要对齐,并且末尾还有“.js”,就像这样 --> BoomiTestv5.js
  3. 我在代码中使用了实际的 Id 值作为参数
  • 很可能不是最佳实践,但它完成了工作。

修改后的代码:

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
    };
});
© www.soinside.com 2019 - 2024. All rights reserved.