2013-04-09 37 views
1

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

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); 

我知道正确的最终结果应该是散列数组。如果我可以得到这么多,我知道我会没事的。但是,我的解码行不起作用,并且实际上会导致整个脚本在执行时失败。

我环顾四周,我只是无法弄清楚这一点。我很确定这是一个非常小的调整。

我使用$ cgi-> param('data')正确获取参数吗?它最终是否被命名为数据,还是其他东西?

回答

1

您的JSON数据无效。使用JSONLint验证您的数据。 JSON数据的正确例子如下:如果省略data:密钥和用引号括起来的对象内的所有键

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

,你应该罚款。表达式request.term在字符串之外是不允许的,因为它没有被定义。

编辑

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

+0

确定吗? jQuery API和演示已经完成了他们以上的方式。我甚至测试了这个演示代码:http://jqueryui.com/autocomplete/#remote-jsonp我自己,它的工作。我只是没有服务器端脚本来看看它是如何被解析的。 – sage88 2013-04-09 11:10:44

+0

是的,我以前见过这种方法,我想我只是想更深入地理解如何使用CGI.pm获取AJAX数据。相比之下,这种方法看起来像是一种黑客攻击。 http://www.ibm.com/developerworks/webservices/library/ws-simplelogin/它使用相同的概念。我知道我现在的工作方式,我只是不知道geonames.org使用的解析技术。但我想乞丐不能是选择者。 – sage88 2013-04-09 11:24:56

+0

另一方面,我使用开发者工具开启的Google Canary。我可以看到出现的查询字符串参数为:maxRows:5 productName:bi(如果我在输入中输入bi)。所以即使是开发者工具也正确地解析它们,这特别令人厌烦。 – sage88 2013-04-09 11:26:28

1

如果您将此作为从jQuery发出的(异步)POST请求发送给您的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 doc。这个问题可能也有帮助:How can I get the entire request body with CGI.pm?

+0

请问downvoter请解释这个答案的问题是什么? – simbabque 2013-04-09 13:36:41

+0

不是我。我给你+1了。我认为这是应该如何解决这个问题的方法,但是目前的说法并不奏效。我玩了几个小时,并且无法正常工作。刚刚使用这里显示的准黑客方法结束:http://www.ibm.com/developerworks/webservices/library/ws-simplelogin/?ca=drs- – sage88 2013-04-10 04:03:24

+0

@ sage88我认为它是有道理的,现在你想要什么做。你真的只需要提交你的POST几个参数。那里不需要JSON。 – simbabque 2013-04-10 07:46:14