我正在做一些开发工作,使用嵌入式Linux作为操作系统,使用Boa作为web服务器。我有一个网页,可以发布到CGI脚本,处理表单数据并回复。我的开发环境是Ubuntu,一切都很好,但当我将代码移植到嵌入式Linux时,CGI模块没有实例化(或者至少看起来没有实例化)。这是我代码的精简部分。print语句抱怨一个未初始化的变量。
use CGI;
use strict;
use warnings;
my $cgiObj = CGI->new();
print $cgiObj->param('wlanPort');
同样,这在我的开发环境中运行良好,但在嵌入式环境中失败了。CGI.pm已安装,并且在CGI->new()命令。我还验证了表单数据的发送,但显然不能保证Perl脚本接收到它。
我有一种感觉,这是一个Boa配置问题,这就是我下一步要研究的。我对Perl还很陌生,所以我不知道还能做什么。有什么想法吗?
编辑:绝对不是Boa配置问题。仍在调查中。
更新:我已经将代码简化为以下内容:
#!/usr/bin/perl
use CGI qw(:standard);
$data = param('wlanPort') || '<i>(No Input)</i>';
print header;
print <<END;
<title>Echoing user input</title>
<p>wlanPort: $data</p>
END
不出所料,它打印(无输入)
我还应该指出,形式是enctype=";多部分/形式数据";因为我必须具有文件上传能力;POST";方法
我使用HttpFox插件来检查post数据,并检查了wlanPort值:
-----------------------------132407047814270795471206851178内容处置:表单数据;name=";wlanPort";
eth1
所以它几乎肯定是被发送的。。。
更新2:我在Ubuntu笔记本电脑上安装了嵌入式系统中使用的Perl和Boa的相同版本。在笔记本电脑上工作,而不是在设备上,这是相同的结果。我已经告诉我的雇主,我已经用尽了所有的可能性,除了Boa和(Micro)Perl在设备上构建的方式与在Ubuntu中构建的方式不同。
CGI是一个非常简单的协议,虽然我不能直接回答您的问题,但我可以建议一些技术来帮助隔离问题。
如果您的表单是通过POST提交的,那么该表单的内容将在脚本获取的HTTP请求的内容中显示为URL编码的字符串。在根本不使用CGI模块的情况下,您应该能够读取来自STDIN:的请求
my $request = "";
while (<STDIN>) {
$request .= $_;
}
if (open my $out, ">>/tmp/myapp.log") {
print $out $request;
close $out;
}
然后,您可以检查/tmp/myapp.log,看看您是否从您认为的请求中获得了所有信息。
为了完整起见,如果您的表单通过GET提交,那么参数将在环境变量QUERY_STRING中,您可以在Perl中使用$ENV{'QUERY_STRING'}查看该变量。
CGI的对象接口和功能接口解析请求的方式应该没有区别。我不熟悉boa,但我无法想象它会破坏基本的CGI协议。
一个常见的问题是,您将表单参数命名为一件事,并在CGI脚本中寻找不同的参数名称。这总是一个笑话。
祝你好运,希望这对一些人有所帮助。
我知道这是一篇非常古老的帖子,OP可能对任何与此相关的新信息都不感兴趣,但关于如何调试CGI脚本的一般问题仍然有一些相关性。我在开发与生产环境中也遇到过类似的问题。为了帮助那些偶然发现这条线索的人,我发布了我处理这种情况的经验。我的简单答案是,使用Log::Log4perl和Data::Dumper模块来揭开这一神秘面纱(假设有一种方法可以访问您的产品环境中的日志)。这样,在开销可以忽略不计的情况下,您可以在问题出现时启用跟踪(即使代码以前工作过,但由于时间的推移,它开始失败)。以适当的日志级别(跟踪、调试、信息、警告、错误、致命)记录每个相关的信息位,并配置适合操作的级别。如果没有这些机制,就很难深入了解生产操作。希望这能有所帮助。
use CGI;
use Log::Log4perl qw(easy);
use Data::Dumper;
use strict;
use warnings;
my $cgiObj = CGI->new();
my $log = Log::Log4perl::get_logger();
$log->trace("CGI Data: " . Dumper($cgiObj));
print $cgiObj->param('wlanPort');