Я передаю через jquery
$.ajax({
'type' : 'POST',
'data' : {
'foo': {
'foo1':'bar1,
'foo2':'bar2'
}
},
'async' : false,
'global' : false,
'url' : "path/to/script.pl",
'dataType' : "json",
'success' : function(data) {
json = data;
},
'error' : function(jqxhr, textStatus, error) {
console.log("Request Failed: " + textStatus);
console.log(error);
}
});
на мой cgi script.
HTML Параметр: foo%5Bfoo1%5D=bar1&foo%5Bfoo2%5D=bar2
Я не могу использовать foo
как массив, используя $cgi->param('foo[]')
CGI:: param, вызванный в контексте списка из основной строки 30 пакета, что может привести к уязвимостям. См. Предупреждение в разделе "Получение значения или значений одного именованного параметра
Кажется, что все элементы массива жестко закодированы в параметр, например 'foo [foo1]'.
Можно ли получить динамический доступ?
Вывод use Data::Dumper; print Dumper scalar $cgi->Vars();
$VAR1 = bless( {
'use_tempfile' => 1,
'.fieldnames' => {},
'.charset' => 'ISO-8859-1',
'.parameters' => [
'foo[foo1]',
'foo[foo2]'
],
'escape' => 1,
'param' => {
'foo[foo2]' => [
'bar2'
],
'foo[foo1]' => [
'bar¹'
]
}
}, 'CGI' );
Вам нужно отправить данные как строку json
'data' : JSON.stringify({
'foo': {
'foo1':'bar1',
'foo2':'bar2'
}
}),
и на стороне сервера преобразует строку в собственную структуру perl,
use JSON;
my $data = decode_json( $cgi->param('keywords') );
Я искал метод perl-own для преобразования json-массивов обратно в реальные массивы или хэш.
Итак, я сделал это самостоятельно:
my $cgi = CGI->new();
my %hash = ();
foreach my $a ($cgi->param())
{
if($a =~ /^([\w\-]+)\[(.*)\]/) #TODO multidimensional
{
$hash{$1}{$2} = $cgi->param($a);
}
else
{
$hash{$a} = $cgi->param($a);
}
}
%hash
- %
говорит, что это хэш, и вы должны использовать идентификатор, чтобы сказать что-то о его назначении
Я думаю, вы хотите что-то вроде этого. Сначала jquery, который отправляет данные.
<!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(){
$.ajax({
type: 'POST',
url: 'ajax1.cgi',
data: {'foo': {
'foo1':'bar1',
'foo2':'bar2'
}
},
success: function(res) {
$( ".demo" ).append("your first var is: " + res.foo1+"<br />");
$( ".demo" ).append("your second var is :"+res.foo2);
},
error: function() {alert("did not work");}
});
})
})
</script>
</head>
<body>
<button id="test" >Testing</button>
<div class="demo" >
</div>
</body>
Cgi script - ajax1.cgi. Обратите внимание, что ответ отправляется в формате json.
#!/usr/bin/perl
use strict;
use warnings;
use JSON; #if not already installed, just run "cpan JSON"
use CGI;
use Data::Dumper;
my $cgi = CGI->new;
print $cgi->header('application/json;charset=UTF-8');
#my $id = $cgi->param('foo[]');
my @cgivars=$cgi->param; #get all key value of param in array
my $cgivar1="Not defined";
my $cgivar2="Not defined";
foreach my $a(@cgivars){
if($cgi->param($a) eq 'bar1'){
$cgivar1="bar1"; #means do whatever you like to do here
}
else{
$cgivar2="bar2"; #same here etc
}
}
#print Dumper scalar $cgi->Vars();
#convert data to JSON
my $op = JSON -> new -> utf8 -> pretty(1);
my $json = $op -> encode({
foo1=>$cgivar1,
foo2=>$cgivar2
});
print $json;