perl 使用回调函数获取URL块内容

gpfsuwkq  于 2023-03-03  发布在  Perl
关注(0)|答案(2)|浏览(138)

如何检查为响应内容的每个块调用的回调函数是否是用最后一个数据块调用的,或者是否有更多的数据即将到来?

my $ua = LWP::UserAgent->new( ... );

my $request = $ua->get($url, ':content_cb' => sub
{
  my ($d, $r, $p) = @_;
  
  # need to know if this is the last chunk of data

});
w1e3prcc

w1e3prcc1#

从我在源代码中看到的情况来看,回调函数在出现eof或error时不会被回调。
但是没有必要这样做,代码可以放在get返回之后。
如果希望使用一个公共sub来处理数据、eof和错误,可以在回调中和get返回后调用它。

my $response = $ua->get( $url,
   ':content_cb' => \&cb,
);

cb( "", $response, undef )
f0brbegy

f0brbegy2#

可以通过response_done处理程序找出响应完成的时间

*响应完成=〉sub { my($响应,$ua,$处理程序)= @_; *

在完全接收到响应之后,但在尝试任何重定向处理之前,调用处理程序。处理程序可用于提取信息或修改响应。
这将作为添加到用户代理对象

my $ua = LWP::UserAgent->new;
$ua->add_handler(response_done => sub { ... });

到目前为止,如果使用:content_cb回调,$response中没有数据,因为它删除了数据。但是我们可以了解完成情况,可以设置标志(虽然在:content_cb回调中看不到)或直接运行/触发其他处理,等等。
还有一个response_data处理程序,在每个块上调用,可用于在数据到来时收集数据(而不是:content_cb

$mech->add_handler ( 'response_data' => sub {
    my ($response, $ua, $handler, $data) = @_;  
    ...
    #$response->content(undef);  # remove data from response as it is received?
    return 1;  # so we keep being called
});

我还发现response_header处理程序有时很有用(例如检测流中数据的开始)。

相关问题