繁体   English   中英

在跨站点Perl CGI函数的ajax调用中获取状态代码0

[英]Getting status code 0 in ajax call to cross site Perl CGI function

Perl CGI脚本被调用; 我可以看到调试日志正在获取参数并正在执行。

问题是返回结果,状态码始终为0,responseText为空。

尝试了各种标头选项等,但没有运气,任何帮助将不胜感激。

Perl CGI处理程序

#!/usr/bin/perl
use strict;
use warnings;

use CGI;
use JSON;
use Data::Dumper qw( Dumper );

my $q = new CGI;
my %data;

open my $FH, '>', 'outfile';

if ( my $number = $q->param('number') ){
    if ( $number =~ /^\d+$/ ) {
            $data{result} = $number % 2 ? 'odd' : 'even';
    } else {
            $data{result} = 'Not a number';
    }

    my $jret = to_json(\%data);
    print $FH Dumper($jret);
    close $FH;

    print $q->header('application/json');
    print to_json(\%data);
}

HTML代码

<!DOCTYPE html>
<html>
<head>
<title>[% title %]</title>
<meta charset='utf-8'>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js">      </script>
    </script>
</head>

<body>
    <div id='result'></div>Enter number:
    <form>
    <input type='text' id='number'> 
    <button onclick='test_number();'>Test</button>

    <script>
        function test_number()
        {
            $.ajax({
                    type: 'POST',
                    dataType: 'json',
                    url: '/cgi-bin/simple.cgi',
                    data: {
                            'number': $('#number').val()
                    },
                    success: function(data, textStatus ){
                       alert('request successful');
                    },
                    error: function(jqXHR, exception) {
                        msg =  'Request Status: ' + jqXHR.status + ' Status Text: ' + jqXHR.statusText + ' ' + jqXHR.responseText;
                        alert(msg);
                    }
            });
            return false;
        }
    </script>
    </form>
</body>
</html>

单击表单中的提交按钮时,将运行JavaScript函数。

这个:

  1. 发送Ajax请求
  2. 卸载当前页面
  3. 提交表格
  4. 载入新页面

快速破解

为您的按钮元素使用type="button" ,因此它不是提交按钮

正确的解决方案

  1. 设置<form action="/cgi-bin/simple.cgi"以便表单提交正确的位置
  2. name="number"添加到输入中,以便将其包含在常规表单数据中
  3. 添加一种手段来区分表单提交和Ajax请求(例如隐藏输入)
  4. 更新脚本,以便如果它获得表单提交,它将呈现适当的HTML文档而不是JSON
  5. 删除onclick属性,并使用JavaScript绑定适当的事件处理程序(如果JS成功运行,这将阻止表单提交的默认行为)

这样:

function test_number(event) {
    event.preventDefault();
    $.ajax({
        type: 'POST',
        dataType: 'json',
        url: '/cgi-bin/simple.cgi',
        data: {
            'number': $('#number').val()
        },
        success: function(data, textStatus) {
            alert('request successful');
        },
        error: function(jqXHR, exception) {
            msg = 'Request Status: ' + jqXHR.status + ' Status Text: ' + jqXHR.statusText + ' ' + jqXHR.responseText;
            alert(msg);
        }
    });
}

document.querySelector("form").addEventListener("submit", test_number);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM