gpt4 book ai didi

perl - 使用 Perl 的 LWP 时是否可以根据 `Content-Type` 中止 HTTP 请求?

转载 作者:可可西里 更新时间:2023-11-01 15:26:56 27 4
gpt4 key购买 nike

我希望我的脚本只下载文本/html 内容,而不下载二进制文件或图像,因为下载这些内容可能会花费更多时间。我知道 max_size参数,但我想添加对 Content-Type header 的检查。这可行吗?

最佳答案

正如其他人所指出的,您可以在 GET 请求之前执行 HEAD 请求。你应该这样做是对服务器礼貌的一种方式,因为实际上你很容易中止连接,但 Web 服务器中止发送一堆数据并在其端做一堆工作并不一定容易.

有一些不同的方法可以做到这一点,具体取决于您想要变得多么成熟。

  1. 您可以在您的请求中发送一个Accept header ,其中仅列出text/html。如果您说您不接受文件的内容,那么一个实现良好的 HTTP 服务器将返回 406 Not Acceptable 状态。当然,他们可能还是会寄给你。您也可以将此作为您的 HEAD 请求。

  2. 使用最新版本的 LWP::UserAgent 时,您可以使用处理程序子例程中止 header 之后和内容主体之前的其余请求。

    use LWP::UserAgent;
    use Try::Tiny;

    my $ua = LWP::UserAgent->new;
    $ua->add_handler( response_header => sub {
    my($response, $ua, $h) = @_;

    die "Not HTML" unless $response->content_type eq 'text/html';
    });

    my $url = "http://example.com/foo";

    my $html;
    my $head_response = $ua->head($url, Accept => "text/html");
    if ($head_response->is_success) {
    my $get_response = $ua->get($url, Accept => "text/html");
    if ($get_response->is_success) {
    $html = $get_response->content;
    }
    }

参见 Handlers有关处理程序详细信息的 LWP::UserAgent 文档部分。

我没有捕捉到抛出的异常,也没有确保仔细处理这里的 406 响应。我将其作为练习留给读者。

关于perl - 使用 Perl 的 LWP 时是否可以根据 `Content-Type` 中止 HTTP 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11724041/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com