【问题标题】:POST a very large xml to url using LWP Perl使用 LWP Perl 将一个非常大的 xml 发布到 url
【发布时间】:2018-04-06 07:06:17
【问题描述】:

我有一个非常大的 xml,我试图将其传递给特定端口上的 Spark。以下是我使用 POST 请求提交 xml 的代码。

my $_fileName = "/home/temp/UTC+08_20180406_1414000_xyz";
open (XMLFILE, $_fileName);
    while (<XMLFILE>) {
        $_xml.=$_;
    }
    close (XMLFILE);

my $_url="http://localhost:8100/request/UTC+08_20180406_1414000_xyz";
my $curl = LWP::UserAgent->new();
my $response = $curl->post($_url, 'Content' => $_xml, 'Content-type'=>'text/xml' );
if ($response->is_success) 
{
     print("new job created (requestId: $_requestId)\n");
     return &checkXMLStatus($response->decoded_content);
}
else 
{
     print("Job can't be processed: ".$response->status_line);
     return ("StatusRejected", $response->status_line, 0);
}

当 xml 很小时,就没有问题。但是当我提交一个非常大的 xml 文件说超过 100000 行时,请求超时并出现以下错误:

“500 读取超时”正好在 180 秒之后。 我检查了 LWP 的 CPAN 页面,默认超时时间为 180。

是否可以增加超时时间。使用 LWP 的 POST 请求不能发送非常大的 xml 文件有什么限制吗??

【问题讨论】:

  • 这样一个 100,000 行的 XML 文件的字节数是多少?我无法想象它会超过几 MB。
  • 你为什么要这样逐行准备xml?是不是更简单:my $xml = do { local $/; &lt;XMLFILE&gt;}; 一口气读完?
  • @Borodin:10 - 50 MB
  • 你为什么将LWP::UserAgent对象命名为$curl
  • 是的,我认为 $ua 而不是 $curl 会是更好的选择。

标签: xml perl post lwp


【解决方案1】:

根据LWP::UserAgent 的手册页,该参数称为timeout,可以通过options 散列设置,因此要设置超时,例如设置为300,创建用户代理的行应为: my $curl = LWP::UserAgent->new( { timeout => 300 } );

【讨论】:

    【解决方案2】:

    那些僧侣在http://www.perlmonks.org/bare/?node_id=896468上写了关于超时的文章

    我还会检查接收方是否可以处理 gzip 压缩的数据,如果可以,请使用 gzip 仅发送原始字节数的 5-10%。节省的时间可能差不多。

    open my $FH, "gzip < $_filename |" or die;
    binmode($FH);
    $_xml=do{local$/;<$FH>};
    ...
    my $response = $curl->post( $_url,
                                'Content' => $_xml,
                                'Content-Encoding'=>'gzip',
                                'Content-Type'=>'text/xml' );
    

    如果接收者可以接受multipart/form-data,我也会去看看:

    system(qq(
      gzip < $_filename | curl -F"file=@-;type=text/xml;filename=n.xml" -H "Content-Encoding: gzip" $_url
    ));
    

    ...将file=filename= 更改为接收者需要的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      相关资源
      最近更新 更多