Javascript Dojo中的Ajax与Perl
谁能告诉我我做错了什么? 我正在创建一个简单的系统来让人们进出用户组,为此我使用Dojo和Perl。(如果我可以用我的方式,那就是PHP,但我不是老板。) 目前我只使用了三个文件,一个用于Perl,一个用于JavaScript,一个用于CSS样式 CGI脚本的开始路由到不同的函数,如下所示:Javascript Dojo中的Ajax与Perl,javascript,ajax,perl,post,dojo,Javascript,Ajax,Perl,Post,Dojo,谁能告诉我我做错了什么? 我正在创建一个简单的系统来让人们进出用户组,为此我使用Dojo和Perl。(如果我可以用我的方式,那就是PHP,但我不是老板。) 目前我只使用了三个文件,一个用于Perl,一个用于JavaScript,一个用于CSS样式 CGI脚本的开始路由到不同的函数,如下所示: if ($search = $cgi->param('psearch')) { dbConnect(); jsonSearchPersons($search); dbDisconnect(
if ($search = $cgi->param('psearch')) {
dbConnect();
jsonSearchPersons($search);
dbDisconnect();
} elsif ($user_id = $cgi->param('person')){
dbConnect();
create_form($user_id);
dbDisconnect();
} elsif ($user_id = $cgi->param('saveuser')) {
save_user();
} else {
mainPage();
};
...
sub save_user {
print $cgi->header(-type=>'text/plain',-charset=>'utf-8');
print("success");
}
现在的问题是,我想通过Ajax调用(调用此URL:users.cgi?saveuser=xx
)为用户保存新组。在我看来,这应该是一个POST调用,所以我做了这个,并尝试将生成的HTML/文本附加到
中,但没有成功:
dojo.xhr.post({
url: "/cgi-bin/users.cgi?saveuser="+user_id,
content: {
new_groups: group_ids.toString()
},
load: function(html_content){
var element = document.getElementById("test_area");
element.innerHTML = html_content;
},
error: function(){
alert("An error has occured during the save of new user groups.");
}
});
当我使用dojo.xhr.get()执行此操作时代码>它工作得很好,但是当我使用POST时,它就像跳过了if语句的那部分,只是附加了mainPage()
函数。Dojo和Perl之间有什么基本的东西我不明白吗?我是否必须设置页面以便它接受POST呼叫?或者我做错了什么
注意:这是我通过Dojo和Perl创建的第一个“系统”。(我通常是一个PHP/jQuery类型的人,手工制作所有UI,所以我对它有点陌生。)尝试将saveuser
-参数添加到dojo.xhrPost
的content
-对象中,而不是在url中传递它
您试图将saveuser参数作为GET传递,另一个作为POST传递,这可能会混淆您的服务器端部分
试着这样做:
dojo.xhr.post({
url: "/cgi-bin/users.cgi",
content: {
new_groups: group_ids.toString(),
saveuser: user_id
},
load: function(html_content){
var element = document.getElementById("test_area");
element.innerHTML = html_content;
},
error: function(){
alert("An error has occured during the save of new user groups.");
}
});
尝试将saveuser
-参数添加到dojo.xhrPost
的content
-对象中,而不是将其传递到url中
您试图将saveuser参数作为GET传递,另一个作为POST传递,这可能会混淆您的服务器端部分
试着这样做:
dojo.xhr.post({
url: "/cgi-bin/users.cgi",
content: {
new_groups: group_ids.toString(),
saveuser: user_id
},
load: function(html_content){
var element = document.getElementById("test_area");
element.innerHTML = html_content;
},
error: function(){
alert("An error has occured during the save of new user groups.");
}
});
CGI.pm的第675行:
# Some people want to have their cake and eat it too!
# Uncomment this line to have the contents of the query string
# APPENDED to the POST data.
# $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
让我笑了 CGI.pm的第675行:
# Some people want to have their cake and eat it too!
# Uncomment this line to have the contents of the query string
# APPENDED to the POST data.
# $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
让我笑了 找到了解决办法
问题是我的javascript。在发布到perl脚本时,使用$cgi=新cgi;诸如此类。这将获取GET和POST变量并验证它们。在我的javascript/dojo代码中,我使用了一个带有GET-vars的url,然后也发表了一篇文章。这意味着perl无法找到(或混合)这两种变量类型。因此,当我更改ajax代码(如下所示)时,它起作用了,因为$cgi->param('saveuser')同时获取“saveuser”的GET和POST(不需要更改perl):
有点怪,但我很高兴,因为它现在工作得很好:D找到了解决方案
问题是我的javascript。在发布到perl脚本时,使用$cgi=新cgi;诸如此类。这将获取GET和POST变量并验证它们。在我的javascript/dojo代码中,我使用了一个带有GET-vars的url,然后也发表了一篇文章。这意味着perl无法找到(或混合)这两种变量类型。因此,当我更改ajax代码(如下所示)时,它起作用了,因为$cgi->param('saveuser')同时获取“saveuser”的GET和POST(不需要更改perl):
有点怪,但我很高兴,因为它现在工作得很好:D是的,可能会工作。但是,如果不是服务器端的问题,那么就不可能发布到像users.cgi?some=xx这样的url吗?但是,我可以通过浏览器连接到该站点,查看成功消息。我根本不喜欢perl,这只是一个猜测:如果还有POST数据,可能它不尊重GET数据……你在哪里,Michael。Perl不喜欢混合使用GET和POST,因为它使用相同的类/模块来获取变量。因此,如果您获取“saveuser”之类的变量,那么您将获取GET和POST表示。如果这有道理的话。是的,那可能有用。但是,如果不是服务器端的问题,那么就不可能发布到像users.cgi?some=xx这样的url吗?但是,我可以通过浏览器连接到该站点,查看成功消息。我根本不喜欢perl,这只是一个猜测:如果还有POST数据,可能它不尊重GET数据……你在哪里,Michael。Perl不喜欢混合使用GET和POST,因为它使用相同的类/模块来获取变量。因此,如果您获取“saveuser”之类的变量,那么您将获取GET和POST表示。如果这使得sence.GET使用$ENV{QUERY_STRING},那么POST将读取STDIN。dojo是否做了一些奇怪的事情,比如为帖子设置查询字符串?您可以通过打印出%ENV并检查查询字符串和内容长度来调试它。对于GET,应设置查询字符串,且内容长度=0。对于POST,查询字符串应为“”,内容长度应大于0这我不知道。我要试试。GET使用$ENV{QUERY\u STRING},POST读取STDIN。dojo是否做了一些奇怪的事情,比如为帖子设置查询字符串?您可以通过打印出%ENV并检查查询字符串和内容长度来调试它。对于GET,应设置查询字符串,且内容长度=0。对于POST,查询字符串应为“”,内容长度应大于0这我不知道。我要试试看。