Javascript Dojo中的Ajax与Perl

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(

谁能告诉我我做错了什么? 我正在创建一个简单的系统来让人们进出用户组,为此我使用Dojo和Perl。(如果我可以用我的方式,那就是PHP,但我不是老板。)

目前我只使用了三个文件,一个用于Perl,一个用于JavaScript,一个用于CSS样式

CGI脚本的开始路由到不同的函数,如下所示:

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这我不知道。我要试试看。