Как выполнить команду CURL из Perl-скрипта?

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

Для этого я хочу выполнить команду curl, подобную:

curl -v -H "Accept:text/x-html-parts,text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" -H "Accept-Charset:UTF-8" -H "Accept-Encoding:identity" -H "Connection:Keep-Alive" -H "Via:HTTP/1.1 ShoppingArea" + + + something.. something....

Этот сценарий curl будет выполняться во время процесса развертывания и вызовет основной контроллер Spring моей службы.

Я хочу записать эту команду в файл perl.

Но я не очень понимаю, как это сделать!

Любые зацепки были бы полезны :)

Наверное, лучше сделать это на чистом perl ... LWP :: UserAgent или подобном модуле. Черт возьми, может даже быть привязка libcurl ...

Shawn 12.12.2018 07:41

Используя corion.net/curl2lwp.psgi, вы можете легко преобразовать командную строку Curl в сценарий Perl, используя LWP :: UserAgent. Поле для комментариев слишком мало для результирующего кода, но если это то, что вы ищете, я могу опубликовать его в качестве ответа.

Corion 12.12.2018 09:41

@Corion было бы замечательно, если бы вы вставили его в качестве ответа заранее! :)

Gaurav Setia 12.12.2018 09:43
curl - это просто оболочка для библиотеки libcurl. Почему бы не использовать библиотеку libcurl напрямую, вместо того, чтобы раскошелиться? Net :: Curl.
ikegami 12.12.2018 10:04
0
4
5 786
3

Ответы 3

Плохая практика, но с использованием system (запускает произвольный шелл-код):

system "curl -v -H 'Accept:text/x-html-parts,text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Accept-Charset:UTF-8' -H 'Accept-Encoding:identity' -H 'Connection:Keep-Alive' -H 'Via:HTTP/1.1 ShoppingArea' + + + something.. something...."

также из (Как мне написать сценарий Perl для использования curl для обработки URL-адреса?):

my $curl=`curl http://whatever`

если вы хотите использовать конкретный CURL только в своем Perl Script. Я бы посоветовал вам выполнить системный вызов с использованием обратных кавычек.

my $curlcomm = `curl -v -H "Accept:text/x-html-parts,text/html,application/xhtml+xml,applicatio/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" -H "Accept-Charset:UTF-8" -H "Accept-Encoding:identity" -H "Connection:Keep-Alive" -H "Via:HTTP/1.1 ShoppingArea" + + + something.. something....`

но также доступны стандартные способы, в которых можно использовать LWP :: UserAgent, LWP :: Curl и подобные.

В качестве грубого прототипа воспроизведения того, что делает curl на чистом Perl (с использованием https://corion.net/curl2lwp.psgi), вы можете легко преобразовать командную строку Curl в сценарий Perl с помощью LWP :: UserAgent:

#!perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;


my $ua = LWP::UserAgent->new();
my $r  = HTTP::Request->new(
    'GET' => 'https://api.example.com/',
    [
        'Connection' => 'Keep-Alive',
        'Via'        => 'HTTP/1.1 ShoppingArea',
        'Accept' =>
'text/x-html-parts,text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Charset'  => 'UTF-8',
        'Accept-Encoding' => 'identity',
        'Host'            => 'api.example.com:443',
        'User-Agent'      => 'curl/7.55.1',
    ],

);
my $res = $ua->request( $r, );


__END__

Created from curl command line
curl -v -H "Accept:text/x-html-parts,text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" -H "Accept-Charset:UTF-8" -H "Accept-Encoding:identity" -H "Connection:Keep-Alive" -H "Via:HTTP/1.1 ShoppingArea" https://api.example.com/ 

Для этого требуется модуль LWP :: UserAgent, поэтому обращение к curl может оказаться для вас более быстрым подходом. Если вам нужно отреагировать на результат, например, при отправке сообщений об ошибках на HTTP Error 500 или других уведомлений на HTTP Error 4xx, использование чистого Perl более удобно, поскольку вы получаете код состояния непосредственно обратно.

пока я пытаюсь запустить указанный выше сценарий, я получаю сообщение об ошибке «java.lang.IllegalArgumentException: в имени метода обнаружен недопустимый символ. Имена методов HTTP должны быть токенами». я предполагаю, что это связано с наличием "|" (трубка) персонаж. как я могу от этого избавиться?

Gaurav Setia 12.12.2018 11:43

Это сообщение об ошибке Java. Откуда вы получаете это сообщение об ошибке Java? Вышеупомянутый сценарий является сценарием Perl.

Corion 12.12.2018 13:47

Спасибо за помощь! дайте мне знать, как я могу быть уверен, что этот скрипт был выполнен успешно или нет?

Gaurav Setia 13.12.2018 09:15

@GauravSetia Это скорее вопрос отладки - я не знаю, как отлаживать сценарии Java, но вы можете print $res->is_success или exit $res->is_success или print $res->code, чтобы увидеть / сигнализировать о статусе запроса.

Corion 13.12.2018 12:38

Другие вопросы по теме