3

不幸的是,我不熟悉 Perl,所以在这里问。实际上,我正在将 FCGI 与 Perl 一起使用。

我需要 1. 接受 POST 请求 -> 2. 通过 POST 将其发送到另一个 url -> 3. 获取结果 -> 4. 将结果返回到第一个 POST 请求(4 个步骤)。

要接受 POST 请求(步骤 1),我使用以下代码(在 Internet 某处找到):

$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
    print ("some error");
}

@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%(..)/pack("C", hex($1))/eg;
    $FORM{$name} = $value;  
}

(it's a string)的内容$name是第一步的结果。现在我需要$name通过 POST 请求发送到 some_url(步骤 2),它会返回另一个结果(步骤 3),我必须将结果返回给第一个 POST 请求(步骤 4)。

对此的任何帮助将不胜感激。

谢谢你。

4

2 回答 2

3

要接受 POST,您可以使用您展示的手动代码,但最好的方法是使用CGI(它现在是一个核心模块,因此它应该在您的 Perl 发行版中)。要将 POST 传递到其他地方,您可以使用LWP::UserAgent

#/usr/bin/perl
use strict;
use warnings;
use CGI;
use LWP::UserAgent;

my $cgi = CGI->new;   # Will process post upon instantiation
my %params = $cgi->Vars;
my $ua = LWP::UserAgent->new;
my $postTo = 'http://www.somewhere.com/path/to/script';
my $response = $ua->post($postTo, %params);

if ($response->is_success) {
    print $response->decoded_content;  # or maybe $response->content in your case
} else {
 die $response->status_line;
}




}
于 2010-04-18T20:58:56.410 回答
2

强烈建议您不要尝试自己解决这个问题,而是使用现有的库来让您的生活更轻松。Perl 最好的部分是现有库的大量集合。见http://search.cpan.org/

好的起点包括 CGI.pm 或像 Catalyst 这样的 Web 框架。

您引用的代码非常错误。巧合的是,一位受欢迎的 Perl 博主刚刚发布了一篇文章,对这段代码进行了剖析。

于 2010-04-18T21:02:11.347 回答