2014-02-14 112 views
2

如何從通過AJAX傳遞的JavaScript數組創建Perl數組?如何通過AJAX將JavaScript數組傳遞給Perl腳本?

Perl的訪問:

@searchType = $cgi->param('searchType'); 
print @searchType[0]; 

輸出:

employee,admin,users,accounts 

看來,Perl數組設置第一值(@searchType[0]),因爲所有通過JavaScript數組對象的字符串。

+0

使用JSON序列化數據。 – ThisSuitIsBlackNot

+0

@JamesHickman:因爲ThisSuitIsBlack不建議,一個方法是使用JSON。我認爲,我在下面添加了一個工作示例,可以實現您想要的功能。請讓我知道這是否適合您,或者是否需要適應您的需求。 – Cleb

回答

1

您需要以key=value&key=other-value的形式表達。

var searchType = ["employee", "admin", "users", "accounts"]; 
var keyName = "searchType"; 
for (var i = 0; i < searchType.length; i++) { 
    searchType[i] = encodeURIComponent(keyName) + "=" + encodeURIComponent(searchType[i]); 
} 
var queryString = searchType.join("&"); 

然後,使用queryString作爲URL的一部分或發佈數據。

+0

雖然將數組轉換爲字符串的方法是可行的,但它並不是最有效的方法。應該可以傳遞一個實際的數組對象。我在PHP中做了很多次,但是這個項目是在PERL中,所以我希望找到一種方法來正確地將傳入的JS數組轉換爲PERL數組。從我讀到的這是可能的,我只是不確定正確的方式去做。 – JimmyJammed

+2

@James Hickman,Re「應該可以傳遞一個實際的數組對象。」,不可能的。只有字節可以通過套接字發送。數據結構需要序列化並在另一端重新創建。使用'application/x-www-form-urlencoded'序列化Quentin(因爲它可以與我的@searchType = $ cgi-> param('searchType')')一起工作。我會用JSON去(因爲從長遠來看它會導致更少的麻煩)。但有一點需要使用。 – ikegami

+0

除非我處理複雜的數據結構,否則我更喜歡'application/x-www-form-urlencoded'數據,因爲它可以用表單生成,因此可以減少對JavaScript的依賴。它也會被每個服務器端表單庫自動分析,所以你不需要編寫額外的JSON解碼步驟。 – Quentin

3

這是一個老問題,所以我不確定這對你是否仍然有趣,但也許別人也對這個問題感興趣。如上所述,通過ajax將javascript數組傳遞給Perl的一種方法是將此數組首先轉換爲JSON對象 - 使用「JSON.stringify(jsArray);」將該數組轉換爲JSON對象。 - 然後在Perl腳本中解碼。我在下面添加了一個非常簡單的示例,其中數組的第一項通過警報返回。

的index.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Testing ajax</title> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
     <script> 

      $(document).ready(function() { 

       $("#test").click(function(){ 
        var jsArray = ["employee", "admin", "users", "accounts"]; 
        var jsArrayJson = JSON.stringify(jsArray); 
        $.ajax({ 
          type: 'POST', 
          url: '/cgi-bin/ajax/stackCGI/processJsArray.pl', //change the path 
          data: { 'searchType': jsArrayJson}, 
          success: function(res) {alert(res);}, 
          error: function() {alert("did not work");} 
        }); 
       }) 

      }) 

     </script> 
    </head> 
    <body> 
     <button id="test" >Push</button> 

    </body> 
</html> 

processJsArray.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

use CGI; 
use JSON; 

my $q = CGI->new; 

my @myJsArray = @{decode_json($q->param('searchType'))}; #read the json object in as an array 

print $q->header('text/plain;charset=UTF-8'); 
print "first item:"."\n"; 
print $myJsArray[0]."\n"; 
+0

您正在發送嵌入在application/x-www-form-urlencoded中的JSON。這是不必要的複雜。挑一個或另一個。我會使用表單數據,因爲它更容易構建[逐步](http://en.wikipedia.org/wiki/Unobtrusive_JavaScript)。 – Quentin

+0

@Quentin:當然,可能會有比我發佈的解決方案更有效的解決方案。但我認爲這與詹姆斯在他的問題中發表的內容有點接近。但似乎他解決了這個問題或失去了對它的興趣......也許這篇文章幫助別人:) – Cleb

相關問題