Mojolicious响应的基本URL

Bor*_*din 4 html perl http mojolicious

HTTP::Response模块具有一种base方法,该方法返回将消息内容中的相对URL转换为绝对URL时要使用的基本URL。它从消息正文(作为<base>HTML内的元素<head>),HTTP标头Content-Location(或过时的Content-Base)或请求的URL(从最近的重定向,如果有)中检索它。

我看不到Mojo::Message::Response提供相同信息的任何方式,如果已经在某个地方,我也不想自己编写代码

谁能帮我吗?

zdi*_*dim 5

更新   在这一点上我觉得这个框架不具有同等的base距离LWP


我在Mojo :: Headers类中找到content_location方法。的魔::消息::响应从基部继承魔::消息和似乎被拾起以及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';
Run Code Online (Sandbox Code Playgroud)

似乎有效。这样合适吗 我无法轻易找到要尝试的真实页面。

这不会扫描文档内容,而是仅与标题一起使用。在LWP从原稿台头制造时HTTP ::响应对象,如在问题和下解释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');
Run Code Online (Sandbox Code Playgroud)

该方法dom来自Mojo::Messagewhile baseattr位于Mojo :: DOM中。要么

$dom->at('head > base[href]');
Run Code Online (Sandbox Code Playgroud)

它返回一个hashref { href => URL },而第一个示例返回URL。

失败的at回报undef,因此首先需要检查。

这是对内容的另一种手动搜索,但至少针对<head>


更新资料

我查看了上述组件及其父类的源代码。这也产生了Mojo :: Content,其子类Single由返回Mojo::Message::content,并且Mojo :: UserAgent :: Transactor及其redirect方法使用Mojo :: URL。但是,它们具有不同的目的。总体而言,我发现直接挖掘基本URL没有任何帮助。

在这一点上,我必须得出结论,此处没有像basein 这样的直接功能LWP

  • @Borodin在这一点上,我必须调用它并为自己得出结论,就是它不存在。当然,我不能在如此庞大的框架上发表明确的声明,但是我确实仔细研究了源头和所有出现的事情。(文档确实让我希望它们变得更好。)我在更新时提到了另外两个类。 (2认同)