Конвертировать командную строку curl в Perl WWW::Curl или LWP
Я пытаюсь повторить следующую командную строку curl:
curl -F file=@myfile.csv 'https://myserver/api/import/data_save.html'
У кого-нибудь есть пример в www::curl или lwp? Я пытался весь день, и даже не стоит публиковать свои попытки на этом этапе, это только запутало бы вещи. Спасибо!!!
2 ответа
Решение
Я думаю, что вы спрашиваете, как отправить форму с полем файла с именем file
заполняется содержимым файла myfile.csv
,
use LWP::UserAgent qw( );
my $ua = LWP::UserAgent->new();
my $response = $ua->post('https://myserver/api/import/data_save.html',
Content_Type => 'form-data',
Content => [
file => [ 'myfile.csv' ],
],
);
die($response->status_line)
if !$response->is_success;
Аргументы $ua->post
документированы в HTTP:: Request:: Common.
Хорошо, давайте распакуем то, что фактически делает эта команда curl, потому что -F
много значит.
- Он устанавливает метод HTTP запроса на POST.
- Он устанавливает Content-Type запроса в multipart/form-data.
- Он формирует тело многочастного запроса MIME с метаданными формы, указывающими, что ввод "file" предоставляется из файла с именем "myfile.csv", а также из части, содержащей фактическое содержимое файла.
Вот как скопировать это используя WWW::Curl:
use WWW::Curl::Easy;
use WWW::Curl::Form;
my $curl = WWW::Curl::Easy->new;
my $form = WWW::Curl::Form->new;
$form->formaddfile('myfile.csv', 'file', "multipart/form-data");
$curl->setopt(CURLOPT_URL, 'https://myserver/api/import/data_save.html');
$curl->setopt(CURLOPT_HTTPPOST, $form);
my $response = $curl->perform;
Но LWP, вероятно, проще; см. ответ икегами.