HTTP::Response
模块具有base
方法,该方法返回在将邮件内容中的相对URL转换为绝对URL时使用的基本URL。它从消息正文中检索它(作为HTML <base>
中的<head>
元素),HTTP标头Content-Location
(或过时的Content-Base
)或请求的URL(从最近的重定向,如果有的话)
我无法看到Mojo::Message::Response
提供相同信息的任何方式,如果某个地方已经存在,我也不想自己编码
任何人都可以帮助我吗?
答案 0 :(得分:4)
更新此时我认为此框架与base
LWP
不等价
我在content_location课程中找到Mojo::Headers方法。 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';
似乎有效。这个合适吗?我不能轻易找到一个真实的页面试试。
这不扫描文档内容,但仅适用于标题。生成HTTP::Response对象时,LWP
会在文档中设置标题,如问题和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。但是,它们有不同的用途。总而言之,我找不到直接挖掘基本网址的帮助。
此时我必须得出结论,base
中的LWP
等直接功能在此处不可用。