1

我需要能够从 ajax 调用的数据部分解码多个参数到 perl cgi 脚本。我知道其他一切都在使用我的代码,但无论出于何种原因,我似乎都无法让 JSON 模块的 decode 方法正常工作以再次将数据从 JSON 格式恢复为参数。我的 jQuery ajax 调用中的数据是这样设置的,没错。

data: {
    maxRows: 5,
    productName: request.term
}

但是,我尝试将其解析为 perl 的方式有问题。

my $json = JSON->new->utf8->allow_nonref;
my $json_text = $cgi->param('data');
my $json_array = $json->decode( $json_text );

我知道正确的最终结果应该是一个哈希数组。如果我能走到那一步,我知道我会没事的。但是,我的 decode 行不起作用,实际上导致整个脚本在执行时失败。

我环顾四周,我就是想不通。我很确定这是一些非常小的调整。

我是否通过使用 $cgi->param('data') 正确获取参数?它最终会被命名为数据,还是别的什么?

4

2 回答 2

2

如果您将此作为(异步)POST 请求从 jQuery 发送到您的 Perl 脚本,则需要给它一个参数以供 CGI 解析。否则,您将需要查看整个身体。CGI 无法解析这个数据的东西,因为它的格式不正确。

请求的正文必须采用这种形式$cgi->param('data')才能起作用:

data=data:{maxRows:5,productName:request.term}

相反,请尝试使用POSTDATA获取发送到您的脚本的 HTTP 请求的完整正文。

my $data = $query->param('POSTDATA');
my $json_array = $json->decode( $data );

有关更多信息,请参阅CGI 文档。这个问题也可能有帮助:如何使用 CGI.pm 获取整个请求正文?

于 2013-04-09T11:49:13.060 回答
1

您的 JSON 数据无效。使用JSONLint验证您的数据。JSON数据的正确示例如下:

{
    "maxRows": 5,
    "productName": "request.term"
}

如果省略data:键并用引号将对象内的所有键括起来,应该没问题。表达式 request.term 不允许在字符串之外,因为它没有被定义。

编辑

好的,您正在使用 jQuery 发送 JSON 数据。在这里查看如何通过 Ajax 从 jQuery 正确发送 JSON。此外,我建议使用FireBug检查 jQuery.ajax 发布的数据。

于 2013-04-09T11:04:45.557 回答