Php print curl headers

Может ли PHP, используя cURL, получить заголовки и тело ответа за один запрос

Есть ли способ получить как заголовки, так и тело запроса cURL с помощью PHP? Я обнаружил, что этот вариант:

curl_setopt($ch, CURLOPT_HEADER, true);

собирается вернуть тело плюс заголовки , но затем мне нужно проанализировать его, чтобы получить тело. Есть ли способ получить и то, и другое более удобным (и безопасным) способом?

Обратите внимание, что для «единого запроса» — я имею в виду отказ от отправки запроса HEAD до GET/POST.

Ответ 1

Пример кода:

$ch = curl_init();

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_HEADER, 1);

// .

$response = curl_exec($ch);

// Затем, после вызова curl_exec:

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);

$header = substr($response, 0, $header_size);

$body = substr($response, $header_size);

Предупреждение: этот код может быть ненадежным при использовании с прокси-серверами или при обработке определенных типов перенаправлений.

Ответ 2

Ответ, предложенный выше, не совсем корректен.

Разделение на \r\n\r\n\n не надежно, если включен CURLOPT_FOLLOWLOCATION или если сервер отвечает кодом 100.

Не все серверы соответствуют стандартам и передают только \n для новых строк.

Определение размера заголовков через CURLINFO_HEADER_SIZE также не всегда надежно, особенно при использовании прокси-серверов или в некоторых аналогичных сценариях перенаправления.

Наиболее корректным методом является использование CURLOPT_HEADERFUNCTION.

Вот очень чистый метод выполнения этой функции с использованием закрытий PHP. Он также преобразует все заголовки в нижний регистр для последовательной работы с разными серверами и версиями HTTP.

Эта версия будет сохранять дублирующиеся заголовки.

Этот код соответствует RFC822 и RFC2616, пожалуйста, не предлагайте правки для использования функций mb_ string, это неправильно!

$ch = curl_init();

$headers = [];

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// эта функция вызывается curl для каждого полученного заголовка

curl_setopt($ch, CURLOPT_HEADERFUNCTION,

function($curl, $header) use (&$headers)

$len = strlen($header);

$header = explode(‘:’, $header, 2);

if (count($header) < 2) // игнорируем недействительные заголовки

return $len;

$headers[strtolower(trim($header[0]))][] = trim($header[1]);

return $len;

>

);

$data = curl_exec($ch);

print_r($headers);

Ответ 3

Curl имеет встроенную опцию для этого, называемую CURLOPT_HEADERFUNCTION. Значение этой опции должно быть именем функции обратного вызова. Curl передаст заголовок (и только заголовок!) этой функции обратного вызова построчно (таким образом, функция будет вызываться для каждой строки заголовка, начиная с верхней части раздела заголовка). Затем ваша функция обратного вызова может делать с ним все что угодно (и должна вернуть количество байт данной строки). Вот проверенный рабочий код:

function HandleHeaderLine( $curl, $header_line )

echo «
YEAH: «.$header_line; // или сделать что угодно

return strlen($header_line);

>

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, «http://www.google.com»);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_HEADERFUNCTION, «HandleHeaderLine»);

$body = curl_exec($ch);

Вышеописанное работает со всем, с различными протоколами и прокси, и вам не нужно беспокоиться о размере заголовка или устанавливать множество различных опций curl.

P. S.: Чтобы обработать строки заголовка с помощью объектного метода, сделайте следующее:

curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$object, ‘methodName’))

Ответ 4

Если вам конкретно нужен Content-Type , для его получения есть специальная опция cURL:

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);

$content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

Ответ 5

Можно использовать следующий код:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_VERBOSE, 1);

curl_setopt($ch, CURLOPT_HEADER, 1);

$parts = explode(«\r\n\r\nHTTP/», $response);

$parts = (count($parts) > 1 ? ‘HTTP/’ : »).array_pop($parts);

list($headers, $body) = explode(«\r\n\r\n», $parts, 2);

Работает с HTTP/1.1 100 Continue перед другими заголовками.

Если вам нужно работать с глючными серверами, которые посылают только LF вместо CRLF в качестве перевода строки, вы можете использовать preg_split следующим образом:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_VERBOSE, 1);

curl_setopt($ch, CURLOPT_HEADER, 1);

$parts = preg_split(«@\r?\n\r?\nHTTP/@u», $response);

$parts = (count($parts) > 1 ? ‘HTTP/’ : »).array_pop($parts);

list($headers, $body) = preg_split(«@\r?\n\r?\n@u», $parts, 2);

Ответ 6

Это возвращает один массив, в котором данные разделены, а заголовки перечислены. Это работает на основе того, что CURL вернет кусок заголовков [ пустая строка ] данных .

