2013-05-14 74 views
1

我需要能夠發送文件流和字節數組作爲對HTTP POST的響應以測試產品。我使用CGI perl作爲後端,但我對Perl還不是很熟悉,而且我不是開發人員,我是Linux管理員。根據查詢字符串發送一個字符串非常容易,但我堅持這兩個要求。以下是根據查詢字符串返回正確或不正確頁面的腳本。我怎樣才能添加邏輯來返回文件流和字節數組呢?Perl創建字節數組和文件流

#!/usr/bin/perl 
use CGI ':standard'; 

print header(); 
print start_html(); 

my $query = new CGI; 
my $value = $ENV{'QUERY_STRING'}; 


my $number = '12345'; 

if ($value == $number) { 
print "<h1>Correct Value</h1>\n"; 
} else { 
print "<h1>Incorrect value, you said: $value</h1>\n"; 
} 
print end_html(); 
+0

是基於JavaScript的另一端? – snoofkin 2013-05-14 13:40:28

+0

不,現在他們實際上是直接點擊這個腳本,請注意客戶端不是瀏覽器,它是一個生成原始HTTP命令的設備。該腳本僅用於測試設備。最初它是html/perl CGI,但現在它們只是直接調用perl腳本並傳遞查詢字符串,如POST /test.cgi?12345 HTTP/1.1主機:myhost.com – GL2014 2013-05-14 13:43:23

回答

2

很高興看到在sysadmin字段中涉及Perl的新用戶。這正是我如何開始的。

首先,如果您要使用CGI.pm模塊,我建議您在整個腳本中使用它。你以前輸入過的地方<h1>你可以使用你的CGI對象來爲你做。最後,你會更清潔,更易於管理的代碼結束:

#!/usr/bin/perl 
use CGI ':standard'; 

print header(); 
print start_html(); 

my $value = $ENV{'QUERY_STRING'}; 
my $number = '12345'; 

if ($value == $number) { 
    h1("Correct Value"); 
} else { 
    h1("Incorrect value, you said: $value"); 
} 

print end_html(); 

需要注意的是,如果這是一個數字的比較操作符(==)纔有效。爲了使它與字符串一起工作,請使用eq運算符。

有關文件流和字節數組的意思的一點說明......按文件流,你的意思是你想打印出一個文件到客戶端?如果是這樣,因爲這將是一樣容易:

open(F,"/location/of/file"); 
while (<F>) { 
    print $_; 
} 
close(F); 

這將打開鏈接到指定的文件的文件句柄,只讀,打印一行內容線,然後將其關閉。請記住,這將按原樣打印文件,並且在HTML頁面中看起來不會很漂亮。如果您將Content-type標題更改爲「text/plain」,這可能會更符合您所尋找的內容。要做到這一點,修改的打印HTTP標頭的號召:

print header(-type => 'text/plain'); 

如果你走這條路,你會想刪除您start_html()end_html()電話也是如此。

至於字節數組,我想我需要更多關於正在打印的內容以及如何將其格式化的信息。

+0

好帖子。我只是想補充一點,使用CGI.pm的html輸出功能已經在很大程度上被諸如HTML :: Template之類的模塊的簡單性所取代。 CGI.pm主要用於請求處理,但不是用於輸出。 HTML :: Template有助於將輸出(視圖)與代碼分離(即向MVC方向邁出一步) – DavidO 2013-05-14 16:25:51

+0

我只是想將任意字節數組和文件流發送回客戶端用於測試目的。它不會不管它們包含什麼,但爲簡單起見應該相對較小。 – GL2014 2013-05-14 17:26:36

+0

我向開發人員發送了一封電子郵件以進行澄清,結果證明我給他們的代碼就足夠了。如果任何人能夠破譯他們可能想要的並向我展示代碼,那很酷。我將盡力在Perl上做得更好,所以下次我將爲這項任務做好準備。 – GL2014 2013-05-14 17:37:26