Конвертировать командную строку 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 много значит.

  1. Он устанавливает метод HTTP запроса на POST.
  2. Он устанавливает Content-Type запроса в multipart/form-data.
  3. Он формирует тело многочастного запроса 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, вероятно, проще; см. ответ икегами.

Другие вопросы по тегам