#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