curl_setopt($ch, CURLOPT_HEADER, 1); // нам нужно это, чтобы вернуть заголовки

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_VERBOSE, true);

// $output содержит выходную строку

$output = curl_exec($ch);

$lines = explode(«\n»,$output);

$out = array();

$headers = true;

foreach ($lines as $l)

$l = trim($l);

if ($headers && !empty($l))

if (strpos($l,’HTTP’) !== false)

$p = explode(‘ ‘,$l);

$out[‘Headers’][‘Status’] = trim($p[1]);

> else

$p = explode(‘:’,$l);

$out[‘Headers’][$p[0]] = trim($p[1]);

>

> elseif (!empty($l))

$out[‘Data’] = $l;

>

if (empty($l))

$headers = false;

>

>

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

curl_getinfo

// Проверяем наличие ошибок
if (! curl_errno ( $ch )) switch ( $http_code = curl_getinfo ( $ch , CURLINFO_HTTP_CODE )) case 200 : # OK
break;
default:
echo ‘Неожиданный код HTTP: ‘ , $http_code , «\n» ;
>
>

// Закрываем дескриптор
curl_close ( $ch );
?>

Примечания

Замечание:

Информация, собранная этой функцией, будет сохранена при дальнейшем использовании дескриптора. Это означает, что если статистика не будет перезаписана самой функцией, будет возвращаться информация по предыдущему запросу.

User Contributed Notes 13 notes

Here are the response codes ready for pasting in an ini-style file. Can be used to provide more descriptive message, corresponding to ‘http_code’ index of the arrray returned by curl_getinfo().
These are taken from the W3 consortium HTTP/1.1: Status Code Definitions, found at
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

[Informational 1xx]100=»Continue»
101=»Switching Protocols» [Successful 2xx]200=»OK»
201=»Created»
202=»Accepted»
203=»Non-Authoritative Information»
204=»No Content»
205=»Reset Content»
206=»Partial Content» [Redirection 3xx]300=»Multiple Choices»
301=»Moved Permanently»
302=»Found»
303=»See Other»
304=»Not Modified»
305=»Use Proxy»
306=»(Unused)»
307=»Temporary Redirect» [Client Error 4xx]400=»Bad Request»
401=»Unauthorized»
402=»Payment Required»
403=»Forbidden»
404=»Not Found»
405=»Method Not Allowed»
406=»Not Acceptable»
407=»Proxy Authentication Required»
408=»Request Timeout»
409=»Conflict»
410=»Gone»
411=»Length Required»
412=»Precondition Failed»
413=»Request Entity Too Large»
414=»Request-URI Too Long»
415=»Unsupported Media Type»
416=»Requested Range Not Satisfiable»
417=»Expectation Failed» [Server Error 5xx]500=»Internal Server Error»
501=»Not Implemented»
502=»Bad Gateway»
503=»Service Unavailable»
504=»Gateway Timeout»
505=»HTTP Version Not Supported»

And an example usage:
$ch = curl_init (); // create cURL handle (ch)
if (! $ch ) die( «Couldn’t initialize a cURL handle» );
>
// set some cURL options
$ret = curl_setopt ( $ch , CURLOPT_URL , «http://mail.yahoo.com» );
$ret = curl_setopt ( $ch , CURLOPT_HEADER , 1 );
$ret = curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , 1 );
$ret = curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 0 );
$ret = curl_setopt ( $ch , CURLOPT_TIMEOUT , 30 );

// execute
$ret = curl_exec ( $ch );

if (empty( $ret )) // some kind of an error happened
die( curl_error ( $ch ));
curl_close ( $ch ); // close cURL handler
> else $info = curl_getinfo ( $ch );
curl_close ( $ch ); // close cURL handler

if (empty( $info [ ‘http_code’ ])) die( «No HTTP code was returned» );
> else // load the HTTP codes
$http_codes = parse_ini_file ( «path/to/the/ini/file/I/pasted/above» );

// echo results
echo «The server responded:
» ;
echo $info [ ‘http_code’ ] . » » . $http_codes [ $info [ ‘http_code’ ]];
>

Источник

Php cUrl как вывести возвращаемые заголовки?

После curl_setopt($ch, CURLOPT_HEADER, true) при curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) HTTP-header возвращается в теле ответа $html = curl_exec($ch) . Вот оттуда его и доставайте через

$html = curl_exec($ch); if ($html !== false)

Stimulate

masha_0212

Stimulate

masha_0212

curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "name:password"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($json)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4"); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_HEADER, true); //curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); // возможно curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 200); $result = json_decode(curl_exec($ch), true); $code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); $new_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

Compolomus

Источник

Читайте также:  Java spring аннотация repository
Оцените статью