- Основы библиотеки cURL PHP
- Настройка параметров сеанса
- Простой GET-запрос
- Простой POST-запрос
- Обработка исключений/ошибок
- Пример POST-запроса с телом формате JSON, обработкой исключений, и обработкой ответа от сервера
- Проверка SSL-сертификата
- Аутентификация на сервере
- ИТОГ
- Как передать данные из формы через cURL?
Основы библиотеки cURL PHP
cURL — библиотека с открытым исходным кодом, используемая для отправки HTTP-запросов с различных языков программирования, включая C, PHP и другие.
cURL также является программой командной строки, позволяющая взаимодействовать с множеством различных серверов.
Libcurl — это библиотека API для передачи, которую разработчики могут встроить в свои программы; cURL действует как автономная обёртка для библиотеки libcurl. Для libcurl имеются модули интеграции для работы с более чем 30 языками программирования.
cURL работает по множеству различных протоколов с синтаксисом URL. В данной статье рассмотрена работа библиотеки по протоколу HTTP/HTTPS.
Модуль PHP cURL обычно включён по умолчанию. Если это не так, то в файле php.ini уберите точку с запятой (;) у строки extension=php_curl.dll.
Настройка параметров сеанса
Для установки параметра сеанса cURL используется функция curl_setopt.
- handle — дескриптор cURL, полученный из curl_init().
- option — параметр сеанса в виде CURLOPT_XXX.
- value — значение параметра option.
Функция возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Сразу несколько параметров сеанса можно установить с помощью функции curl_setopt_array.
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-запрос
Простой POST-запрос
Чтобы сделать POST-запрос, нужно установить параметры CURLOPT_POST и CURLOPT_POSTFIELDS.
Существует несколько форматов тела запроса:
Для построения строки запроса используется функция http_build_query.
Для отправки файлов в тело запроса применяется класс 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, обработкой исключений, и обработкой ответа от сервера
'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-аутентификации, используемой для запроса.
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;
- аутентификация пользователей.
Как передать данные из формы через cURL?
Пытался всяко разно сделать передачу данных из формы на сайт (api) через curl, но видимо что-то не так понимаю в этой библиотеке, хоть примеров и много в интернете. Можете подсказать, как передать их? Заранее благодарю <3
3<>
Справка о периоде обучения
$(function () < $('.reference-link').magnificPopup(); $('.groups').change(function () < let gid = $(this).val(); let form = $(this).closest('form'); $.ajax(< url: 'data.php', method: 'post', data: >).done(function (obiturient) < console.log(obiturient); obiturient = JSON.parse(obiturient); form.find('[name="obiturients"]').empty(); obiturient.forEach(function (obiturient) < form.find('[name="obiturients"]').append('') >) >) >) >)
query("SELECT * FROM `obiturient` WHERE `group_id`= " . $_POST['gid']); $obiturient = $stmt->fetch_all(MYSQLI_ASSOC); echo json_encode($obiturient); > function loadGroups()< global $groups; $connection = new mysqli('localhost', 'root', 'root', 'rups'); $stmt = $connection->query("SELECT * FROM `groups`"); $groups = $stmt->fetch_all(MYSQLI_ASSOC); return $groups; >
$curl = curl_init(); //инициализация сеанса curl_setopt($curl, CURLOPT_URL, 'http://diplom/example.php'); //урл сайта к которому обращаемся curl_setopt($curl, CURLOPT_HEADER, 1); //выводим заголовки curl_setopt($curl, CURLOPT_POST, 1); //передача данных методом POST curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //теперь curl вернет нам ответ, а не выведет curl_setopt($curl, CURLOPT_POSTFIELDS, //тут переменные которые будут переданы методом POST array ( 'obiturients'=>$_POST['obiturients'], )); curl_setopt($curl, CURLOPT_USERAGENT, 'MSIE 5'); //эта строчка как-бы говорит: "я не скрипт, я IE5" :) curl_setopt ($curl, CURLOPT_REFERER, "http://ya.ru"); //а вдруг там проверяют наличие рефера $res = curl_exec($curl); curl_close($curl);
из второго бокса формы , но у меня не получилось вытащить value по примерам из интернета и отправить это значение. Еще раз благодарю заранее за Вашу помощь.
Скриншот того, что мы получаем при отправке:
Ну и самое главное, я не понимаю, данные отправляются вообще через cURl, или же нет? Всем спасибо за ответ и помощь заранее.