San*_*ing 4 ajax perl jquery json
我正在创建一个网页,其中有两个表单(用户和所有者),其中一个可以在每个表单中键入逗号分隔的名称,然后点击提交.
我之前尝试过使用JSON而不使用Perl模块.现在我需要以username, full name和的形式为许多用户传输信息owner_name, full name.在Perl中我把它作为两个哈希.
这是一个两部分问题.
服务器端
这是我的Perl脚本.
#!/usr/bin/perl -T
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
use JSON;
use utf8;
use strict;
use warnings;
my $cgi = CGI->new;
$cgi->charset('UTF-8');
my @owners = map { s/\s*//g; $_ } split ",", $cgi->param('owner');
my @users = map { s/\s*//g; $_ } split ",", $cgi->param('users');
# ...
my %user_result = ();
foreach my $u (@users) {
$user_result{$u} = $db1->{$u}{displayName};
}
my %owner_result = ();
foreach my $o (@owners) {
$owner_result{$o} = $db2{$o}{ad_displayname};
}
my $json->{"users"} = \%user_result;
my $json->{"owners"} = \%owner_result;
my $json_string = to_json($json);
print $cgi->header(-type => "application/json", -charset => "utf-8");
print $json_string;
Run Code Online (Sandbox Code Playgroud)
这是将两个哈希值转换为JSON字符串的正确方法吗?
客户端
$(document).ready(function(){
$('form').live('submit', function(){
$.ajax({
type: "GET",
url: "/cgi-bin/ajax.pl",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: $(this).serialize(),
error: function(XMLHttpRequest, textStatus, errorThrown) {
$('div#create_result').text("responseText: " + XMLHttpRequest.responseText +
", textStatus: " + textStatus +
", errorThrown: " + errorThrown);
$('div#create_result').addClass("error");
},
success: function(result){
if (result.error) {
$('div#create_result').text("result.error: " + result.error);
$('div#create_result').addClass("error");
} else { // perl script says everything is okay
// how do I access my two hashes here?
// {"users": [username1, fullname1, ...], "owners": [owner name1, full name 1, ...]}
var users = result.users; // array
var owners = result.owners; // array
alert(users);
alert(owners);
}
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
这是发送和接收JSON的正确方法吗?
以后如何访问数据?
使用Matt Ball和davorg回复更新更新的代码并添加alert(users).
现在的错误json是没有定义对象.
my $json->{"users"} = \%user_result;
my $json->{"owners"} = \%owner_result;
Run Code Online (Sandbox Code Playgroud)
我该如何定义?
您正在尝试打印两个CGI标头块.不幸的是,您只能在每个响应中关联一个CGI块.而且,不幸的是,您打印的第一个标题块具有错误的内容类型标题(它是'text/html',您实际上需要'application/json').
如果你删除'print'内容类型:..."'行,事情应该会好一点.
然后在第二个标题块中,您尝试调用名为"标题"的未知函数.这实际上是你的$ cgi对象的一个方法,因此它需要被称为$ cgi-> header(...).
这些修复实际上应该成功地将一些JSON返回到您的客户端代码.不过我还有其他一些建议.
1 /'split'函数的第一个参数应该是正则表达式,而不是字符串.
2 /您正在构建的JSON数据结构似乎不必要地复杂.对于您的两个部分(用户和所有者)中的每一部分,您都有一个元素数组,其中包含对哈希的引用.当然可以省略数组,因此每个元素只是直接包含哈希引用.
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |