【问题标题】:Perl — HTTP::Request::Common — POST file AND arrayPerl — HTTP::Request::Common — POST 文件和数组
【发布时间】:2018-06-05 16:57:05
【问题描述】:

我正在尝试 POST file 到 webapp 端点。问题是在同一个请求中,我需要包含数组作为参数之一的值。

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 第 67 行调用

似乎 Perl 认为带有语言的数组 ref 是一个文件。

我做错了什么?


根据马特的回答扩展解决方案:正如我最初忘记提及的那样,语言列表来自用户输入,所以我最终做了类似的事情:

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,
]);

【问题讨论】:

    标签: perl post


    【解决方案1】:

    来自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',
        ],
    );
    

    【讨论】:

    • 谢谢马特,这行得通。出于某种原因,我无法理解“可以通过重复字段名称或将值作为数组引用传递来指定多值表单字段。”足以解决问题。
    • @Matt 雅各布。好的,我如何在请求中包含授权内容。基本授权通常在标头中传递。我想做这件事,但我很困惑如何把它放在 POST 请求方法中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多