Должен ли я использовать Perl LWP или lib curl?

Насколько я понимаю (с точки зрения клиента HTTP), мы имеем LWP и libcurl (WWW:: Curl), доступные в Perl. У нас есть какие-то критерии, которые можно выбрать?

Ответ 1

Говоря только с точки зрения API, я предпочитаю LWP. Проблема с Curl заключается в том, что он очень явно сделан из библиотеки C. Например:

$curl->setopt(CURLOPT_URL, 'http://example.com');
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA, \$response_body);

my $retcode = $curl->perform;
if ($retcode == 0) {
    # Response is now in $response_body
}
else {
    die "Error\n";
}

Настройка параметров с помощью setopt()? Возврат ответа с использованием ссылки на один из этих параметров? Имея метод, возвращающий 0 на успех? Эти вещи идиоматичны в коде C, но не в современном OO Perl.

Здесь примерно такой же код в LWP:

my $response = $lwp->get('http://example.com');
if( $response->is_success ) {
    $response_body = $response->decoded_content;
}
else {
    die "Error\n";
}

Вызов is_success() более самодокументируется и лучше сочетается с языком OO. C-кодировщики привыкли видеть код, похожий на if($retcode == 0) на успех по историческим причинам, но нет причин, по которым Perl-кодировщики должны подбирать эту привычку. Вышеприведенное также показывает, как LWP легко заботится о расширении содержимого для нас, который Curl оставляет для вас.

Это не показано выше, но Curl также заставляет вас обрабатывать разбор параметров GET/POST самостоятельно. В LWP вы передаете хэш, и он разбивает пары name=value для вас. Печенье тоже. Таким образом, Curl очень низкоуровневый.

Curl может быть быстрее, но спросите себя, насколько это важно в вашем приложении. Вы действительно собираетесь отправить 100 запросов за короткий промежуток времени? Если так, то Curl вполне может стоить того. Если нет, то отправляйтесь на простоту реализации, и я думаю, что LWP собирается выиграть без большой борьбы.

Ответ 2

LWP является наиболее часто используемым и работает с де-факто стандартными модулями, такими как HTTP:: Request, HTTP:: Headers, HTTP:: Cookies и т.д. WWW:: Curl иногда бывает более мощным, а иногда и быстрее, но имеет вид странного интерфейса, который делает очевидным очевидное, что он обертывает библиотеку C. Я бы использовал LWP, если нет причин для этого.

Ответ 3

Мне нравится использовать Mojo:: UserAgent. Я даже написал об этом в 2011 Perl Advent Calendar.

Однако на самом деле нет ответа на ваш общий вопрос. Вы используете правильный инструмент для своей работы. Не зная, что вы пытаетесь сделать, вам практически невозможно вести вас. Изучите оба варианта, а затем выберите тот, который упрощает задачу. У вас могут быть лучшие ручки и циферблаты для того, что вам нужно сделать.

Ответ 4

Все зависит от ваших требований и ожиданий. Я думаю, что libcurl и LWP имеют несколько разные наборы функций, и они немного отличаются друг от друга.

Смотрите тесты libcurl vs LWP или this, Я настоятельно призываю вас провести собственное сравнение для ваших собственных функций и окружения, чтобы сделать его действительно актуальным.

(Отказ от ответственности: я являюсь основным автором libcurl)

Ответ 5

Я бы предпочел LWP, потому что это основной модуль perl. Чтобы взаимодействовать с веб-службами, инструмент curl toolline имеет некоторые удобные функции, такие как опция --anyauth, и вы также можете легко выдавать запросы HTTP PUT и HTTP DELETE. Я думаю, что PUT и DELETE были добавлены как удобные методы для LWP совсем недавно в 2011 году, исправьте меня, если я ошибаюсь.