如何从外部站点POST 到NetSuite 自定义记录?

How to POST to NetSuite custom record from external site?

我正在尝试将一个非常小的自定义 Web 应用程序与 NetSuite 集成。每当用户单击我的 Web 应用程序中的按钮时,我希望在 NetSuite 中创建自定义记录。

我编写了一个与 REST API 测试 chrome 扩展配合使用的 RESTlet。我已经通过 chrome 扩展成功创建了记录。

但是,当我尝试从我的 Web 应用程序 POST 时,出现此错误:

"Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 401."

如何从外部站点 POST 使用 RESTlet 连接到 NetSuite?我应该使用 RESTlet 还是有更好的方法?

这是您的浏览器及其 CORS 设置

如果在 Windows 上使用 chrome(你应该是 ;)),请使用以下标志创建一个 chrome 快捷方式 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir

然后,在任务管理器中 kill/restart chrome 的所有实例并再次尝试您的请求

否则google"disable CORS on MY_BROWSER"

RESTlets 更像是一种系统到系统的技术。他们需要身份验证,如果您从 public 应用程序执行此操作,您的凭据将被泄露。

Netsuite 不允许您设置 CORS header 因此您的跨域集成需要通过 public 唯一可用的 suitelet 和 JSONP。

由于 JSONP 使用 get 请求,您需要确保您的 url 参数最终少于大约 2k 个字符。这不是标准限制,所以 ymmv

我经常使用的模式: 客户代码:

var url = "public suitelet url from deployment screen";
    var params = {
        mode: 'neworder',
        //simple name/value data
    };
    $.ajax({
            url: url+"&"+ $.param(params) +"&jsoncallback=?",
            cache:false,
            dataType:'json',
            success: function(jResp){
                if(!jResp.success){
                    if(jResp.message) alert(jResp.message);
                    return;
                }
                // act on the results
            }
    });

套件源文件中的一个库函数。

function _sendJSResponse(request, response, respObject){
    response.setContentType('JAVASCRIPT');
    //response.setHeader('Access-Control-Allow-Origin', '*');
    var callbackFcn = request.getParameter("jsoncallback")  || request.getParameter('callback');
    if(callbackFcn){
        response.writeLine( callbackFcn + "(" + JSON.stringify(respObject) + ");");
    }else response.writeLine( JSON.stringify(respObject) );
}

然后是 Suitelet 函数

function service(request, response){
    ... do some work and generate a response
    var returnObj = {
        success:true,
        message: '',
        result:result
    };

    _sendJSResponse(request, response, returnObj);
}