【问题标题】:How should I use Perl URI class?我应该如何使用 Perl URI 类?
【发布时间】:2012-02-11 12:03:15
【问题描述】:

我需要在 Perl 程序中处理一些 HTTP URL,但我怀疑URI 类应该如何帮助我。

特别是,我想使用 URI 类来解析相对 URL 并获取它们的组件。但是,问题是:

  1. 我需要一个函数来处理 URI 对象和 URI 字符串作为参数(或确保只有一个被传递)

    sub foo_string_or_url {
      my $uri = URI->new(shift);
    

    这是正确的方法吗?我不太喜欢它,因为它会将URI 字符串化并不必要地创建新对象。

  2. 提取组件

    my $host = $uri->host;
    

    这也是有问题的,因为并非所有URIs 都有主机,特别是如果有人将垃圾传递给函数,这将die()

  3. 解析相对 URL

    my $new_url = URI::URL->new($uri, $base)->abs;
    

    IIUC,没有->abs,结果仍将字符串化为相对URL(并且不适用于HTTP::Requests),对吗?另外,这是否保证返回URI

我应该如何处理这些问题?可能性是

  • 一直使用->isa('URI')->can("host")
    • 对我来说似乎容易出错且丑陋
  • 根本不要使用URI 类并使用正则表达式解析URL
    • 我仍然宁愿使用库解决方案而不是自己调试
  • URI 操作包装在try { ... } catch { ... }
    • 见第一点

有没有一种理智的、万无一失的方式来使用URI 类?一些我没想到的简单事情(在上面的列表中)?

【问题讨论】:

    标签: perl oop url


    【解决方案1】:

    我觉得你的问题可以总结一下:参数验证很繁琐,我该怎么办?

    1. 我也不喜欢。这是开发人员之间不同意见的问题,其他人说 强制 比切片面包更好,尤其是当 Moose 自动完成时。我认为只允许一种类型可以简化程序。此外,YAGNI 适用于绝大多数情况。拒绝错误的类型,使用诸如 Params::Validate/MooseX::Method::Signatures/MooseX::Declare 之类的帮助模块,以避免代码示例中显示的手动检查。

    2. 这是期望的行为。异常处理机制使您可以编写适合每种情况的自定义代码。如果您认为它不美观,请将其删除,并注意放任异常不受检查的后果。

      use Try::Tiny;
      my $host;
      try {
          $host = $uri->host;
      } catch {
          warn "Could not determine host for $uri. Message was: $_. Retry/abort/ignore?\n";
          …
      };
      
    3. 是的,是的。

    【讨论】:

    • 唯一没有回答的问题是“我应该如何处理这些问题?”,答案是“总是叫 abs”。如果你已经有一个绝对 URI,它不会做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2010-09-09
    • 2010-10-10
    • 2011-06-13
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多