如何通过Ajax jquery访问Perl中的数组

时间:2013-09-21 11:03:36

标签: jquery ajax perl

我使用带有给定数组的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'};

任何人都可以帮助解决这个问题,以及正确的访问方式。任何帮助将不胜感激。

1 个答案:

答案 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