如何解决Netsuite中的'Invalid Page Parameter'错误



我还是NetSuite的新手,并且已经接管了一个承包商为我们做的项目,所以这可能是一个简单的问题。我们有一个Suitelet正在调用另一个具有nlapiRequestURL的Suitelet。被调用的Suitelet应该返回一个ID。相反,我们得到了一个"无效页面参数"响应。

我查看了被调用的Suitelet的配置,有一个参数设置,但该参数上的"首选项"字段为空,根据文档,这表明在这种情况下,应该在"参数"选项卡上的"部署"中定义参数值。它是,并且看起来是正确的值。

因此,我认为问题在于nlapiRequestURL中使用的URL中的一个参数,而不是Netsuite中脚本记录上定义的参数。以下是其中一个URL的示例。我只是更改了compid,原因很明显:

https://forms.sandbox.netsuite.com/app/site/hosting/scriptlet.nl?script=147&deploy=1&compid=12345&h=e06792b0e7727d53f816&internalIds=17509

我验证了"147"是正确的脚本id。我还尝试从URL中逐个删除每个参数,但这不起作用。根据我删除的参数,我会得到"发生意外错误"或"缺少所需参数"。在被调用的Suitelet中使用的唯一参数是"internalids"。我可以看到它是通过"request.getParameter("internalIds")"获得的。(见下面的代码)

顺便说一句,我不确定"h"参数在URL中的作用,也找不到它、compid或deploy的配置位置。我想知道"h"值是否不正确,但不确定它是用来做什么的。为什么URL中包含"compid"、"deploy"one_answers"h"?我可以假设compid是用来识别我们公司的,但我不知道有人如何确定如何为请求构建URL,因为我不知道那里有什么强制性参数。我想我不知道在Netsuite的哪里可以找到那个配置。某个地方有基本URL的设置吗?

不管怎样,这就是下面正在调用的脚本。另一个脚本比较长,而且有一些与公司相关的信息,所以我不打算包括它,但我认为这无关紧要。唯一需要知道的是,我们使用上面的URL和nlapiRequestURL来调用下面的脚本,并对结果调用"getBody"。

function suitelet(request, response){

nlapiLogExecution('DEBUG', 'suitelet', 'In the Preview_Link.suitelet function');
nlapiLogExecution('DEBUG', 'suitelet', 'The request is ' + JSON.stringify(request));
nlapiLogExecution('DEBUG', 'suitelet', 'The response is ' + JSON.stringify(response));
var context = nlapiGetContext();
var folderInternalId    = context.getSetting('SCRIPT', 'custscript_buffer_folder_for_temp_pdf');
var strInternalIds      = request.getParameter('internalIds');
if(!strInternalIds)
return;
var internalIds         = strInternalIds.split(',');
if(!internalIds || internalIds.length == 0)
return;
var xml = "<?xml version="1.0"?>n<!DOCTYPE pdf PUBLIC "-//big.faceless.org//report" "report-1.1.dtd">n";
xml += "<pdfset>";

for (var index = 0; index < internalIds.length; index++)
{
var internalId = internalIds[index];
xml += "<pdf src='"+ nlapiEscapeXML(nlapiLoadFile(internalId).getURL()) +"'/>";
}
xml += "</pdfset>";
var file = nlapiXMLToPDF(xml);
file.setName(internalIds[0] + '_' + internalIds.length + '_' + Math.random() +'.pdf');
file.setFolder(folderInternalId);
file.setIsOnline(true);
var internalIDUpdatedData = nlapiSubmitFile(file);
response.writeLine(internalIDUpdatedData);  

}

因此,"custscript_buffer_folder_for_temp_pdf"是在Netsuite中的脚本记录上定义的参数,在该脚本的"部署"选项卡上的"参数"选项卡上有一个值"36",这是我们想要的值。这是我们在文件柜中的"TEMP"文件夹internalIds是在调用上面的脚本中定义的,它要么是单个整数,要么是逗号分隔的列表。(尽管它似乎总是一个单一的值)

我应该提到,这在我们的生产实例中是有效的,我们两天前刚刚根据生产刷新了Sandbox实例。在刷新之前,它在Sandbox中也不起作用。我能看到的唯一区别是,在生产中,域名在URL中是不同的,这当然是必须的。除了两个环境之间的代码和设置之外,所有的代码和配置似乎都是相同的。

就像我说的,我是Netsuite的新手,所以我以前没有使用过nlapiRequestURL。所以这可能是我忽略的非常愚蠢的事情。我已经逐步完成了执行调用的脚本中的代码,但似乎无法调试使用nlapiRequestURL调用的Suitelet。我在被调用的脚本中放置了一个nlapiLogExecution调用作为第一行,但它似乎从未达到这一点。在它真正进入脚本之前,我只得到了上面提到的一个错误。

如果有人有什么建议,我将不胜感激。我或多或少已经耗尽了我的知识和资源。提前谢谢,如果你需要更多信息,请告诉我。

您可能想尝试的一些东西:

var baseSuiteletURL = nlapiResolveURL('SUITELET', SUITELET_SCRIPT_ID, SUITELET_DEPLOYMENT_ID, true); //Getting URL from script id and deployment id
var reqUrl = baseSuiteletURL + "&internalids=17509"; //Adding your GET parameter here (all in lowercase)
var requestBody = {}; //Alternatively you could send your parameters within the POST body
requestBody.internalids = 17509;
var reqBody = JSON.stringify(requestBody);
var reqHeaders = {};
reqHeaders["User-Agent"] = "Mozilla/5.0"; //Sending user agent header to allow Suitelet to Suitelet calls
var myResponse = nlapiRequestURL(reqUrl, reqBody, reqHeaders);

测试以小写形式发送GET查询参数(internalids),我以前遇到过参数大小写转换的问题,这会造成不必要的麻烦。

最新更新