【问题标题】:convert curl command line to Perl WWW::Curl or LWP [closed]将 curl 命令行转换为 Perl WWW::Curl 或 LWP [关闭]
【发布时间】:2016-06-06 19:54:37
【问题描述】:

我正在尝试复制以下命令行 curl:

curl -F file=@myfile.csv 'https://myserver/api/import/data_save.html'

也许有人在 www::curl 或 lwp 中有一个例子吗?我整天都在尝试,此时甚至不值得我发布我的尝试,这只会使事情变得混乱。谢谢!!!

【问题讨论】:

  • “我该如何做 X?”问题比“如何翻译 X?”更容易回答。因为准确的翻译通常几乎是不可能的,而且很少需要。

标签: perl curl lwp


【解决方案1】:

我想你是在问如何提交一个名为 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 中。

【讨论】:

  • 非常好的反馈和答案。我为我的笼统或含糊感到抱歉,我什至没有意识到我是那样的。现在我明白了,我学到了很多东西,这真的很有帮助!
【解决方案2】:

好吧,让我们解开 curl 命令的实际作用,因为-F 暗示了很多。

  1. 它将请求的 HTTP 方法设置为 POST。
  2. 它将请求的 Content-Type 设置为 multipart/form-data。
  3. 它组成了一个 MIME 多部分请求正文,其中包含指示“文件”输入是从名为“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 可能更容易;见ikegami的回答。

【讨论】:

  • 卷曲速度更快。 LWP 更便携。 curl 模块可能看起来有点难,但我不认为它实际上更难。
  • 当然,两者都不像curl 命令行版本那么简单。
  • 据我所知,您可能更喜欢 WWW::Curl 的唯一原因是您已经熟悉其他语言的 libcurl API。
  • 它比 LWP 快得多,并且支持并行请求。由于这些原因,我们在工作中使用了 Net::Curl。在模拟(我们需要的部分)LWP 的界面时,它甚至比 LWP 还要快!
猜你喜欢
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2016-08-04
  • 2020-07-09
相关资源
最近更新 更多