我应该如何使用Perl URI类?

时间:2012-02-11 12:03:15

标签: perl oop url

我需要在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;
    

    这也有问题,因为并非所有URI都有托管,特别是如果有人将垃圾传递给该函数,这将die()

  3. 解析相对网址

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

    IIUC,如果没有->abs,结果仍会字符串化为相对网址(并且对HTTP::Request不起作用),我是对的吗?此外,这是否可以保证返回URI

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

    • 始终使用->isa('URI')->can("host")
      • 对我来说似乎容易出错且难看
    • 根本不要使用URI类,并使用正则表达式解析URL
      • 我宁愿使用库解决方案而不是调试我自己的
    • URI中换行try { ... } catch { ... }次操作
      • 见第一点

    使用URI类是否有一种健全,万无一失的方法?我没有想到的简单(在上面的列表中)?

1 个答案:

答案 0 :(得分:7)

我认为您的问题可以概括为:参数验证很繁琐,我该怎么办?

  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. 是和是。