【问题标题】:Ajax in Dojo with PerlDojo 中的 Ajax 与 Perl
【发布时间】:2012-04-22 21:31:28
【问题描述】:

谁能告诉我我做错了什么? 我正在创建一个简单的系统来让人们进出用户组,为此我正在使用 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/文本附加到 <div> 但它不起作用:

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,所以我对它有点陌生。)

【问题讨论】:

  • GET 使用 $ENV{QUERY_STRING},POST 读取 STDIN。 dojo 会做一些奇怪的事情吗,比如为帖子设置查询字符串?您可以通过打印 %ENV 并检查 QUERY_STRING 和 CONTENT_LENGTH 来调试它。对于 GET,应设置 QUERY_STRING,并且 CONTENT_LENGTH=0。对于 POST,QUERY_STRING 应为 '',CONTENT_LENGTH 应 > 0
  • 这个我不知道。我要试试看。

标签: javascript ajax perl post dojo


【解决方案1】:

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'};

笑死我了!

【讨论】:

    【解决方案2】:

    找到了解决办法。

    问题是我的javascript。发布到 perl 脚本时,您使用 $cgi=new CGI;以及所有这些。这需要 GET 和 POST 变量并验证它们。在我的 javascript/dojo 代码中,我使用了带有 GET 变量的 url,然后也进行了 POST。这意味着 perl 无法找出(或正在混合)这两种变量类型。因此,当我更改我的 ajax 代码(如下所示)时,它起作用了,因为 $cgi->param('saveuser') 都获取“saveuser”的 GET 和 POST(不需要更改 perl):

    dojo.xhr.post({
      url: "/cgi-bin/users.cgi",
      content: {
        saveuser: user_id,
        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.");
      }
    });
    

    有点古怪的错误,但我很高兴,因为它现在很好用:D

    【讨论】:

      【解决方案3】:

      尝试将saveuser 参数添加到dojo.xhrPostcontent 对象,而不是在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.");
        }
       });
      

      【讨论】:

      • 是的,这可能有效。但是不可能发布到像 users.cgi?some=xx 这样的 url 吗?(我知道你可以在 jquery 中)这不是服务器端的问题吗?但是话又说回来,我可以通过浏览器连接到该站点并查看成功消息。
      • 我根本不喜欢 perl,这只是一个疯狂的猜测:如果还有 POST-data,它可能不尊重 GET-data ...
      • 你在哪里,迈克尔。 Perl 不喜欢混合使用 GET 和 POST,因为它使用相同的类/模块来获取变量。因此,如果您获取诸如“saveuser”之类的变量,您将获取 GET 和 POST 表示。如果这有意义的话。
      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2011-05-09
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多