如何从命令行运行CGI :: Application运行模式?

Tod*_*ter 5 perl cgi-application

我在我的CGI :: Application web-app中有一个运行模式,我希望能够从命令行触发,这样我就可以自动执行它.从web-app的角度来看,它会进行一些处理,然后通过电子邮件发送结果.

从Web界面调用时,它会传递一组参数(电子邮件地址,要运行的查询,日期等),因此需要传入这些参数.

如何构建对CGI :: Application应用程序的调用,就像我从Web上运行它一样?

Geo*_*ips 6

最初的CGI规范可以很容易地从命令行运行,完全不是作为特定的HTTP接口,而是可以处理FTP和gopher以及新的顶级URL方案.当我指示它时,我知道我想要什么.

我引用的规范应该为您提供所需的一切,但在大多数情况下,它只是一组环境变量.如果您看到以下请求:

http://some.server.com/some/path?a=b&c=d
Run Code Online (Sandbox Code Playgroud)

环境变量看起来像这样:

SERVER_PROTOCOL=http
REQUEST_METHOD=GET
HTTP_HOST=some.server.com
SERVER_PORT=80
PATH_INFO=/some/path
QUERY_INFO=a=b&c=d
Run Code Online (Sandbox Code Playgroud)

要扭转Perl中极性的极性,可以这样:

$ENV{'SERVER_PROTOCOL'} = 'http';
$ENV{'REQUEST_METHOD'} = 'GET';
$ENV{'SERVER_PORT'} = 80;
$ENV{'PATH_INFO'} = '/some/path';
$ENV{'QUERY_INFO'} = 'a=b&c=d';
system("perl your-CGI-script.pl");
Run Code Online (Sandbox Code Playgroud)

在处理POST查询时,事情变得更加复杂,并且可能需要更多可能的环境变量.最糟糕的情况是,您可以使用快速CGI脚本枚举它们,例如:

print "Content-Type: text/plain\r\n\r\n";
foreach (keys(%ENV))
{
    print "$_=$ENV{$_}\r\n";
}
Run Code Online (Sandbox Code Playgroud)

现在将它放在Web服务器上代替您的CGI脚本,您将看到所有传入的环境(以及原始环境,因此您需要进行一些判断调用).


Tod*_*ter 3

进一步深入研究CGI::AppCGI​​ 文档后,它似乎比我想象的更简单。最简单的情况(没有实际参数处理或处理 webapp run 调用的输出)是:

#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use WebApp;

my $cgi = new CGI( \%{@ARGV} );

my $webapp = WebApp->new( QUERY => $cgi );
$webapp->run();
Run Code Online (Sandbox Code Playgroud)

它只需要一系列空格分隔的名称值对来创建 CGI。您需要传入运行模式和所有参数。