更新 在这一点上,我认为这个框架没有与base 等效的LWP
我在Mojo::Headers 类中找到content_location 方法。 Mojo::Message::Response 继承自基础 Mojo::Message 和 Mojo::Headers 似乎也被拾取
添加到概要中的示例
my $res = Mojo::Message::Response->new;
$res->parse("HTTP/1.0 200 OK\x0d\x0a");
$res->parse("Content-Length: 12\x0d\x0a");
$res->parse("Content-Type: text/plain\x0d\x0a\x0d\x0a");
$res->parse('Hello World!');
say $res->code;
say $res->headers->content_type;
say $res->body;
say $res->headers->content_location // 'location not defined'; # /
$res->headers->content_location('set_some_location');
say $res->headers->content_location // 'location not defined';
似乎有效。这合适吗?我不能轻易找到一个真实的页面来尝试。
这不会扫描文档内容,但仅适用于标题。 LWP 在生成HTTP::Response 对象时从文档中设置标题,如问题和base 下所述。在我的测试中(v5.16)Mojo::UA 没有这样做。我找不到这方面的直接能力。
然后,获取基本 URL 的一种方法是通过 DOM,例如
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $base_url = $ua->get($url)
->res->dom
->at('head')->at('base')->attr('href');
方法dom 来自Mojo::Message,而base 和attr 来自Mojo::DOM。或者
$dom->at('head > base[href]');
它返回一个 hashref { href => URL },而第一个示例返回 URL。
at 在失败时返回 undef,因此首先需要检查。
这是对内容的额外手动搜索,但至少它集中在<head>。
更新
我查看了上述组件及其父类的源代码。这也带来了Mojo::Content,其子类Single由Mojo::Message::content返回,Mojo::UserAgent::Transactor及其redirect方法使用Mojo::URL。但是,它们有不同的目的。总而言之,我没有发现直接挖掘基本 URL 的帮助。
在这一点上,我必须得出结论,LWP 中的base 之类的直接功能在此处不可用。