Как мне использовать Perl URI класс? - PullRequest
5 голосов
/ 11 февраля 2012

Мне нужно обработать некоторые HTTP-URL в Perl-программе, но у меня есть сомнения, как класс 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. Разрешить относительный URL

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

    IIUC, без ->abs, результат все равно будет преобразован в относительный URL (и не будет работать для HTTP::Request s), я прав?Кроме того, гарантированно ли это вернуть URI?

Как мне решить эти проблемы?Возможные варианты:

  • Использование ->isa('URI') и ->can("host") все время
    • Мне кажется, что это может привести к ошибкам и уродливым
  • Дон 'не использовать URI класс вообще и анализировать URL-адреса с помощью регулярных выражений
    • Я все же предпочел бы использовать решение для библиотеки, чем отлаживать свои собственные
  • Wrap URI операций вtry { ... } catch { ... }
    • см. Первую точку

Есть ли вменяемый, надежный способ использования классов URI?Что-то простое, о чем я не думал (в списке выше)?

1 Ответ

7 голосов
/ 11 февраля 2012

Я думаю, что ваш вопрос можно обобщить: проверка параметров утомительна, что мне с этим делать?

  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. Да и да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...