【问题标题】:Base URL of Mojolicious responseMojolicious 响应的基本 URL
【发布时间】:2017-08-27 11:29:52
【问题描述】:

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

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

谁能帮帮我?

【问题讨论】:

    标签: html perl http mojolicious


    【解决方案1】:

    更新 在这一点上,我认为这个框架没有与base 等效的LWP


    我在Mojo::Headers 类中找到content_location 方法。 Mojo::Message::Response 继承自基础 Mojo::MessageMojo::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,而baseattr 来自Mojo::DOM。或者

    $dom->at('head > base[href]');
    

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

    at 在失败时返回 undef,因此首先需要检查。

    这是对内容的额外手动搜索,但至少它集中在<head>


    更新

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

    在这一点上,我必须得出结论,LWP 中的base 之类的直接功能在此处不可用。

    【讨论】:

    • Mojo UA 不应该生成这些对象吗?
    • @simbabque 是的,我希望如此,但我不知道事实是否如此。
    • @zdim:是的,$res->headers->content_location 只返回 HTTP 标头的值,而 $dom->at('head base')->attr('href') 只返回 <base> 元素中的任何 URL。基本 URL 是这些 最近重定向的请求 URL 之一,具体取决于它们中的哪一个。我可以单独找到所有这些并使用第一个找到的,但我希望像这样属于 HTTP 规范的一部分的内容将被编码到模块中。
    • @Nemo 嗯,是的,我还没有找到它。我看不出如何使用Mojo::URL::base 来做类似这里需要的事情。它是一个单独的类,必须用它自己的 URL 实例化,然后在 rel 和 abs 之间转换,就我所见。我认为它不能与现有的Mojo::UA 对象(或者更确切地说,事务或响应对象)一起运行。我不认为这是故意的。如果您知道该怎么做,请发布答案!
    • @Borodin 在这一点上,我必须调用它并自己断定它不存在。当然,我无法对如此庞大的框架做出明确的陈述,但我确实查看了来源和出现的所有内容。 (文档确实让我希望它们变得更好。)我更新并提到了更多的课程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多