Perl / curl как получить код состояния и тело ответа



Я пытаюсь написать простой perl-скрипт, который вызывает и API, и если код состояния 2xx, то сделайте что-нибудь с ответом. В то время как если это 4xx или 5xx, то сделайте что-нибудь еще.



Проблема, с которой я сталкиваюсь, заключается в том, что я могу либо получить код ответа (используя пользовательский формат записи и передавая выходные данные куда-то еще), либо я могу получить весь ответ и заголовки.



my $curlResponseCode = `curl -s -o /dev/null -w "%{http_code}" ....`;


Даст мне только код состояния.



my $curlResponse = `curl -si ...`; 


Даст мне весь заголовок плюс реакция.



Мой вопрос заключается в том, как я могу получить тело ответа от сервера и код состояния http в аккуратном формате, который позволяет мне разделить их на две отдельные переменные.



К сожалению, я не могу использовать LWP или любые другие отдельные библиотеки.



Заранее благодарю.
- Спенсер

591   3  

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

    Ничего не найдено.