Извлечение тела HTTP из ответа curl

#perl #http #curl #response

Вопрос:

Я использую пакет WWW::Curl::Easy для вызовов API, и это мой пример кода:

 use WWW::Curl::Easy;  my $curl = WWW::Curl::Easy-gt;new();  $curl-gt;setopt(CURLOPT_POST, 1); $curl-gt;setopt(CURLOPT_HEADER, 1); $curl-gt;setopt(CURLOPT_HTTPHEADER, ['Accept: text/xml; charset=utf-8', 'Content-Type:text/xml; charset=utf-8', 'SOAPAction: "importSheet"']); $curl-gt;setopt(CURLOPT_POSTFIELDS, $requestMessage); $curl-gt;setopt(CURLOPT_URL, $tom::{'setup'}{'api'}{'carrier'}{'url'});   my $response; $curl-gt;setopt(CURLOPT_WRITEDATA, $response);  main::_log(Dumper($curl));  my $ret = $curl-gt;perform();  

Как вы можете видеть , я сохраняю ответ в переменной $response , но я хотел бы знать, как лучше всего извлечь только HTTP-тело этого ответа, без заголовков и прочего.

Теперь мой ответ выглядит так:

 HTTP/1.1 500 Internal Server Error Date: Fri, 26 Nov 2021 21:38:42 GMT Content-Type: text/xml Connection: keep-alive Content-Length: 241 Set-Cookie: TS01972c9d=01a27f45ea407d6a9622e8d70528d3201676317364865a22da7d73be308d9e49021a872fbfe71877fbee80ce454071bc9a105a4e33; Path=/; Domain=.test.test.com  lt;SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"gt;lt;SOAP-ENV:Bodygt;lt;SOAP-ENV:Faultgt;lt;faultcodegt;SOAP-ENV:Serverlt;/faultcodegt;lt;faultstringgt;user_not_foundlt;/faultstringgt;lt;/SOAP-ENV:Faultgt;lt;/SOAP-ENV:Bodygt;lt;/SOAP-ENV:Envelopegt;  

но я хотел бы получить только текст этого ответа без заголовков, поэтому он должен быть таким:

 lt;SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"gt;lt;SOAP-ENV:Bodygt;lt;SOAP-ENV:Faultgt;lt;faultcodegt;SOAP-ENV:Serverlt;/faultcodegt;lt;faultstringgt;user_not_foundlt;/faultstringgt;lt;/SOAP-ENV:Faultgt;lt;/SOAP-ENV:Bodygt;lt;/SOAP-ENV:Envelopegt;  

Я пробовал такие вещи, как:

 $response_content = HTTP::Response-gt;parse("$response") ; $response_content = $response_content-gt;content;  

но он все еще содержит заголовки.

Ответ №1:

каков наилучший способ извлечь только HTTP-тело этого ответа

Просто удалите

 $curl-gt;setopt(CURLOPT_HEADER, 1);  

Или измените его на

 $curl-gt;setopt(CURLOPT_HEADER, 0);  

Если вам также нужен заголовок, добавьте также следующее:

 $self-gt;setopt(CURLOPT_HEADERDATA, $head);  

Все вместе:

 my $curl = WWW::Curl::Easy-gt;new();  $curl-gt;setopt(CURLOPT_POST, 1); $curl-gt;setopt(CURLOPT_URL, ...); $curl-gt;setopt(CURLOPT_HTTPHEADER, ...); $curl-gt;setopt(CURLOPT_POSTFIELDS, ...);  # $curl-gt;setopt(CURLOPT_HEADER, 0); This is the default. $curl-gt;setopt(CURLOPT_WRITEDATA, my $body); # If you want the body. $curl-gt;setopt(CURLOPT_HEADERDATA, my $head); # If you want the head.  

Ответ №2:

Вы можете использовать $curl-gt;setopt(CURLOPT_HEADERDATA, $head) и $curl-gt;setopt(CURLOPT_FILE, $body) установить отдельное назначение для данных заголовка и тела из ответа.

Комментарии:

1. CURLOPT_FILE это старое название для CURLOPT_WRITEDATA