我试图将一个非常小的自定义Web应用程序与NetSuite集成。我希望每当用户点击我的Web应用程序中的按钮时,就可以在NetSuite中创建自定义记录。
我编写了一个与REST API Testing chrome扩展一起使用的RESTlet。我已通过Chrome扩展程序成功创建了记录。
但是,当我尝试从我的Web应用程序发布POST时,出现此错误:
"对预检请求的响应未通过访问控制检查:否 '访问控制允许来源'标题出现在请求的上 资源。起源' null'因此不允许访问。响应 有HTTP状态代码401。"
如何使用外部站点的RESTlet向NetSuite发送邮件?我是应该使用RESTlet还是有更好的方法?
答案 0 :(得分:5)
RESTlet更像是系统技术的系统。它们需要身份验证,如果您从公共应用程序执行此操作,您的凭据将受到损害。
Netsuite不允许您设置CORS标头,因此您的跨域集成需要通过公共可用的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
}
});
suitelet源文件中的库函数。
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);
}
答案 1 :(得分:0)
这是您的浏览器及其CORS设置
如果在Windows上使用chrome(您应该是;)),请使用以下标志创建chrome快捷方式
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir
然后,在任务管理器中杀死/重启所有chrome的实例并再次尝试您的请求
否则谷歌“在MY_BROWSER上禁用CORS”