5

我想获取https://translate.google.cnCro::HTTP::Client的内容,但是HTTP::UserAgent卡住了,WWW获取内容,不知道为什么。如果我将其更改$urlhttps://perl6.org,所有三个模块都可以正常工作:

my $url = "https://translate.google.cn";
use Cro::HTTP::Client;
my $resp = await Cro::HTTP::Client.new(
    headers => [
       User-agent => 'Cro'
   ]
).get($url);
say await $resp.body-text();



use HTTP::UserAgent;
my $ua = HTTP::UserAgent.new;
$ua.timeout = 30;
my $response = $ua.get($url);

if $response.is-success {
    say $response.content;
} else {
    die $response.status-line;
}
)

use WWW;
say get($url)

我错过了什么吗?谢谢你给我的建议。

4

2 回答 2

6

对我来说HTTP::UserAgent工作Cro::HTTP::Client并被卡住。如果你想进一步调试,两个模块都有一个调试选项:

perl6 -MHTTP::UserAgent -e 'my $ua = HTTP::UserAgent.new(:debug); say $ua.get("https://translate.google.cn").content'

CRO_TRACE=1 perl6 -MCro::HTTP::Client -e 'my $ua = Cro::HTTP::Client.new(); say $ua.get("https://translate.google.cn").result.body-text.result'

WWW也为我工作。令人惊讶的是它对您有用,因为它由HTTP::UserAgent(对您不起作用)支持。这是get向您展示其使用方式的方法HTTP::UserAgent

sub get ($url, *%headers) is export(:DEFAULT, :extras) {
    CATCH { .fail }
    %headers<User-Agent> //= 'Rakudo WWW';
    with HTTP::UserAgent.new.get: $url, |%headers {
        .is-success or fail .&err;
        .decoded-content
    }
}
于 2018-12-16T21:08:37.310 回答
1

这可能归结为有问题的 https 站点上的 http2。实际上,您所描述的几乎就是我在https://github.com/croservices/cro-http/issues/45中提出的内容。

在修复之前的解决方法是尝试使用 http/1.1 发出请求

Cro::HTTP::Client.get('https://translate.google.cn', :http<1.1>);

于 2018-12-20T03:42:27.773 回答