2013-09-21 103 views
2

我使用jquery ajax和給定的數組從HTML調用Perl腳本。如何通過Ajax訪問通過Perl傳遞的數組jquery

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'}; 

任何人都可以幫助什麼在這個錯誤,什麼是正確的方式來訪問。任何幫助將不勝感激。

+0

不應該'$ cgi-> param('items []')'是'$ cgi-> param('itemsArray []')' –

+0

嘗試了$ cgi-> param('itemsArray []')。結果是一樣的。 –

+0

'使用Data :: Dumper;打印翻斗車$ cgi-> param'也許? – TLP

回答

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