2010-04-18 106 views
3

不幸的是,我不熟悉Perl,所以在這裏問。其實我使用Perl的FCGI。如何在Perl和FastCGI中處理和發送POST請求?

我需要1.接受POST請求 - > 2.通過POST發送到另一個url - > 3.獲得結果 - > 4.返回結果到第一個POST請求(4個步驟)。

要接受一個POST請求(步驟1)我用下面的代碼(發現它在互聯網的某個地方):

$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; 
} 

$name(這是一個字符串)的內容是第一步的結果。現在我需要通過POST請求發送$name到some_url(步驟2),它返回另一個結果(步驟3),我必須將其作爲結果返回到第一個POST請求(步驟4)。

任何幫助,這將不勝感激。

謝謝。

回答

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; 
} 




} 
2

高度建議您不要嘗試自己解決這個問題,而是使用現有的庫,讓你的生活變得更加容易。 Perl的最好的部分是現有庫的大量集合。請參閱http://search.cpan.org/

良好的起始位置包括CGI.pm或Catalyst之類的Web框架。

你引用的代碼非常麻煩。巧合的是,只有一個post by a popular Perl blogger解剖這個確切的代碼。