2013-04-09 39 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