- Примеры использования cURL в PHP
- GET запрос
- GET-запрос с параметрами
- POST запрос
- Отправка JSON через POST-запрос
- PUT запрос
- DELETE запрос
- Запрос через proxy
- Отправка файлов на другой сервер
- До PHP 5.5
- Скачивание файлов
- Отправить и получить cookie
- Имитация браузера
- HTTP авторизация
- Basic Authorization
- OAuth авторизация
- Получить HTTP код ответа сервера
- Если CURL возвращает false
- Как сделать post запрос xml?
- How to Send XML Data to API With Curl PHP
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS. Библиотека используется для получения данных в виде XML, JSON и непосредственно в HTML, парсинга, загрузки и передачи файлов и т.д.
GET запрос
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;
GET-запрос с параметрами
$get = array( 'name' => 'Alex', 'email' => 'mail@example.com' ); $ch = curl_init('https://example.com?' . http_build_query($get)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;
POST запрос
$array = array( 'login' => 'admin', 'password' => '1234' ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;
Отправка JSON через POST-запрос
$data = array( 'name' => 'Маффин', 'price' => 100.0 ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_encode($res, JSON_UNESCAPED_UNICODE); print_r($res);
PUT запрос
HTTP-метод PUT используется в REST API для обновления данных.
$data = array( 'name' => 'Маффин', 'price' => 100.0 ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;
DELETE запрос
HTTP-метод DELETE используется в REST API для удаления объектов.
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);
Запрос через proxy
$proxy = '165.22.115.179:8080'; $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_TIMEOUT, 400); curl_setopt($ch, CURLOPT_PROXY, $proxy); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);
Отправка файлов на другой сервер
Отправка файлов осуществляется методом POST :
До PHP 5.5
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => '@' . __DIR__ . '/image.png'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);
С PHP 5.5 следует применять CURLFile.
$curl_file = curl_file_create(__DIR__ . '/image.png', 'image/png' , 'image.png'); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => $curl_file)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch);
Также через curl можно отправить сразу несколько файлов:
$curl_files = array( 'photo[0]' => curl_file_create(__DIR__ . '/image.png', 'image/png' , 'image.png'), 'photo[1]' => curl_file_create(__DIR__ . '/image-2.png', 'image/png' , 'image-2.png') ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_files); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch);
Ещё файлы можно отправить методом PUT , например так загружаются файлы в REST API Яндекс Диска.
$file = __DIR__ . '/image.jpg'; $fp = fopen($file, 'r'); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_PUT, true); curl_setopt($ch, CURLOPT_UPLOAD, true); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file)); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);
Скачивание файлов
Curl позволяет сохранить результат сразу в файл, указав указатель на открытый файл в параметре CURLOPT_FILE .
$file_name = __DIR__ . '/file.html'; $file = @fopen($file_name, 'w'); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_FILE, $file); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch); fclose($file);
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); file_put_contents(__DIR__ . '/file.html', $html);
Отправить и получить cookie
Чтобы CURL сохранял куки в файле достаточно прописать его путь в параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR .
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);
Передать значение кук можно принудительно через параметр CURLOPT_COOKIE .
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=61445603b6a0809b061080ed4bb93da3'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);
Имитация браузера
На многих сайтах есть защита от парсинга. Она основана на том что браузер передает серверу user agent , referer , cookie . Сервер проверяет эти данные и возвращает нормальную страницу. При подключение через curl эти данные не передаются и сервер отдает ошибку 404 или 500. Чтобы имитировать браузер нужно добавить заголовки:
$headers = array( 'cache-control: max-age=0', 'upgrade-insecure-requests: 1', 'user-agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', 'sec-fetch-user: ?1', 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'x-compress: null', 'sec-fetch-site: none', 'sec-fetch-mode: navigate', 'accept-encoding: deflate, br', 'accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7', ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, true); $html = curl_exec($ch); curl_close($ch); echo $html;
HTTP авторизация
Basic Authorization
Если на сервере настроена HTTP авторизация, например с помощью .htpasswd, подключится к нему можно с помощью параметра CURLOPT_USERPWD .
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_USERPWD, 'login:password'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;
OAuth авторизация
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth TOKEN')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;
Получить HTTP код ответа сервера
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $http_code; // Выведет: 200
Если CURL возвращает false
Какая произошла ошибка можно узнать с помощью функции curl_errno() .
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); $res = curl_exec($ch); var_dump($res); // false if ($errno = curl_errno($ch)) < $message = curl_strerror($errno); echo "cURL error ():\n "; // Выведет: cURL error (35): SSL connect error > curl_close($ch);
Как сделать post запрос xml?
Следует выполнить POST запрос на добавление нового подписчика из xml и вывести результат (ответное xml).
Как это реализовать? curl?
Прочитал темы по сабжу, но, видимо, не все понял. можно на моем примере пояснить?
POST не может быть безымянным, должно быть поле в котором будут переданы данные, в вашем случае это xml. Не совсем понятна суть, вам надо решить вопрос с какой стороны сервера или клиента апи?
т.е. у меня на сайте стоит форма. в ней поля — Имя, Email и checkbox получать рассылку или нет
если стоит галочка получать рассылку, то в mysite.com/api/
нужно послать xml запрос методом post с текстом (указанным выше)
$ch = curl_init(); $data = array('request' => $xml); curl_setopt($ch, CURLOPT_URL, "http://mysite.com/api/"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response=curl_exec($ch); curl_close($ch); print_r($response);
$data = array('request' => $xml,'Content-Type: text/xml; charset=utf-8');
$ch = curl_init(); $data = array('Content-Type: text/xml; charset=utf-8'); curl_setopt($ch, CURLOPT_URL, "http://mysite.com/api/api?"+$xml); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response=curl_exec($ch); curl_close($ch); print_r($response);
xxxx AddAndUpdate false 1 aa@aa.aa name '; $ch = curl_init(); $data = array('Content-Type: text/xml; charset=utf-8'); curl_setopt($ch, CURLOPT_URL, "https://mysite.com/api?"+$xml); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response=curl_exec($ch); curl_close($ch); print_r($response); ?>
однако, есть пример на c# (asp), реализующий то же самое. Он рабочий.
WebRequest request = WebRequest.Create("https://mysite.com/api"); request.Method = "POST"; string postData = @" xxxx AddAndUpdate false 1 aa@aa.aa name "; byte[] byteArray = Encoding.UTF8.GetBytes(postData); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); try < WebResponse response = request.GetResponse(); >catch (WebException ex) < // using (Stream data = ex.Response.GetResponseStream()) // < // string text = new StreamReader(data).ReadToEnd(); // Response.Write("
" + text); // > >
и почему-то в мануале написано про контент тайп text/xml, а в примере application/x-www-form-urlencoded
MrBlack, curl_setopt($ch, CURLOPT_POSTFIELDS, $data); замените на curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); , и добавьте curl_setopt($ch, CURLOPT_HTTPHEADER, array($xml);
How to Send XML Data to API With Curl PHP
Being a web developer you must need to know how to send data to API in PHP. We send data to web services using curl in PHP programming language. In this tutorial, we will see how to send XML Data to web services using curl in PHP.
In API integration, we need to send request to web services and receive response. So let us see how to send XML Data to API with PHP curl or how to send xml data to web api or how to post xml data to web app or how to post xml data to url in php.
'; $url https://www.website.com/ws" target="_blank" rel="noopener">https://www.website.com/ws"; $ch = curl_init(); if (!$ch) < die("Couldn't initialize a cURL handle"); >curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $result = curl_exec($ch); // execute echo $result; //show response curl_close($ch); ?> Rahul kumar 10 5th 25