【问题标题】:Perl CGI->Vars() not properly hashing cgi parametersPerl CGI->Vars() 没有正确散列 cgi 参数
【发布时间】:2012-10-11 15:26:57
【问题描述】:

我正在尝试使用 MySQL、Perl 和 JS 为我的网站制作一个简单的注册表单。当直接通过 cmdline 或 URL 给定参数并且 MySQL 正确注册用户时,Perl 脚本工作正常。问题在于 JS;当我通过 JSON 帖子发送数据时,Perl 脚本接收该帖子并尝试创建通过代码给出的参数的哈希:

%params = $cgh->Vars()

但是,这并不能正确拆分参数并将它们分配给各个键。相反,Perl 脚本会创建一个如下所示的哈希:

%参数数据

$VAR1 = 'POSTDATA';
$VAR2 = 'action=register&uname=d&pass=d&first=d&last=d&email=anemail@themailplace.com&phone=d';

我怀疑 JS 需要更改提交数据的方式,而不是 Perl 脚本接受数据的方式。无论如何,这里是 JS:

$(document).ready(function(){
    $("form#register-form").submit(function() { // register-form is submitted
        var username = $('#username').attr('value'); // get username
        var password = $('#password').attr('value'); // get password
        var repassword = $('#repassword').attr('value'); // get password
        var firstName = $('#firstName').attr('value'); // get password
        var lastName = $('#lastName').attr('value'); // get password
        var email = $('#email').attr('value'); // get password
        var phone = $('#phone').attr('value'); // get password

        if (username && password && repassword && firstName && lastName && email && phone) { // values are not empty
            $.ajax({
                type: "POST",
                url: "/cgi/login.pl", // URL of the Perl script
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                // send username and password as parameters to the Perl script
                data: "action=register" + "&uname=" + username + "&pass=" + password + "&first=" + firstName + "&last=" + lastName
                    + "&email=" + email + "&phone=" + phone,
                // script call was *not* successful
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    $('div#register-result').text("responseText: " + XMLHttpRequest.responseText
                        + ", textStatus: " + textStatus
                        + ", errorThrown: " + errorThrown);
                    $('div#register-result').addClass("error");
                }, // error 
                // script call was successful 
                // data contains the JSON values returned by the Perl script 
                success: function(data){
                    if (data.error) { // script returned error
                        $('div#register-result').text("data.error: " + data.error);
                        $('div#register-result').addClass("error");
                        } // if
                    else { // login was successful
                        $('form#register-form').hide();
//                        $('div#register-result').text("data.success: " + data.success + ", data.userid: " + data.userid);
//                        $('div#register-result').addClass("success");
                    } //else
                } // success
            }); // ajax
        } // if
        else {
            $('div#register-result').text("enter username and password");
            $('div#register-result').addClass("error");
        } // else
//    $('div#register-result').fadeIn();
    return false;
    });
});

除非与问题相关,否则请忽略我对表单提交的信息几乎没有检查的事实。如果您需要更多信息,请告诉我。提前谢谢你。

【问题讨论】:

  • 您没有将 json 发送到服务器,因此请删除 contentType 参见文档以获取解释 api.jquery.com/jQuery.ajax
  • @charlietfl 你什么意思?当然不是xmlhtmlscript dataType。还会指定什么其他内容类型?如果有帮助,我会从本教程中获得此代码:ibm.com/developerworks/webservices/library/ws-simplelogin/…
  • @charlietfl 哇,它确实有效,但我不明白为什么。如果您做出一个更详细地解释它为什么起作用的答案,我很乐意接受您的回答。谢谢你的帮助。
  • 阅读文档默认为'application/x-www-form-urlencoded; charset=UTF-8'

标签: jquery json perl post cgi


【解决方案1】:

您没有将 JSON 发送到服务器,因此使用 contentType: "application/json; charset=utf-8", 将覆盖默认 'application/x-www-form-urlencoded; charset=UTF-8'

使用默认值,服务器脚本会像处理任何其他表单提交一样处理键/值对

【讨论】:

  • 谢谢。我想我不完全理解 JSON 是什么。我会自己解决的事情。 :)
  • JSON 是 JavaScript 对象表示法,是 javascript 的子集,可用于序列化数据结构,例如{"foo":["bar",{"baz":42}]},通常用于在服务器和浏览器之间交换数据,而不是传统的表单数据发送方式
【解决方案2】:

根据 CGI 文档:

如果 POST 数据的类型不是 application/x-www-form-urlencoded 或 multipart/form-data,则不会处理 POST 数据,而是在名为 POSTDATA 的参数中按原样返回。

所以删除你的内容类型规范并允许 jQuery 使用其默认的application/x-www-form-urlencoded。 (multipart/form-data 用于包含文件上传的表单数据。)

【讨论】:

    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2015-08-20
    相关资源
    最近更新 更多