Http code 0 php curl: PHP cURL HTTP CODE return 0
Содержание
5. Подробное описание Действия > 5.1. Общие параметры, используемые во многих действиях > 5.1.9. Доступ в Интернет > 5.1.9.1. Список кодов ошибок cURL и их объяснение
В качестве вывода каждого интернет-соединения через cURL вы получаете «Код ошибки», который дает некоторое объяснение об успешном/неудачном соединении. Код ошибки «ноль» означает: Нет ошибки. Другие коды ошибок (это выдержка из https://curl.haxx.se/libcurl/c/libcurl-errors.html):
КОД ОШИБКИ | КРАТКОЕ ОПИСАНИЕ | ПОЛНОЕ ОПИСАНИЕ |
0 | ОК | Все в порядке. Действуйте как обычно. |
1 | НЕПОДДЕРЖИВАЕМЫЙ_ПРОТОКОЛ | URL-адрес, который вы передали libcurl, использовал протокол, который этот «curl.exe» не поддерживает. это может быть строка протокола с ошибкой или просто протокол, для которого curl не имеет кода. |
2 | FAILED_INIT | Сбой очень раннего кода инициализации. Скорее всего, это внутренняя ошибка или проблема, либо проблема с ресурсами, когда что-то фундаментальное не может быть выполнено во время инициализации. |
3 | URL_MALFORMAT | URL-адрес имеет неправильный формат. |
4 | НЕ ВСТРОЕН | Запрашиваемая функция, протокол или параметр не были встроены в этот curl.exe. Это означает, что функция или параметр не были включены или явно отключены при сборке curl.exe, и чтобы заставить его работать, вам необходимо загрузить другой исполняемый файл «curl.exe». |
5 | МОЖЕТ_РАЗРЕШИТЬ_ПРОКСИ | Не удалось разрешить прокси. Данный прокси-хост не может быть разрешен. |
6 | МОЖЕТ_РАЗРЕШИТЬ_ХОСТ | Не удалось разрешить хост. Данный удаленный хост не был разрешен. |
7 | НЕВОЗМОЖНО_СОЕДИНИТЬ | Не удалось подключиться() к хосту или прокси. |
8 | FTP_WEIRD_SERVER_REPLY | Сервер отправил данные, которые libcurl не удалось проанализировать. Этот код ошибки используется не только для FTP и имеет псевдоним CURLE_WEIRD_SERVER_REPLY, начиная с версии 7.51.0. |
9 | REMOTE_ACCESS_DENIED | Нам было отказано в доступе к ресурсу, указанному в URL. Для FTP это происходит при попытке перейти в удаленный каталог. |
10 | FTP_ACCEPT_FAILED | При ожидании обратного подключения сервера при использовании активного сеанса FTP код ошибки был отправлен по управляющему соединению или аналогичному. |
11 | FTP_WEIRD_PASS_REPLY | После отправки пароля FTP на сервер libcurl ожидает надлежащего ответа. Этот код ошибки указывает на то, что был возвращен неожиданный код. |
12 | FTP_ACCEPT_TIMEOUT | Во время активного сеанса FTP во время ожидания подключения сервера истекло время ожидания CURLOPT_ACCEPTTIMEOUT_MS (или внутреннее значение по умолчанию). |
13 | FTP_WEIRD_PASV_REPLY | libcurl не удалось получить разумный результат от сервера в ответ на команду PASV или EPSV. Сервер глючит. |
14 | FTP_WEIRD_227_FORMAT | FTP-серверы возвращают 227-строчный ответ на команду PASV. Если libcurl не удается разобрать эту строку, этот код возврата передается обратно. |
15 | FTP_CANT_GET_HOST | Внутренняя ошибка при поиске хоста, используемого для нового подключения. |
16 | HTTP2 | Обнаружена проблема на уровне кадрирования HTTP2. Это несколько общее и может быть одной из нескольких проблем, подробности см. в буфере ошибок. |
17 | FTP_COULDNT_SET_TYPE | Получена ошибка при попытке установить двоичный режим передачи или ASCII. |
18 | ЧАСТИЧНЫЙ_ФАЙЛ | Передача файла оказалась короче или больше, чем ожидалось. Это происходит, когда сервер сначала сообщает об ожидаемом размере передачи, а затем доставляет данные, которые не соответствуют ранее заданному размеру. |
19 | FTP_COULDNT_RETR_FILE | Это был либо странный ответ на команду ‘RETR’, либо завершена передача нулевого байта. |
21 | QUOTE_ERROR | При отправке пользовательских команд «QUOTE» на удаленный сервер одна из команд возвращала код ошибки 400 или выше (для FTP) или иным образом указывала на неудачное выполнение команды. |
22 | HTTP_RETURNED_ERROR | Возвращается, если CURLOPT_FAILONERROR имеет значение TRUE, а HTTP-сервер возвращает код ошибки >= 400. |
23 | ЗАПИСЬ_ОШИБКА | Произошла ошибка при записи полученных данных в локальный файл, или ошибка была возвращена в libcurl из обратного вызова записи. |
25 | UPLOAD_FAILED | Не удалось начать загрузку. Для FTP сервер обычно отклонял команду STOR. Буфер ошибок обычно содержит объяснение сервера по этому поводу. |
26 | ЧТЕНИЕ_ОШИБКА | Возникла проблема чтения локального файла или ошибка, возвращенная обратным вызовом чтения. |
27 | OUT_OF_MEMORY | Не удалось выполнить запрос на выделение памяти. Это серьезное зло, и все сильно облажается, если это когда-либо произойдет. |
28 | ОПЕРАЦИЯ_TIMEDOUT | Тайм-аут операции. Указанный период тайм-аута был достигнут в соответствии с условиями. |
30 | FTP_PORT_FAILED | Команда FTP PORT вернула ошибку. В основном это происходит, когда вы не указали достаточно хороший адрес для использования libcurl. См. CURLOPT_FTPPORT. |
31 | FTP_COULDNT_USE_REST | Команда FTP REST вернула ошибку. Этого никогда не должно происходить, если сервер в здравом уме. |
33 | ДИАПАЗОН_ОШИБКА | Сервер не поддерживает и не принимает запросы диапазона. |
34 | HTTP_POST_ERROR | Это странная ошибка, которая в основном возникает из-за внутренней путаницы. |
35 | SSL_CONNECT_ERROR | Произошла ошибка где-то в рукопожатии SSL/TLS. Вам действительно нужен буфер ошибок и прочтите там сообщение, так как оно немного больше указывает на проблему. Это могут быть сертификаты (форматы файлов, пути, разрешения), пароли и другие. |
36 | BAD_DOWNLOAD_RESUME | Не удалось возобновить загрузку, так как указанное смещение вышло за границы файла. |
37 | ФАЙЛ_КОУЛДНТ_ЧИТАТЬ_ФАЙЛ | Не удалось открыть файл, заданный с помощью FILE://. Скорее всего, потому что путь к файлу не идентифицирует существующий файл. Вы проверяли права доступа к файлам? |
38 | LDAP_CANNOT_BIND | LDAP не может выполнить привязку. Сбой операции привязки LDAP. |
39 | LDAP_SEARCH_FAILED | Ошибка поиска LDAP. |
41 | ФУНКЦИЯ_НЕ НАЙДЕНА | Функция не найдена. Требуемая функция zlib не найдена. |
42 | ABORTED_BY_CALLBACK | Прервано обратным вызовом. Обратный вызов вернул libcurl «отмена». |
43 | ПЛОХОЙ_ФУНКЦИОНАЛЬНЫЙ_АРГУМЕНТ | Внутренняя ошибка. Функция была вызвана с неверным параметром. |
45 | ИНТЕРФЕЙС_ОШИБКА | Ошибка интерфейса. Не удалось использовать указанный исходящий интерфейс. Укажите, какой интерфейс использовать для IP-адреса источника исходящих подключений, с помощью CURLOPT_INTERFACE. |
47 | TOO_MANY_REDIRECTS | Слишком много перенаправлений. При следовании перенаправлениям libcurl достигает максимальной суммы. Установите лимит с помощью CURLOPT_MAXREDIRS. |
48 | НЕИЗВЕСТНАЯ_ОПЦИЯ | Параметр, переданный libcurl, не распознан/неизвестен. См. соответствующую документацию. Скорее всего проблема в программе, которая использует libcurl. Буфер ошибок может содержать более конкретную информацию о том, к какому именно параметру он относится. |
49 | TELNET_OPTION_SYNTAX | Строка параметров telnet имеет недопустимый формат. |
51 | PEER_FAILED_VERIFICATION | SSL-сертификат удаленного сервера или отпечаток пальца SSH md5 признаны несоответствующими. |
52 | GOT_NOTHING | С сервера ничего не было возвращено, и в данных обстоятельствах получение ничего не считается ошибкой. |
53 | SSL_ENGINE_NOTFOUND | Указанный механизм шифрования не найден. |
54 | SSL_ENGINE_SETFAILED | Не удалось установить выбранный механизм шифрования SSL по умолчанию! |
55 | ОТПРАВИТЬ_ОШИБКА | Ошибка отправки сетевых данных. |
56 | RECV_ERROR | Сбой при получении сетевых данных. |
58 | ПРОБЛЕМА SSL_CERT | проблема с сертификатом локального клиента. |
59 | SSL_CIPHER | Не удалось использовать указанный шифр. |
60 | SSL_CACERT | Сертификат узла не может быть аутентифицирован известными сертификатами ЦС. |
61 | BAD_CONTENT_ENCODING | Нераспознанное кодирование передачи. |
62 | LDAP_INVALID_URL | Недопустимый URL-адрес LDAP. |
63 | FILESIZE_EXCEEDED | Превышен максимальный размер файла. |
64 | USE_SSL_FAILED | Запрошенный уровень FTP SSL не выполнен. |
65 | ОТПРАВИТЬ_FAIL_REWIND | При выполнении операции отправки curl должен был перемотать данные для повторной передачи, но операция перемотки не удалась. |
66 | SSL_ENGINE_INITFAILED | Не удалось запустить механизм SSL. |
67 | LOGIN_DENIED | Удаленный сервер отказал curl в входе в систему (добавлено в 7.13.1) |
68 | TFTP_NOTFOUND | Файл не найден на сервере TFTP. |
69 | TFTP_PERM | Проблема с правами доступа на TFTP-сервере. |
70 | REMOTE_DISK_FULL | Недостаточно места на сервере. |
71 | TFTP_ILLEGAL | Недопустимая операция TFTP. |
72 | TFTP_UNKNOWNID | Неизвестный идентификатор передачи TFTP. |
73 | REMOTE_FILE_EXISTS | Файл уже существует и не будет перезаписан. |
74 | TFTP_NOSUCHUSER | Эта ошибка никогда не должна возвращаться правильно работающим сервером TFTP. |
75 | CONV_FAILED | Ошибка преобразования символов. |
76 | CONV_REQD | Вызывающий абонент должен зарегистрировать обратные вызовы преобразования. |
77 | SSL_CACERT_BADFILE | Проблема с чтением сертификата SSL CA (путь? права доступа?) |
78 | REMOTE_FILE_NOT_FOUND | Ресурс, указанный в URL-адресе, не существует. |
79 | СШ | Неизвестная ошибка во время сеанса SSH. |
80 | SSL_SHUTDOWN_FAILED | Не удалось закрыть соединение SSL. |
81 | СНОВА | Сокет не готов к отправке/получению Подождите, пока он будет готов, и повторите попытку. Этот код возврата возвращается только из curl_easy_recv и curl_easy_send (добавлено в 7. 18.2) |
82 | SSL_CRL_BADFILE | Не удалось загрузить файл CRL (добавлено в версии 7.19.0) |
83 | SSL_ISSUER_ERROR | Ошибка проверки эмитента (добавлено в 7.19.0) |
84 | FTP_PRET_FAILED | FTP-сервер вообще не понимает команду PRET или не поддерживает данный аргумент. Будьте осторожны при использовании CURLOPT_CUSTOMREQUEST, пользовательская команда LIST также будет отправлена с PRET CMD перед PASV. (Добавлено в 7.20.0) |
85 | RTSP_CSEQ_ERROR | Несоответствие номеров RTSP CSeq. |
86 | RTSP_SESSION_ERROR | Несоответствие идентификаторов сеанса RTSP. |
87 | FTP_BAD_FILE_LIST | Невозможно проанализировать список файлов FTP (во время загрузки подстановочных знаков FTP). |
88 | CHUNK_FAILED | Обратный вызов фрагмента сообщил об ошибке. |
89 | НЕТ_СОЕДИНЕНИЯ_ДОСТУПНО | (только для внутреннего использования, никогда не будет возвращено libcurl) Соединение недоступно, сеанс будет поставлен в очередь. (добавлено в 7.30.0) |
90 | SSL_PINNEDPUBKEYNOTMATCH | Не удалось сопоставить закрепленный ключ, указанный с помощью CURLOPT_PINNEDPUBLICKEY. |
91 | SSL_INVALIDCERTSTATUS | Состояние вернуло ошибку при запросе с помощью CURLOPT_SSL_VERIFYSTATUS. |
92 | HTTP2_STREAM | Ошибка потока на уровне кадрирования HTTP/2. |
Получение curl для вывода кода состояния HTTP?
спросил
Изменено
4 месяца назад
Просмотрено
2,1 млн раз
Я использую curl
в командной строке Linux для отправки HTTP-запросов. Тела ответов распечатываются по стандарту, и это нормально, но я не вижу на странице руководства, как получить curl для печати кода состояния HTTP из ответа (404, 403 и т. д.). Это возможно?
- http
- curl
- статус
4
Это должно работать для вас если веб-сервер может отвечать на запросы HEAD (это не будет выполнять 1208 GET запрос):
curl -I http://www.example.org
В качестве дополнения, чтобы cURL следовал за перенаправлениями (статусы 3xx), добавьте -L
.
12
Более конкретный способ распечатать просто код состояния HTTP выглядит примерно так:
curl -s -o /dev/null -w "%{http_code}" http://www.example. орг/
Намного проще работать в скриптах, так как не требует синтаксического анализа 🙂
Параметр -I
может быть добавлен для улучшения производительности загрузки ответов. Это изменит вызов на вызов HEAD
, который будет извлекать только служебные данные ответа, без тела.
Примечание: %{http_code}
возвращает первую строку полезных данных HTTP (доступные переменные для параметра -w
на странице документации curl
)
т.е.:
curl - с-о / dev /null -I -w "%{http_code}" http://www.example.org/
21
Вы можете распечатать код состояния в дополнение ко всем заголовкам, выполнив следующие действия:
curl -i http://example.org
Преимущество -i
в том, что он работает и с -X POST
.
7
Если вы хотите увидеть заголовок, а также результат, вы можете использовать подробный параметр:
curl -v http://www.example.org curl --verbose http://www.example.org
Статус появится в шапке. Например.
< Дата: вторник, 04 ноября 2014 г. , 19:12:59 по Гринвичу < Тип содержимого: приложение/json; кодировка = utf-8 < Статус: 422 Необрабатываемый объект
4
Если вы хотите зафиксировать код состояния HTTP в переменной, но при этом перенаправить содержимое в STDOUT, вы должны создать два STDOUT. Вы можете сделать это с помощью замены процесса >() и замены команды $().
Сначала создайте файловый дескриптор 3
для вашего текущего процесса STDOUT с exec 3>&1
.
Затем используйте параметр curl -o
, чтобы перенаправить содержимое ответа во временный fifo с помощью подстановки команд, а затем в рамках этой подстановки команд перенаправьте вывод обратно в дескриптор файла STDOUT текущего процесса 3
с -o >( кот >&3)
.
Собираем все вместе в bash
3.2.57(1) — выпуск
(стандарт для macOS
):
# создает новый файловый дескриптор 3, который перенаправляет на 1 (STDOUT) выполнить 3>&1 # Запускаем curl в отдельной команде, записывая вывод -w "%{http_code}" в HTTP_STATUS # и отправить содержимое в STDOUT этой команды с помощью -o >(cat >&3) HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example. com')
Обратите внимание, что это не работает в /bin/sh
, как отметил SamK в комментариях ниже.
8
Переопределить вывод curl:
curl -sw '%{http_code}' http://example.org
Может использоваться с любым типом запроса.
2
Код состояния ТОЛЬКО
[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s [0]$ 200
Все кредиты этого GIST
2
Это болезненный завиток --fail
ограничение. Из мужской завиток
:
-f, --сбой
(HTTP) Автоматический сбой (вообще нет вывода) при ошибках сервера
Но невозможно получить как ненулевой код возврата , так и тело ответа в стандартном выводе.
Основываясь на ответе pvandenberk и этом другом очень полезном трюке, изученном на SO, вот обходной путь:
curl_with_error_code () { _curl_with_error_code "$@" | sed '$d' } _curl_with_error_code () { локальный curl_error_code http_code выполнение 17>&1 http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1) curl_error_code=$? выполнение 17>&- если [ $curl_error_code -ne 0 ]; затем вернуть $curl_error_code фи если [$http_code -ge 400] && [$http_code -lt 600]; затем echo "HTTP $http_code" >&2 вернуться 127 фи }
Эта функция ведет себя точно так же, как curl
, но возвращает 127 (код возврата, не используемый curl
) в случае HTTP-кода в диапазоне [400, 600[.
3
Это отправит запрос на URL, получит только первую строку ответа, разделит ее на блоки и выберет вторую.
Содержит код ответа
curl -I http://example.org 2>/dev/null | голова -n 1 | вырезать -d$'' -f2
2
Для запроса POST сработало следующее:
curl -w 'RESP_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]'
Используйте следующую команду cURL и передайте ее в grep следующим образом:
$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP/1.1"
Вот что делает каждый флаг:
-
-I
: Показать только заголовки ответа -
-s
: Без звука - Не показывать индикатор выполнения -
-L
: СледуйтеМестоположение:
заголовки
Вот ссылка на коды состояния HTTP.
Запуск из командной строки. Этот curl работает в тихом режиме, следует любым перенаправлениям, получает заголовки HTTP. grep выведет код состояния HTTP на стандартный вывод.
Вот некоторая команда curl, которая использует GET
и возвращает код HTTP.
curl -so /dev/null -w '%{код_ответа}' http://www.example.org
Помните, что в приведенном ниже подходе используется HEAD
, что быстрее, но может плохо работать с некоторыми HTTP-серверами, несовместимыми с Интернетом.
curl-I http://www.example.org
2
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
Будет возвращена следующая информация:
- данные ответа, если какие-либо данные возвращаются API, например ошибка
- код состояния
2
Пример использования кодов ответов. Я использую это для повторной загрузки баз данных Geolite, только если они изменились ( -z
), а также следующие перенаправления ( -L
):
url=http://example. com/file.gz файл=$(базовое имя $url) ответ=$(curl -L -s -o $file -z $file $url -w "%{http_code}") case "$response" в 200) сделать что-то ;; 301) сделать что-то ;; 304) printf "Получено: ответ HTTP $ (файл без изменений) ==> $url\n" ;; 404) printf "Получено: ответ HTTP $ (файл не найден) ==> $url\n" ;; *) printf "Получено: HTTP $response ==> $url\n" ;; эсак
Разделить вывод содержимого на stdout
и код состояния HTTP на stderr
:
curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1> &2
Если для stderr требуется только код состояния HTTP, можно использовать --silent
:
curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code }\n" 1>&2
Затем нужный поток можно выбрать, перенаправив нежелательный на /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 ...
Обратите внимание , что для того, чтобы второе перенаправление работало так, как нужно, нам нужно запустить команду curl в подоболочке.
2
OP хочет знать код состояния. Часто при загрузке файла вы также хотите получить представление о его размере, поэтому я сначала использую curl, чтобы показать код состояния и размер файла, а затем отключить подробный и направить файл в нужное место и имя:
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
Затем я жду завершения завитка
ждать ${!}
, прежде чем я выполню следующую команду. Вышеприведенное при использовании в сценарии многих команд, подобных приведенным выше, дает хороший ответ, например:
.
http: 200 42824
http: 200 34728
http: 200 35452
Обратите внимание, что за -o в curl должен следовать полный путь к файлу + имя файла. Это позволяет вам таким образом сохранять файлы в разумной структуре имен, когда вы выполняете их d/l с помощью curl. Также обратите внимание, что совместное использование -s и -S отключает вывод, но показывает ошибки. Также обратите внимание, что -R пытается установить временную метку файла на временную метку веб-файла. 9[ \t]*//'
- 2>&1: ошибка сохраняется в выходных данных для синтаксического анализа
- grep: отфильтровать строку кода ответа из вывода
- awk: отфильтровывает код ответа из строки кода ответа
- sed: удаляет все начальные пробелы
.
Существует еще один способ использования команды Powershell, которая является псевдонимом curl.exe.
Просто введите следующее:
(Invoke-WebRequest -Uri https://your.website).StatusCode
В Windows PowerShell:
curl https:\\www.example.org -Method HEAD
На самом деле это просто псевдоним для Invoke-WebRequest
.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.