Perl / curl как получить код состояния и тело ответа
Я пытаюсь написать простой perl-скрипт, который вызывает и API, и если код состояния 2xx, то сделайте что-нибудь с ответом. В то время как если это 4xx или 5xx, то сделайте что-нибудь еще.
Проблема, с которой я сталкиваюсь, заключается в том, что я могу либо получить код ответа (используя пользовательский формат записи и передавая выходные данные куда-то еще), либо я могу получить весь ответ и заголовки.
my $curlResponseCode = `curl -s -o /dev/null -w "%{http_code}" ....`;
Даст мне только код состояния.
my $curlResponse = `curl -si ...`;
Даст мне весь заголовок плюс реакция.
Мой вопрос заключается в том, как я могу получить тело ответа от сервера и код состояния http в аккуратном формате, который позволяет мне разделить их на две отдельные переменные.
К сожалению, я не могу использовать LWP или любые другие отдельные библиотеки.
Заранее благодарю.
- Спенсер
3 ответов:
...Даст мне весь заголовок плюс ответ.
... в аккуратном формате, который позволяет мне разделить их на две отдельные переменные.
Поскольку заголовок и тело просто разделены пустой строкой, вы можете разделить содержимое на этой строке:
my ($head,$body) = split( m{\r?\n\r?\n}, `curl -si http://example.com `,2 );И получить код состояния из заголовка
my ($code) = $head =~m{\A\S+ (\d+)};Вы также можете объединить это в одно выражение с регулярным выражением, хотя это может быть сложнее понять:
my ($code,$body) = `curl -si http://example.com` =~m{\A\S+ (\d+) .*?\r?\n\r?\n(.*)}s;
Я придумал такое решение:
URL="http://google.com" # store the whole response with the status at the and HTTP_RESPONSE=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST $URL) # extract the body HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g') # extract the status HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') # print the body echo "$HTTP_BODY" # example using the status if [ ! $HTTP_STATUS -eq 200 ]; then echo "Error [HTTP status: $HTTP_STATUS]" exit 1 fi
Довольно фундаментально-вы захватываете выходные данные из системной команды. Гораздо лучше сделать это с помощью библиотеки, построенной для этого -
LWP. В противном случае -curl -vсоздаст код состояния и содержимое, и вам придется его разобрать.Вы также можете найти этот поток на Суперпользователе полезным:
Https://superuser.com/questions/272265/getting-curl-to-output-http-status-code
Конкретно
#creates a new file descriptor 3 that redirects to 1 (STDOUT) exec 3>&1 # Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS # and sending the content to this command's STDOUT with -o >(cat >&3) HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')(это не perl, но вы можете возможно, использовать что-то подобное. По крайней мере, запустив
-wи записав содержимое во временный файл.
Comments