(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP
curl_error — Возвращает строку с описанием последней ошибки текущего сеанса
Описание
Список параметров
-
handle
-
Дескриптор cURL, полученный из curl_init().
Возвращаемые значения
Возвращает сообщение об ошибке или ''
(пустую строку),
если ошибки не произошло.
Список изменений
Версия | Описание |
---|---|
8.0.0 |
handle теперь ожидает экземпляр CurlHandle;раньше, ожидался ресурс (resource). |
Примеры
Пример #1 Пример использования curl_error()
<?php
// Создаём дескриптор curl к несуществующему адресу
$ch = curl_init('http://404.php.net/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if(
curl_exec($ch) === false)
{
echo 'Ошибка curl: ' . curl_error($ch);
}
else
{
echo 'Операция завершена без каких-либо ошибок';
}// Закрываем дескриптор
curl_close($ch);
?>
patrick at ibuildings dot nl ¶
10 years ago
If you want to fetch the error message, make sure you fetch it before you close the current cURL session or the error message will be reset to an empty string.
paul at paulmcgarry dot com ¶
14 years ago
For a 404 response to actually trigger an error as the example seems to be trying to demonstrate the following option should be set:
curl_setopt($ch,CURLOPT_FAILONERROR,true);
As per http://curl.haxx.se/libcurl/c/libcurl-errors.html
CURLE_HTTP_RETURNED_ERROR (22)
This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server returns an error code that is >= 400. (This error code was formerly known as CURLE_HTTP_NOT_FOUND.)
Anonymous ¶
2 years ago
If you're using curl_multi and there's an error, curl_error() will remain empty until you've called curl_multi_info_read(). That function "pumps" the information inside the curl libraries to the point where curl_error() will return a useful string.
This should really be added to the documentation, because it's not at all obvious.
anrdaemon at freemail dot ru ¶
4 years ago
curl_error is not a textual representation of curl_errno.
It's an actual error *message*.
If you want textual representation of error *code*, look for curl_strerror.
Я использую функции PHP curl для отправки данных на веб-сервер с моей локальной машины. Мой код выглядит следующим образом:
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($c);
if (curl_exec($c) === false) {
echo «ok»;
} else {
echo «error»;
}
curl_close($c);
К сожалению, я не могу поймать ни одной ошибки типа 404, 500 или сетевого уровня. Как же мне узнать, что данные не были размещены или получены с удаленного сервера?
Ответ 1
Вы можете использовать функцию curl_error(), чтобы определить, произошла ли какая-то ошибка. Например:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $your_url);
curl_setopt($ch, CURLOPT_FAILONERROR, true); // Требуется для того, чтобы коды ошибок HTTP сообщались через наш вызов к curl_error($ch)
//…
curl_exec($ch);
if (curl_errno($ch)) {
$error_msg = curl_error($ch);
}
curl_close($ch);
if (isset($error_msg)) {
// TODO — Обработать ошибку cURL соответствующим образом
}
Ответ 2
Если CURLOPT_FAILONERROR равно false, ошибки http не будут вызывать ошибок curl.
<?php
if (@$_GET[‘curl’]==»yes») {
header(‘HTTP/1.1 503 Service Temporarily Unavailable’);
} else {
$ch=curl_init($url = «http://».$_SERVER[‘SERVER_NAME’].$_SERVER[‘PHP_SELF’].»?curl=yes»);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
$response=curl_exec($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_errno= curl_errno($ch);
if ($http_status==503)
echo «HTTP Status == 503 <br/>»;
echo «Curl Errno returned $curl_errno <br/>»;
}
Ответ 3
Вы можете сгенерировать ошибку curl после его выполнения:
$url = ‘http://example.com’;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if(curl_errno($ch)){
echo ‘Request Error:’ . curl_error($ch);
}
И вот коды ошибок curl:
если кому-то нужна дополнительная информация об ошибках curl
<?php
$error_codes=array(
[1] => ‘CURLE_UNSUPPORTED_PROTOCOL’,
[2] => ‘CURLE_FAILED_INIT’,
[3] => ‘CURLE_URL_MALFORMAT’,
[4] => ‘CURLE_URL_MALFORMAT_USER’,
[5] => ‘CURLE_COULDNT_RESOLVE_PROXY’,
[6] => ‘CURLE_COULDNT_RESOLVE_HOST’,
[7] => ‘CURLE_COULDNT_CONNECT’,
[8] => ‘CURLE_FTP_WEIRD_SERVER_REPLY’,
[9] => ‘CURLE_REMOTE_ACCESS_DENIED’,
[11] => ‘CURLE_FTP_WEIRD_PASS_REPLY’,
[13] => ‘CURLE_FTP_WEIRD_PASV_REPLY’,
[14]=>’CURLE_FTP_WEIRD_227_FORMAT’,
[15] => ‘CURLE_FTP_CANT_GET_HOST’,
[17] => ‘CURLE_FTP_COULDNT_SET_TYPE’,
[18] => ‘CURLE_PARTIAL_FILE’,
[19] => ‘CURLE_FTP_COULDNT_RETR_FILE’,
[21] => ‘CURLE_QUOTE_ERROR’,
[22] => ‘CURLE_HTTP_RETURNED_ERROR’,
[23] => ‘CURLE_WRITE_ERROR’,
[25] => ‘CURLE_UPLOAD_FAILED’,
[26] => ‘CURLE_READ_ERROR’,
[27] => ‘CURLE_OUT_OF_MEMORY’,
[28] => ‘CURLE_OPERATION_TIMEDOUT’,
[30] => ‘CURLE_FTP_PORT_FAILED’,
[31] => ‘CURLE_FTP_COULDNT_USE_REST’,
[33] => ‘CURLE_RANGE_ERROR’,
[34] => ‘CURLE_HTTP_POST_ERROR’,
[35] => ‘CURLE_SSL_CONNECT_ERROR’,
[36] => ‘CURLE_BAD_DOWNLOAD_RESUME’,
[37] => ‘CURLE_FILE_COULDNT_READ_FILE’,
[38] => ‘CURLE_LDAP_CANNOT_BIND’,
[39] => ‘CURLE_LDAP_SEARCH_FAILED’,
[41] => ‘CURLE_FUNCTION_NOT_FOUND’,
[42] => ‘CURLE_ABORTED_BY_CALLBACK’,
[43] => ‘CURLE_BAD_FUNCTION_ARGUMENT’,
[45] => ‘CURLE_INTERFACE_FAILED’,
[47] => ‘CURLE_TOO_MANY_REDIRECTS’,
[48] => ‘CURLE_UNKNOWN_TELNET_OPTION’,
[49] => ‘CURLE_TELNET_OPTION_SYNTAX’,
[51] => ‘CURLE_PEER_FAILED_VERIFICATION’,
[52] => ‘CURLE_GOT_NOTHING’,
[53] => ‘CURLE_SSL_ENGINE_NOTFOUND’,
[54] => ‘CURLE_SSL_ENGINE_SETFAILED’,
[55] => ‘CURLE_SEND_ERROR’,
[56] => ‘CURLE_RECV_ERROR’,
[58] => ‘CURLE_SSL_CERTPROBLEM’,
[59] => ‘CURLE_SSL_CIPHER’,
[60] => ‘CURLE_SSL_CACERT’,
[61] => ‘CURLE_BAD_CONTENT_ENCODING’,
[62] => ‘CURLE_LDAP_INVALID_URL’,
[63] => ‘CURLE_FILESIZE_EXCEEDED’,
[64] => ‘CURLE_USE_SSL_FAILED’,
[65] => ‘CURLE_SEND_FAIL_REWIND’,
[66] => ‘CURLE_SSL_ENGINE_INITFAILED’,
[67] => ‘CURLE_LOGIN_DENIED’,
[68] => ‘CURLE_TFTP_NOTFOUND’,
[69] => ‘CURLE_TFTP_PERM’,
[70] => ‘CURLE_REMOTE_DISK_FULL’,
[71] => ‘CURLE_TFTP_ILLEGAL’,
[72] => ‘CURLE_TFTP_UNKNOWNID’,
[73] => ‘CURLE_REMOTE_FILE_EXISTS’,
[74] => ‘CURLE_TFTP_NOSUCHUSER’,
[75] => ‘CURLE_CONV_FAILED’,
[76] => ‘CURLE_CONV_REQD’,
[77] => ‘CURLE_SSL_CACERT_BADFILE’,
[78] => ‘CURLE_REMOTE_FILE_NOT_FOUND’,
[79] => ‘CURLE_SSH’,
[80] => ‘CURLE_SSL_SHUTDOWN_FAILED’,
[81] => ‘CURLE_AGAIN’,
[82] => ‘CURLE_SSL_CRL_BADFILE’,
[83] => ‘CURLE_SSL_ISSUER_ERROR’,
[84] => ‘CURLE_FTP_PRET_FAILED’,
[84] => ‘CURLE_FTP_PRET_FAILED’,
[85] => ‘CURLE_RTSP_CSEQ_ERROR’,
[86] => ‘CURLE_RTSP_SESSION_ERROR’,
[87] => ‘CURLE_FTP_BAD_FILE_LIST’,
[88] => ‘CURLE_CHUNK_FAILED’);
?>
Ответ 4
Поскольку вы заинтересованы в отлове ошибок, связанных с сетью, и ошибок HTTP, ниже приведен лучший подход:
function curl_error_test($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$responseBody = curl_exec($ch);
/*
* if curl_exec failed then
* $responseBody равно false
* curl_errno() возвращает ненулевое число
* curl_error() возвращает непустую строку
* Какой из них использовать — решать вам
*/
if ($responseBody === false) {
return «CURL Error: » . curl_error($ch);
}
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
/*
* 4xx коды состояния — ошибки клиента
* 5xx коды состояния — ошибки сервера
*/
if ($responseCode >= 400) {
return «HTTP Error: » . $responseCode;
}
return «Нет ошибки CURL или HTTP «;
}
Тесты:
curl_error_test(«http://expamle.com»); // Ошибка CURL : Невозможно определить хост : expamle.com
curl_error_test(«http://example.com/whatever»); // Ошибка HTTP: 404
curl_error_test(«http://example.com»); // Все в порядке с CURL или HTTP
Ответ 5
Еще один вариант кода:
$responseInfo = curl_getinfo($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$body = substr($response, $header_size);
$result=array();
$result[‘httpCode’]=$httpCode;
$result[‘body’]=json_decode($body);
$result[‘responseInfo’]=$responseInfo;
print_r($httpCode);
print_r($result[‘body’]); exit;
curl_close($ch);
if($httpCode == 403) {
print_r(«Доступ запрещен»);
exit;
} else {
// другие ошибки
}
Уровень сложности
Простой
Время на прочтение
7 мин
Количество просмотров 15K
Введение
cURL — библиотека с открытым исходным кодом, используемая для отправки HTTP-запросов с различных языков программирования, включая C, PHP и другие.
cURL также является программой командной строки, позволяющая взаимодействовать с множеством различных серверов.
Libcurl — это библиотека API для передачи, которую разработчики могут встроить в свои программы; cURL действует как автономная обёртка для библиотеки libcurl. Для libcurl имеются модули интеграции для работы с более чем 30 языками программирования.
cURL работает по множеству различных протоколов с синтаксисом URL. В данной статье рассмотрена работа библиотеки по протоколу HTTP/HTTPS.
Содержание:
-
Настройка параметров сеанса
-
Простой GET-запрос
-
Простой POST-запрос
-
Обработка исключений/ошибок
-
Пример POST-запроса с телом формате JSON, обработкой исключений, и обработкой ответа от сервера
-
Проверка SSL-сертификата
-
Аутентификация на сервере
Модуль PHP cURL обычно включён по умолчанию. Если это не так, то в файле php.ini уберите точку с запятой (;) у строки extension=php_curl.dll.
Настройка параметров сеанса
Для установки параметра сеанса cURL используется функция curl_setopt.
<?php
curl_setopt(CurlHandle $handle, int $option, mixed $value): bool
-
handle — дескриптор cURL, полученный из curl_init().
-
option — параметр сеанса в виде CURLOPT_XXX.
-
value — значение параметра option.
Функция возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Сразу несколько параметров сеанса можно установить с помощью функции curl_setopt_array.
<?php
curl_setopt_array(CurlHandle $handle, array $options): bool
options — ассоциативный массив, определяющий устанавливаемые параметры и их значения. Ключи должны быть корректными константами для функции curl_setopt() или их целочисленными эквивалентами.
Функция возвращает true, если все параметры были успешно установлены. Если не удалось успешно установить какой-либо параметр, немедленно возвращается значение false, все последующие параметры игнорируются.
Роль параметров сеанса играют предопределённые константы. Рассмотрим основные из них.
CURLOPT_URL — параметр, который задает адрес ресурса, с которым вы хотите взаимодействовать или с которого хотите получить данные. Параметр является обязательным и должен быть установлен перед вызовом curl_exec().
CURLOPT_RETURNTRANSFER — константа, устанавливающая значение дескриптора cURL так, чтобы ответ от сервера возвращался в виде строкового значения вместо отправки непосредственно в поток вывода.
При установке CURLOPT_RETURNTRANSFER в значение true или 1, константа сообщает cURL вернуть ответ из HTTP-запроса в виде строки, которую затем можно сохранить в переменной или обработать по мере необходимости. Если этот параметр не задан или имеет значение false, ответ на HTTP-запрос будет отправлен непосредственно в поток вывода (например, в окно браузера или файл, установленный параметром CURLOPT_FILE).
CURLOPT_HEADER — параметр, который указывает, следует ли включать заголовок в ответ (true — для включения).Заголовок содержит информацию об ответе, такую как код состояния HTTP, тип содержимого и др.
Для получения информации об ответе также можно использовать функцию curl_getinfo()(будет рассмотрена позже в статье).
CURLOPT_HTTPHEADER — параметр cURL, который задает HTTP-заголовки, отправляемые вместе с запросом. Параметр принимает массив строк. Каждая строка должна содержать имя заголовка и его значение, разделенные двоеточием.
CURLOPT_FOLLOWLOCATION — константа, которая используется для настройки поведения cURL в случае, если сервер возвращает заголовок «Location» как часть ответа, код состояния которого находится в диапазоне 300 – 399 (сообщения о перенаправлении). Заголовок «Location» содержит в себе URL для редиректа.
Когда CURLOPT_FOLLOWLOCATION установлена в значение 1, cURL будет автоматически следовать любым редиректам, делая дополнительные запросы к новому URL до тех пор, пока в ответе не будет содержаться заголовок «Location». Значение по умолчанию — 0.
CURLOPT_POST — константа, указывающая, следует ли отправлять запрос методом POST. По умолчанию cURL отправляет GET-запросы. Если CURLOPT_POST установлен в значении 1 или true, то будет отправлен POST-запрос.
CURLOPT_POSTFIELDS — это параметр cURL, используемый для установки тела POST-запроса. Формат данных зависит от типа, указанного в заголовке Content-Type.
Простой GET-запрос
<?php
// Инициализация сеанса cURL
$ch = curl_init();
// Установка URL
curl_setopt($ch, CURLOPT_URL, "example.com");
// Установка CURLOPT_RETURNTRANSFER (вернуть ответ в виде строки)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Выполнение запроса cURL
//$output содержит полученную строку
$output = curl_exec($ch);
// закрытие сеанса curl для освобождения системных ресурсов
curl_close($ch);
?>
Простой POST-запрос
Чтобы сделать POST-запрос, нужно установить параметры CURLOPT_POST и CURLOPT_POSTFIELDS.
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/api/resource");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "name=value");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
?>
Существует несколько форматов тела запроса:
1) Формат JSON
<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json');
curl_setopt($ch, CURLOPT_POSTFIELDS,"{key1:value1,key2:value2}");
?>
2) Строка запроса HTTP
<?php
curl_setopt($ch, CURLOPT_POSTFIELDS,"key1=value1&key2=value2");
?>
Для построения строки запроса используется функция http_build_query.
3) Формат массива POST
<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data');
curl_setopt($ch, CURLOPT_POSTFIELDS, array("key1"=>"value1", "key2"=>"value2");
?>
Для отправки файлов в тело запроса применяется класс CURLFile. Чтобы создать экземпляр класса можно воспользоваться конструктором или функцией curl_file_create. Экземпляр класса передаётся константе CURLOPT_POSTFIELDS как элемент массива.
Обработка исключений/ошибок
Обработка ошибок в ходе сеанса cURL осуществляется с помощью функций curl_errno и curl_error, которые фиксируют любые ошибки, возникающие во время сеанса.
curl_errno — принимает дескриптор cURL, полученный из curl_init() и возвращает номер ошибки последней операции cURL.
curl_error также принимает дескриптор, но возвращает строку с описанием последней ошибки текущего сеанса. Строка содержит информацию о том, что пошло не так во время операции cURL, что может пригодиться во время отладки.
Важно проверять значение curl_errno после операции cURL, чтобы убедиться, что операция завершена успешно, а также выявить и устранить любые ошибки, которые могли возникнуть.
Пример POST-запроса с телом формате JSON, обработкой исключений, и обработкой ответа от сервера
<?php
// Определение параметров сеанса
$CurlOptions = array(
CURLOPT_URL => 'http://domain-name/endpoint-path',
CURLOPT_POST => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_HTTPHEADER => array( 'Content-Type' => 'application/json' )
);
// Сериализация тела запроса
$data = array('field1' => 'value1', 'field2' => 'value2');
$json_req = json_encode($data);
// Установка тела запроса
$CurlOptions[CURLOPT_POSTFIELDS] = $json_req;
// Инициализация сеанса
$ch = curl_init();
// установка параметров сеанса
curl_setopt_array( $ch, $CurlOptions );
// Выполнение запроса, в переменной хранится ответ от сервера
$data = curl_exec( $ch );
//получение информацию о сеансе
$info = curl_getinfo($ch);
// если в ходе сеанса произошла ошибка
// или если код HTTP-ответа не в диапазоне 200 – 299 (успешные запросы)
if (curl_errno($ch) || substr($info['http_code'],0,1) !== '2') {
// вызов пользовательского исключения
throw new CustomException(curl_error($ch), $data, $info);
}
// закрытие сеанса
curl_close( $ch );
?>
В данном примере информация о последнем сеансе была получена с помощью функции curl_getinfo(). Функция возвращает массив информации о различных характеристиках сеанса, таких как код ответа HTTP, тип содержимого, общее время и т.д.
Проверка SSL-сертификата
Для проверки SSL-сертификата необходимо использовать константу CURLOPT_SSL_VERIFYPEER.
CURLOPT_SSL_VERIFYPEER — это константа, которая определяет, должен ли curl проверять подлинность SSL-сертификата. Если установлено значение true, curl проверяет SSL-сертификат, представленный удаленным сервером, и выдаёт ошибку, если это сертификат недействительный Если установлено значение false, curl не проверяет SSL-сертификат и разрешает подключение, даже если SSL-сертификат недействителен. Однако это может привести к уязвимостям в системе безопасности. По умолчанию установлено значение true.
CURLOPT_SSL_VERIFYPEER работает только для SSL-соединений, при подключении к http-серверам константа будет проигнорирована.
Аутентификация на сервере
CURLOPT_HTTPAUTH — это константа, которая используется для установки типа HTTP-аутентификации, используемой для запроса.
<?php
$CurlOptions = array(
CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
CURLOPT_USERPWD => "login:password");
?>
Константа принимает следующие значения:
-
CURLAUTH_BASIC: Базовая аутентификация HTTP, которая отправляет имя пользователя и пароль по сети в виде обычного текста, легко перехватываемого другими.
-
CURLAUTH_DIGEST: Аутентификация HTTP Digest, которая использует хэш-функцию для шифрования пароля перед отправкой его на сервер.
-
CURLAUTH_GSSNEGOTIATE: HTTP GSS-Negotiate аутентификация, которая является способом обеспечения безопасной аутентификации с использованием Kerberos.
-
CURLAUTH_NTLM: Аутентификация NTLM, которая представляет собой механизм запроса-ответа, используемый Windows. В данном случае используется концепция хэширования, аналогичная Digest, чтобы предотвратить перехват пароля.
-
CURLAUTH_ANY: Сообщает cURL попробовать все поддерживаемые методы аутентификации. cURL автоматически выберет тот, который он сочтет наиболее безопасным.
-
CURLAUTH_ANYSAFE: Работает аналогично CURLAUTH_ANY, но в этом случае cURL будет пробовать только безопасные методы (все методы кроме CURLAUTH_BASIC).
Значение по умолчанию: CURLAUTH_BASIC.
Значения могут быть объединены с помощью побитового ИЛИ. Например, CURLAUTH_BASIC | CURLAUTH_DIGEST. cURL выберет наиболее подходящий метод из представленных.
При использовании HTTPS все данные передаются в зашифрованном виде. При такой передаче CURLOPT_HTTPAUTH предоставляет дополнительные меры безопасности для обеспечения подлинности клиента и сервера и предотвращения несанкционированного доступа.
ИТОГ
cURL — удобная библиотека для передачи данных между клиентом и сервером. cURL позволяет взаимодействовать с множеством различных серверов по различным протоколам: http, https, ftp, gopher, telnet, dict, file и ldap.
Библиотека легка в использовании. cURL предоставляет инструменты для простых GET-запросов, но также имеет дополнительный функционал:
-
работа с сертификатами HTTPS;
-
загрузка файлов по протоколам HTTP и FTP (последнее можно сделать с помощью модуля FTP);
-
использование прокси-серверы;
-
cookies;
-
аутентификация пользователей.
I’m using curl
at the command line on Linux to issue HTTP requests. The response bodies are printed to standard out, which is fine, but I can’t see from the man page how to get curl to print the HTTP status code from the response (404, 403 etc). Is this possible?
asked Apr 18, 2011 at 10:28
4
This should work for you if the web server is able to respond to HEAD requests (this will not perform a GET
request):
curl -I http://www.example.org
As an addition, to let cURL follow redirects (3xx statuses) add -L
.
Wouter
1391 silver badge8 bronze badges
answered Apr 18, 2011 at 10:56
pberlijnpberlijn
9,6101 gold badge15 silver badges8 bronze badges
13
A more specific way to print out just the HTTP status code is something along the lines of:
curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
A lot easier to work with in scripts, as it doesn’t require any parsing
The parameter -I
might be added to improve response load performance. This will change the call to a HEAD
call which will fetch response overhead only, without the body.
Note: %{http_code}
returns on first line of HTTP payload (available variables for the -w
option on the curl
documentation page)
i.e.:
curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
answered Jun 28, 2012 at 0:25
pvandenberkpvandenberk
14.2k2 gold badges13 silver badges3 bronze badges
22
You can print the status code, in addition to all the headers by doing the following:
curl -i http://example.org
The good thing about -i
is that it works with -X POST
as well.
answered Dec 4, 2012 at 20:45
Cyril DavidCyril David
4,8171 gold badge12 silver badges2 bronze badges
7
If you want to see the header as well as the result you can use the verbose option:
curl -v http://www.example.org
curl --verbose http://www.example.org
The status will appear in the header. E.g.
< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity
Dennis
4525 silver badges14 bronze badges
answered May 3, 2012 at 4:28
Enrico SusatyoEnrico Susatyo
3,5162 gold badges19 silver badges20 bronze badges
4
If you want to capture the HTTP status code in a variable, but still redirect the content to STDOUT, you must create two STDOUTs. You can do so with process substitution >() and command substitution $().
First, create a file descriptor 3
for your current process’ STDOUT with exec 3>&1
.
Then, use curl’s -o
option to redirect the response content to a temporary fifo using command substitution, and then within that command substitution, redirect output back to your current process STDOUT file descriptor 3
with -o >(cat >&3)
.
Putting it all together in bash
3.2.57(1)-release
(standard for macOS
):
# 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')
Note that this doesn’t work in /bin/sh
as SamK noted in the comments below.
answered Jan 8, 2015 at 20:59
9
Redefine curl output:
curl -sw '%{http_code}' http://example.org
Can be used with any request type.
answered Aug 5, 2014 at 18:18
2
Status code ONLY
[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200
All credit to this GIST
answered Feb 8, 2017 at 10:44
mahatmanichmahatmanich
6455 silver badges7 bronze badges
2
This is a painful curl --fail
limitation. From man curl
:
-f, —fail
(HTTP) Fail silently (no output at all) on server errors
But there is no way to get both the non-zero return code AND the response body in stdout.
Based on pvandenberk’s answer and this other very useful trick learned on SO, here is a workaround :
curl_with_error_code () {
_curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
local curl_error_code http_code
exec 17>&1
http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
curl_error_code=$?
exec 17>&-
if [ $curl_error_code -ne 0 ]; then
return $curl_error_code
fi
if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
echo "HTTP $http_code" >&2
return 127
fi
}
This function behaves exactly as curl
, but will return 127 (a return code non-used by curl
) in case of a HTTP code in the range [400, 600[.
answered Apr 6, 2016 at 13:08
Lucas CimonLucas Cimon
4824 silver badges11 bronze badges
3
This will send a request to url, get only the first line of the response, split it on blocks and select the second one.
It contains the response code
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
answered Jul 15, 2015 at 20:08
2
For a POST request, the following worked:
curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o 'RESP_CODE:[1-4][0-9][0-9]'
answered Jan 7, 2016 at 8:36
zafar142003zafar142003
2512 silver badges4 bronze badges
Use the following cURL command and pipe it to grep like so:
$ curl -I -s -L http://example.com/v3/get_list | grep «HTTP/1.1»
Here’s what each flag does:
-I
: Show only response headers-s
: Silent — Don’t show progress bar-L
: FollowLocation:
headers
Here is a link to HTTP status codes.
Run from the command line. This curl runs in silent mode, follows any redirects, get the HTTP headers. grep will print the HTTP status code to standard output.
Cas
1,9442 gold badges19 silver badges42 bronze badges
answered Nov 21, 2016 at 11:28
An example of how to use the response codes. I use this to re-download Geolite databases only if they have changed (-z
) & also following redirects (-L
):
url=http://example.com/file.gz
file=$(basename $url)
response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")
case "$response" in
200) do_something ;;
301) do_something ;;
304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
*) printf "Received: HTTP $response ==> $url\n" ;;
esac
answered Apr 1, 2018 at 17:21
Here is some curl command that is using GET
and that returns the HTTP code.
curl -so /dev/null -w '%{response_code}' http://www.example.org
Please remember that the approach below is using HEAD
, which is faster but it may not work well with some web less compliant HTTP servers.
curl -I http://www.example.org
answered Jun 23, 2016 at 10:37
sorinsorin
11.7k21 gold badges63 silver badges73 bronze badges
2
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
This will return the following information:
- response data, if any data is returned by API like error
- status code
answered Mar 8, 2017 at 5:12
sranasrana
611 silver badge2 bronze badges
2
Split output content to stdout
and HTTP status code to stderr
:
curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2
If only HTTP status code is desired to stderr, --silent
can be used:
curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2
The desired stream can then be picked by redirecting unwanted one to /dev/null
:
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...
Note that for the second redirection to behave as desired, we need to run the curl command in subshell.
answered Jun 4, 2019 at 8:08
JaakkoJaakko
3203 silver badges12 bronze badges
2
The OP wants to know the status code. Often when downloading a file you also want to get a feel of it’s size so I’m using curl first to show status code and size of file and then shut off verbose and direct file to the place and name I want:
curl -R -s -S -w "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html
Then I wait for the finishing of curl
wait ${!}
before I run the next command. The above when used in a script of many commands like above gives a nice response like:
http: 200 42824
http: 200 34728
http: 200 35452
Please note that -o in curl needs to be followed by the full path of the file + name of file. This allows you thusly to save files in a sensible name structure when you d/l them with curl. Also note that -s and -S used together silence the output but does show errors. Note also that -R tries to set the file timestamp to that of the web file.
My answer is based on what @pvandenberk originally suggested, but in addition it actually saves the file somewhere, instead of merely directing to /dev/null.
answered Oct 7, 2017 at 7:32
$ curl -kv https://www.example.org 2>&1 | grep -i 'HTTP/1.1 ' | awk '{print $3}'| sed -e 's/^[ \t]*//'
- 2>&1: error is stored in output for parsing
- grep: filter the response code line from output
- awk: filters out the response code from response code line
- sed: removes any leading white spaces
answered Apr 14, 2021 at 4:44
There is another way by using Powershell command which is alias to curl.exe
Just type the following:
(Invoke-WebRequest -Uri https://your.website).StatusCode
answered Jul 14, 2022 at 10:30
In Windows PowerShell:
curl https:\\www.example.org -Method HEAD
It’s really just an alias for Invoke-WebRequest
though.
answered Sep 14, 2022 at 18:24
KebmanKebman
5152 gold badges5 silver badges13 bronze badges
You must log in to answer this question.
Not the answer you’re looking for? Browse other questions tagged
.
Not the answer you’re looking for? Browse other questions tagged
.
Вернуться к: cURL
curl_error
(PHP 4 >= 4.0.3, PHP 5, PHP 7)
curl_error — Возвращает строку с описанием последней ошибки текущего сеанса
Описание
string curl_error
( resource $ch
)
Возвращает понятное сообщение об ошибке для последней операции cURL.
Список параметров
-
ch
-
Дескриптор cURL, полученный из curl_init().
Возвращаемые значения
Возвращает сообщение об ошибке или » (пустую строку),
если ошибки не произошло.
Примеры
Пример #1 Пример использования curl_error()
<?php
// Создаем дескриптор curl к несуществующему адресу
$ch = curl_init('http://404.php.net/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if(
curl_exec($ch) === false)
{
echo 'Ошибка curl: ' . curl_error($ch);
}
else
{
echo 'Операция завершена без каких-либо ошибок';
}// Закрываем дескриптор
curl_close($ch);
?>
Вернуться к: cURL