如何从 RESTlet 调用内部 Suitelet?
How to call internal Suitelet from RESTlet?
我正在尝试通过搜索锁定 return 事务的 Suitelet,但我无法从 RESTlet POST 访问它,除非它无需登录即可使用。如果我将 Suitelet 设置为内部并从 RESTlet 调用它,它将 return 一个提示登录的页面。
有没有办法在不让 Suitelet 不登录的情况下完成此操作?
Suitelet 示例(删除了一些不相关的代码以简化):
define(['N/search', 'N/runtime'],
function(search, runtime) {
function onRequest(context) {
try {
var startDate = context.request.parameters.start_date;
var scriptObj = runtime.getCurrentScript();
if (!startDate) {
context.response.write('The start date is required in order to load the relevant records.');
return;
}
else {
log.debug('Start date parameter is: ' + startDate);
}
var searchCriteria = {
type: "invoice",
filters:
[
["datecreated","after", startDate],
"AND",
["mainline","is","T"]
],
columns:
[
search.createColumn({name: "tranid", label: "Document Number"}),
search.createColumn({name: "total", label: "Total"})
]
};
var searchObj = getAllResults(searchCriteria);
var searchResultCount = searchObj.length;
log.debug("searchObj result count", searchResultCount);
var invoices = [];
for (var i = 0; i < searchResultCount; i++) {
var tranId = searchObj[i].getValue({name: 'tranid'});
var total = searchObj[i].getValue({name: 'total'});
invoices.push({
tranId: tranId,
total: total
});
}
var jsonObj = {
success: 'true',
};
} catch (error) {
var jsonObj = {
success: 'false'
};
log.error('error', error);
return jsonObj;
}
log.debug('JSON obj', jsonObj);
context.response.write(JSON.stringify(jsonObj));
return jsonObj;
}
示例 RESTlet:
define(['N/search','N/error','N/https','N/url','N/runtime'],
function(search, error, https, url, runtime) {
function doGet(request) {
log.audit({title:'request', details:request});
var startDate = request.startdate;
var params = {
'start_date': startDate,
'current_role': currentRole
};
var header = [];
header['Content-Type']='application/json';
try {
var suiteletURL = url.resolveScript({
scriptId: 'customscript_get_invoices',
deploymentId: 'customdeploy_get_invoices',
returnExternalUrl: true
});
log.debug('Suitelet URL', suiteletURL);
var formRequest = https.post({
url: suiteletURL,
body: params
});
return formRequest;
}
catch(e) {
var errorStr = 'Error posting to suitelet link';
log.error(errorStr, e.message);
throw error.create({
name: errorStr,
message: e.message,
notifyOff: true
});
}
}
return {
get: doGet
};
});
与将共享代码移动到库脚本文件并从 Suitelet 和 Restlet 调用它相比,这将消耗额外的并发性。
因此,应避免在 NetSuite 中调用环绕式 Web 服务。
我正在尝试通过搜索锁定 return 事务的 Suitelet,但我无法从 RESTlet POST 访问它,除非它无需登录即可使用。如果我将 Suitelet 设置为内部并从 RESTlet 调用它,它将 return 一个提示登录的页面。
有没有办法在不让 Suitelet 不登录的情况下完成此操作?
Suitelet 示例(删除了一些不相关的代码以简化):
define(['N/search', 'N/runtime'],
function(search, runtime) {
function onRequest(context) {
try {
var startDate = context.request.parameters.start_date;
var scriptObj = runtime.getCurrentScript();
if (!startDate) {
context.response.write('The start date is required in order to load the relevant records.');
return;
}
else {
log.debug('Start date parameter is: ' + startDate);
}
var searchCriteria = {
type: "invoice",
filters:
[
["datecreated","after", startDate],
"AND",
["mainline","is","T"]
],
columns:
[
search.createColumn({name: "tranid", label: "Document Number"}),
search.createColumn({name: "total", label: "Total"})
]
};
var searchObj = getAllResults(searchCriteria);
var searchResultCount = searchObj.length;
log.debug("searchObj result count", searchResultCount);
var invoices = [];
for (var i = 0; i < searchResultCount; i++) {
var tranId = searchObj[i].getValue({name: 'tranid'});
var total = searchObj[i].getValue({name: 'total'});
invoices.push({
tranId: tranId,
total: total
});
}
var jsonObj = {
success: 'true',
};
} catch (error) {
var jsonObj = {
success: 'false'
};
log.error('error', error);
return jsonObj;
}
log.debug('JSON obj', jsonObj);
context.response.write(JSON.stringify(jsonObj));
return jsonObj;
}
示例 RESTlet:
define(['N/search','N/error','N/https','N/url','N/runtime'],
function(search, error, https, url, runtime) {
function doGet(request) {
log.audit({title:'request', details:request});
var startDate = request.startdate;
var params = {
'start_date': startDate,
'current_role': currentRole
};
var header = [];
header['Content-Type']='application/json';
try {
var suiteletURL = url.resolveScript({
scriptId: 'customscript_get_invoices',
deploymentId: 'customdeploy_get_invoices',
returnExternalUrl: true
});
log.debug('Suitelet URL', suiteletURL);
var formRequest = https.post({
url: suiteletURL,
body: params
});
return formRequest;
}
catch(e) {
var errorStr = 'Error posting to suitelet link';
log.error(errorStr, e.message);
throw error.create({
name: errorStr,
message: e.message,
notifyOff: true
});
}
}
return {
get: doGet
};
});
与将共享代码移动到库脚本文件并从 Suitelet 和 Restlet 调用它相比,这将消耗额外的并发性。
因此,应避免在 NetSuite 中调用环绕式 Web 服务。