我使用带有给定数组的jquery ajax从HTML调用Perl脚本。
var items = [
{ "itemname": "item1", "mrpprice": 1999, "sellprice" : 21.50, "quantity": 2},
{ "itemname": "item2", "mrpprice": 1999, "sellprice" : 22.50, "quantity": 1}
];
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "/cgi-bin/submit_order.pl", // URL of the Perl script
data: { itemsArray : items },
success: function(data)
{ alert ("success")}
});
并在perl文件中读取CGI参数。
my @values = $cgi->param('items[]');
但无法访问Perl文件中的值。我使用以下语法进行访问。
print $values[0]{'quantity'};
任何人都可以帮助解决这个问题,以及正确的访问方式。任何帮助将不胜感激。
答案 0 :(得分:0)
这里有一些潜在的错误。
type: "GET"
如果要在请求正文中发送数据,则需要使用POST。即使你试图在这里使用查询字符串 - 不要。没有什么可以通过这种方式获得的。在这种情况下,POST更加整洁。
接下来,这不是表单,您传递的不是表单数据。这样:
dataType: "json",
data: { itemsArray : items }
以json格式创建普通的序列化数组。它没有与之关联的任何类型的标签(“itemsArray”或“items”) - 这是您在客户端上序列化的数据。这一切都很好,这正是你想要的(再次,它不是形式编码,它是json)。它看起来像[{ "itemname": "item1", "mrpprice": 1999, "sellprice" : 21.50, "quantity": 2},{ "itemname": "item2", "mrpprice": 1999, "sellprice" : 22.50, "quantity": 1}]
。看看这是如何将js数组序列化为字符串的?那是json。但是“itemName”或“item” - 变量上的标签 - 不是变量的内容的一部分。而您发送的只是内容。再一次,这就是你想要的。
我不确定CGI模块是否有办法解决这个问题,但我会跳过它 - CGI脚本在STDIN
接收输入,CGI模块只是为你解析。但是,它期望表单数据,而且,这不是这个。但是您可以自己解析STDIN,或者更确切地说,读取STDIN并获取perl JSON模块来为您解析它。
我确信您仍然可以使用.cgi脚本来执行此操作,只需要处理原始输入。 这意味着真正跳过CGI模块,否则它会窃取您的输入。所以不要use CGI
。省略该模块。服务器将在STDIN上传递原始帖子正文,因为脚本已作为CGI可执行文件注册到服务器 - 您根本不需要任何perl模块。所以首先要阅读输入:
my $json= "";
while (<STDIN>) {
$json .= $_;
}
这将是POST正文中的序列化字符串。把它变成perl数组:
use JSON::XS;
my $arrayRef = decode_json($json);
该模块还有纯粹的perl版本。 CPAN上有两个可用和documented。