2013-05-30 29 views
-2

POSTDATA不是正確的答案。我已閱讀文檔,但仍未看到如何獲取數據。如何從CGI中的POST正文中獲取URL編碼的數據Perl

我想收到這個請求:

POST /cgi-bin/myscript.cgi HTTP/1.1 
Host: myhost.com 
Content-Length: 3 
Content-Type: application/x-www-form-urlencoded 

255 

,並在服務器響應 您發送字符串「255」

請幫助,我是一個Perl的初學者,已經得到了一堆看似錯誤和無用的答案,看似簡單的要求。

+0

你檢查過'CGI'文檔嗎? – muhmuhten

+1

這是一個格式不正確的請求。數據不是'application/x-www-form-urlencoded'格式。 – ikegami

+0

它如何變形?字母數字字符顯示爲它們自己,非字母數字是它們的ASCII代碼的十六進制表示,對嗎?它是否畸形,因爲它不像param = value這樣的一對? – GL2014

回答

1

CGI會自動解析表單數據,所以你需要隱藏你得到的是表單數據(或者至少聲稱是)。

use CGI qw(); 
$ENV{CONTENT_TYPE} = 'application/octet-stream'; 
my $cgi = CGI->new(); 
my $post_data = $cgi->param('POSTDATA'); 

更好的解決方案:具有請求者使用正確的內容類型(例如application/octet-stream),或具有請求者實際發送形式的數據(例如data=255)。

-1

CGI(至少在最近的版本中)會錯誤地編碼x-www-form-urlencoded參數到一個名爲keywords的參數中。不如儘管發送適當的內容類型,那麼POSTDATA作品完全一樣的文檔說:

如果發佈的數據類型爲應用程序的不/ X WWW的形式,進行了urlencoded或 的multipart/form-data的,然後在發佈的數據將不會被處理......

use strictures; 
use CGI::Emulate::PSGI; 
use Plack::Test; 
use HTTP::Request::Common; 
use Test::More; 

my $post = POST "/non-e-importa", 
    "Content-Length" => 5, 
    "Content-Type" => "application/x-www-form-urlencoded", 
    Content => "ohai\n"; 

my $cgis = CGI::Emulate::PSGI->handler(sub { 
    use CGI "param", "header"; 
    my $incorrectly_encoded_body = param("keywords"); 
    print header("text/plain"), $incorrectly_encoded_body; 
}); 

test_psgi $cgis, sub { 
    my $cb = shift; 
    my $res = $cb->($post); 
    is $res->content, "ohai", "Soopersek437 param: keywords"; 
}; 

done_testing(); 

__END__ 
prove so-16846138 -v 
ok 1 - Soopersek437 param: keywords 
1..1 
ok 
All tests successful. 
Result: PASS 
+0

對於'「abc = def」'和'「abc \ ndef」'失敗,並且可能對'「61%61」'失敗。當然,@ikegami當然是 – ikegami

+0

@ikegami。由於輸入是錯誤的,所以處理OP的規格與預期一樣脆弱。如果沒有解碼例程或實際的內容類型比較,回退就會有很多與OP無關的失敗案例。 :P – Ashley

+0

你在說什麼,'255'是他唯一會收到的東西?那麼爲什麼不建議'my $ post_data ='255';'?您的代碼不會根據請求返回請求正文。 – ikegami

0

我獨特的解決方案是在客戶端的請願書「應用程序/八位字節流」的ContentType變化

模塊CGI CPAN說:

如果發佈數據的類型爲應用/ X WWW的窗體-urlencoded的multipart/form-data的的不是,則發佈數據將不被處理,而是按原樣 代替被返回在一個名爲POSTDATA的參數中。

因此,如果您不能更改客戶端上的其他ContentType請求,它將不會被處理。