[英]Perl: Using HTTP::Request::Common to post with authentication
[英]Can I send a binary variable using HTTP::Request::Common::post?
我想在發布請求之前發送使用gzip壓縮的數據,而不將其保存到文件中。 在HTTP :: Request :: Common的文檔中,我看不到任何地方可以解釋如何發布以前制作的壓縮數據。
I want to emulate this call,
curl -F "file0=@+Wowhead_Looter.lua.gz" -F "file1=@creaturecache.wdb.gz" -F "file2=@gameobjectcache.wdb.gz" \
-F "file3=@itemcache.wdb.gz" -F "file4=@pagetextcache.wdb.gz" \
-F "file5=@questcache.wdb.gz" "URL"
我不知道這是一個電話還是多個電話。
有人可以幫我嗎?
我有一個讀取所有文件並返回帶有所有壓縮文件的對象的函數:
sub compress_wdb
{
my ($wdb_dir,
$wdb_dir_dh,
@wdb_dir_files,
$file,
$vol,
$dir,
$ffile,
%gzipped_wdb);
$wdb_dir = shift;
opendir $wdb_dir_dh, $wdb_dir,;
@wdb_dir_files = grep(/^.+\..+$/, readdir $wdb_dir_dh);
closedir $wdb_dir_dh;
for $file (@wdb_dir_files)
{
gzip $wdb_dir."/".$file => \$gzipped_wdb{$file}
or die "gzip failed: $GzipError\n";
}
return %gzipped_wdb;
}
該函數后來被這樣調用:
my %wdb = compress_wdb($wdb_dir);
然后是post函數,這里有個問題:
sub post
{
my ($auth_user, $auth_password, $data, $ua, $req);
$ua = LWP::UserAgent->new;
$req = $ua->post("URL",
Content_Type => 'form-data',
Content => [
# $addon => [ $obj ],
],
);
}
然后這樣稱呼它:
post(\%wdb);
旁注:預定義變量,如
my ($wdb_dir,
$wdb_dir_dh,
@wdb_dir_files,
$file,
$vol,
$dir,
$ffile,
%gzipped_wdb);
被認為是不好的風格。 應該在盡可能小的范圍內聲明變量,這通常意味着應在首次使用變量時聲明它。
(此外,3個空格的縮進是很奇怪的。)
根據curl
手冊 , -F
指定用於Web表單提交的字段(特別是multipart/form-data
格式)。 前綴為@
的值可使curl上傳文件(附加到POST請求)。
LWP::UserAgent
文檔說post
方法在下面調用HTTP::Request::Common::POST
。
POST
的HTTP::Request::Common
文檔說,您可以通過將內容類型指定為'form-data'
來創建multipart/form-data
請求。 它還說您可以通過將數組引用指定為表單字段值來進行文件上傳,並且可以通過設置Content
偽頭(繞過從磁盤讀取實際文件)來創建“虛擬文件”。
放在一起:
sub post
{
my ($files) = @_;
my $ua = LWP::UserAgent->new;
my $response = $ua->post(
"YOUR URL HERE",
Content_Type => 'form-data',
Content => [
do {
my $i = 0;
map +(
'file' . $i++ => [ undef, $_, Content => $files->{$_} ]
),
sort keys %$files
}
],
);
...
}
我們遍歷%$files
的鍵,我認為這些鍵是壓縮文件的簡稱。 (我們也按字母順序進行操作以使其具有確定性,這通常對調試很有用。)
我們還維護一個計數器( $i
),用於生成表單字段名稱。
對於每個文件名(通過map
存儲在$_
),我們生成一個鍵值對。 關鍵是表單字段名稱(由field
和當前計數器值組成),該值是數組引用(這是我們的文件上傳規范)。
數組引用包含一個undef
文件(因為我們不想從磁盤讀取實際文件),一個上載文件名$_
(這是我們希望Web服務器將文件名視為的文件名;也許您想傳遞"$_.gz"
?),最重要的部分是存儲在$files->{$_}
下的實際內容。
由於do
塊,這一切都在post
就發生了,這確實很厚臉皮。 您同樣可以預先創建數據結構:
my @fields;
for my $name (sort keys %$files) {
push @fields, 'file' . @fields => [ undef, $name, Content => $files->{$name} ];
# we don't need a counter here because we can just ask @fields how big it is
}
然后在post
調用中傳遞Content => \\@fields
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.