2

我正在使用 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'};

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

4

1 回答 1

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 上都有可用和记录。

于 2013-09-21T12:05:43.890 回答