我正在做一些使用嵌入式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 =“multipart / form-data”,因为我必须具有文件上传功能,而我正在使用“POST”方法。
我使用HttpFox插件检查发布数据并检查wlanPort值:
----------------------------- 132407047814270795471206851178 Content-Disposition:form-data; NAME = “wlanPort”
eth1的
所以几乎肯定会被发送......
更新2:我安装了在我的Ubuntu笔记本电脑上的嵌入式系统中使用的相同版本的Perl和Boa。适用于笔记本电脑,而不是设备,这是相同的结果。我已经告诉我的雇主,除了Boa和(Micro)Perl在设备上构建的方式与Ubuntu之外,我已经用尽所有可能性。
答案 0 :(得分:1)
CGI是一个非常简单的协议,虽然我不能直接回答你的问题,但我可以建议一些技巧来帮助隔离问题。
如果您的表单是通过POST提交的,那么该表单的内容将在您的脚本获取的HTTP请求的内容中显示为URLencoded字符串。根本不使用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中,您可以使用$ ENV {'QUERY_STRING'}在Perl中查看。
CGI的对象接口和功能接口解析请求的方式应该没有区别。我不熟悉boa,但我无法想象它打破了基本的CGI协议。
一个常见的问题是您将表单参数命名为一件事,并在CGI脚本中查找不同的参数名称。这总是很开心。
祝你好运,希望这有助于一些人。
答案 1 :(得分:1)
我知道这是一篇很老的文章,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');