Perl - HTTP :: Request :: Common - POST-файл и массив - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь отправить файл в конечную точку веб-приложения.Проблема в том, что в тот же запрос мне нужно включить массив в качестве значения одного из параметров.

my $ua = LWP::UserAgent->new();
my $response = $ua->post(
    $baseurl_local . 'create',
    Content_Type => 'form-data',
    Content      => [
    file =>  [$file],
    targetLang => 'french',
]);

работает просто отлично.

Однако, когда я пытаюсь

my $ua = LWP::UserAgent->new();
my $response = $ua->post(
    $baseurl_local . 'create',
    Content_Type => 'form-data',
    Content      => [
    file =>  [$file],
    targetLang => ['french','spanish],
]);

Я получаю

Не могу открыть файл на французском языке: нет такого файла или каталога на C: /Strawberry/perl/site/lib/HTTP/Request/Common.pm строка 154.HTTP :: Request :: Common :: form_data (ARRAY (0x6800698), undef, HTTP :: Request = HASH (0x6803a70)) вызывается по адресу C: /Strawberry/perl/site/lib/HTTP/Request/Common.pm line 67

Казалось бы, Perl думает, что ссылка на массив с языками - это файл.

что я делаю не так?

Чтобы расширить разрешение на основе ответа Мэтта: как я забыл упомянуть первоначально, список языков поступает от пользовательского ввода, поэтому я в итоге сделал что-то вроде:

my @languages = (targetLang => 'french', targetLang => 'spanish');
my $ua = LWP::UserAgent->new();
my $response = $ua->post(
    $baseurl_local . 'create',
    Content_Type => 'form-data',
    Content      => [
        file =>  [$file],
        @languages,
]);

1 Ответ

0 голосов
/ 05 июня 2018

Из HTTP :: Request :: Common docs :

Многозначные поля формы можно указать, либо повторив имя поля, либо передав значение в качестве ссылки на массив.

Метод POST также поддерживает содержимое multipart/form-data, используемое для загрузки файлов на основе форм , как указано в RFC 1867. Этот формат содержимого запускается путем указания типа содержимого 'form-data'как один из заголовков запроса.Если одно из значений в $form_ref является ссылкой на массив, то оно рассматривается как спецификация части файла ...

Итак, в то время как вы обычно можете указать многозначное поле со ссылкой на массивссылки на массивы имеют особое значение для содержимого multipart/form-data, и вам, вероятно, придется обойти его, повторив имя поля:

my $response = $ua->post(
    $baseurl_local . 'create',
    Content_Type => 'form-data',
    Content      => [
        file       => [$file],
        targetLang => 'french',
        targetLang => 'spanish',
    ],
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...