Использование curl для выполнения запросов rest api
Содержание:
- Формы
- PHP cURL multiple async requests
- URL
- Как пользоваться curl?
- Несколько примеров на Guzzle
- Запрос GET
- Типсы и триксы cURL
- Описание cURL и первые шаги
- Отправить и получить cookie
- Пару слов о других полезных опциях cURL
- POST и GET запросы без cURL
- curl examples
- 1. HTTP request
- 3. Saving the result of a curl command
- 4. Adding an additional HTTP request header
- 5. Generating additional information
- 6. Resuming a download
- 7. Storing HTTP headers
- 8. Testing the download time of an asset without any output
- 9. Specifying a maximum transfer rate
- 10. HTTP/2 support check
- 11. Retrieving a particular byte-range
Формы
Формы — основной способ представления web-сайта как HTML-страницы
с полями, в которые пользователь вводит данные, и затем нажимает на
кнопку ‘OK’ или ‘Отправить’, после чего данные отсылаются на сервер.
Затем сервер использует принятые данные и решает, как действовать
дальше: искать информацию в базе данных, показать введенный адрес на
карте, добавить сообщение об ошибке или использовать информацию для
аутентификации пользователя. Разумеется, на стороне сервера имеется
какая-то программа, которая принимает ваши данные.
4.1 GET
GET-форма использует метод GET, например следующим образом:
<form method="GET" action="junk.cgi"> <input type=text name="birthyear"> <input type=submit name=press value="OK"> </form>
Если вы откроете этот код в вашем браузере, вы увидите форму с
текстовым полем и кнопку с надписью «OK». Если вы введете
‘1905’ и нажмете OK, браузер создаст новый URL, по которому и
проследует. URL будет представляться строкой, состоящей из пути
предыдущего URL и строки, подобной
«junk.cgi?birthyear=1905&press=OK».
Например, если форма располагалась по адресу
«www.hotmail.com/when/birth.html», то при нажатии на кнопку
OK вы попадете на URL
«www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK».
Большинство поисковых систем работают таким образом.
Чтобы curl сформировал GET-запрос, просто введите то, что
ожидалось от формы:
# curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
4.2 POST
Метод GET приводит к тому, что вся введенная информация
отображается в адресной строке вашего браузера. Может быть это
хорошо, когда вам нужно добавить страницу в закладки, но это
очевидный недостаток, когда вы вводите в поля формы секретную
информацию, либо когда объем информации, вводимый в поля, слишком
велик (что приводит к нечитаемому URL).
Протокол HTTP предоставляет метод POST. С помощью него клиент
отправляет данные отдельно от URL и поэтому вы не увидете их в
адресной строке.
Форма, генерирующая POST-запрос, похожа на предыдущую:
<form method="POST" action="junk.cgi"> <input type=text name="birthyear"> <input type=submit name=press value=" OK "> </form>
Curl может сформировать POST-запрос с теми же данными следующим
образом:
# curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi
Этот POST-запрос использует ‘Content-Type
application/x-www-form-urlencoded’, это самый широко используемый
способ.
Данные, которые вы отправляете к серверу, должны быть правильно
закодированы, curl не будет делать это за вас. К примеру, если вы
хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел
на %20 и т.п. Недостаток внимания к этому вопросу — частая ошибка,
из-за чего данные передаются не так, как надо.
4.3 Загрузка файлов с помощью POST (File Upload POST)
В далеком 1995 был определен дополнительный способ передавать
данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ
иногда называют RFC1867-posting.
Этот метод в основном разработан для лучшей поддержки загрузки
файлов. Форма, которая позволяет пользователю загрузить файл,
выглядит на HTML примерно следующим образом:
<form method="POST" enctype='multipart/form-data' action="upload.cgi"> <input type=file name=upload> <input type=submit name=press value="OK"> </form>
Заметьте, что тип содержимого Content-Type установлен в
multipart/form-data.
Чтобы отослать данные в такую форму с помощью curl, введите
команду:
# curl -F upload=@localfilename -F press=OK
4.4 Скрытые поля
Обычный способ для передачи информации о состоянии в
HTML-приложениях — использование скрытых полей в формах. Скрытые поля
не заполняются, они невидимы для пользователя и передаются так же,
как и обычные поля.
Простой пример формы с одним видимым полем, одним скрытым и
кнопкой ОК:
<form method="POST" action="foobar.cgi"> <input type=text name="birthyear"> <input type=hidden name="person" value="daniel"> <input type=submit name="press" value="OK"> </form>
Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о
том, скрытое поле или нет. Для curl они все одинаковы:
# curl -d "birthyear=1905&press=OK&person=daniel"
4.5 Узнать, как выглядит POST-запрос
Когда вы хотите заполнить форму и отослать данные на сервер с
помощью curl, вы наверняка хотите, чтобы POST-запрос выглядел точно
также, как и выполненный с помощью браузера.
Простой способ увидеть свой POST-запрос, это сохранить
HTML-страницу с формой на диск, изменить метод на GET, и нажать
кнопку ‘Отправить’ (вы можете также изменить URL, которому будет
передаваться данные).
Вы увидите, что данные присоединились к URL, отделенные символами
‘?’, как и предполагается при использовании GET-форм.
PHP cURL multiple async requests
The function creates a new multi handle, which
allows the processing of multiple cURL handles asynchronously.
multi_async.php
<?php $urls = [ "http://webcode.me", "https://example.com", "http://httpbin.org", "https://www.perl.org" ]; $options = ; $mh = curl_multi_init(); $chs = []; foreach ($urls as $url) { $ch = curl_init($url); curl_setopt_array($ch, $options); curl_multi_add_handle($mh, $ch); $chs[] = $ch; } $running = false; do { curl_multi_exec($mh, $running); } while ($running); foreach ($chs as $h) { curl_multi_remove_handle($mh, $h); } curl_multi_close($mh); foreach ($chs as $h) { $status = curl_getinfo($h, CURLINFO_RESPONSE_CODE); echo $status . "\n"; } foreach ($chs as $h) { echo "----------------------\n"; echo curl_multi_getcontent($h); }
In the example, we create asynchronous requests to four websites. We print their
status codes and headers.
$mh = curl_multi_init();
We initiate the multi handle.
foreach ($urls as $url) { $ch = curl_init($url); curl_setopt_array($ch, $options); curl_multi_add_handle($mh, $ch); $chs[] = $ch; }
We create standard handles for each URLs and add them to the multi handle with
.
$running = false; do { curl_multi_exec($mh, $running); } while ($running);
We execute all queries asynchronously, and continue when all are complete.
foreach ($chs as $h) { curl_multi_remove_handle($mh, $h); } curl_multi_close($mh);
We close the handles.
foreach ($chs as $h) { $status = curl_getinfo($h, CURLINFO_RESPONSE_CODE); echo $status . "\n"; }
We get the status codes.
foreach ($chs as $h) { echo "----------------------\n"; echo curl_multi_getcontent($h); }
We get the headers.
$ php multi_req.php 200 200 200 200 ---------------------- HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Mon, 08 Feb 2021 16:37:31 GMT Content-Type: text/html Content-Length: 348 Last-Modified: Sat, 20 Jul 2019 11:49:25 GMT Connection: keep-alive ETag: "5d32ffc5-15c" Accept-Ranges: bytes ---------------------- HTTP/2 200 content-encoding: gzip accept-ranges: bytes age: 285367 cache-control: max-age=604800 content-type: text/html; charset=utf-8 date: Mon, 08 Feb 2021 16:36:11 GMT etag: "3147526947" expires: Mon, 15 Feb 2021 16:36:11 GMT last-modified: Thu, 17 Oct 2019 07:18:26 GMT server: ECS (dcb/7F83) x-cache: HIT content-length: 648 ---------------------- HTTP/1.1 200 OK Date: Mon, 08 Feb 2021 16:36:11 GMT Content-Type: text/html; charset=utf-8 Content-Length: 9593 Connection: keep-alive Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true ---------------------- HTTP/2 200 server: Combust/Plack (Perl) content-type: text/html; charset=utf-8 last-modified: Mon, 08 Feb 2021 15:29:36 GMT x-content-type-options: nosniff x-frame-options: deny x-xss-protection: 1 strict-transport-security: max-age=15768000 via: 1.1 varnish, 1.1 varnish accept-ranges: bytes date: Mon, 08 Feb 2021 16:36:11 GMT age: 2713 x-served-by: cache-lga21948-LGA, cache-vie21642-VIE x-cache: HIT, HIT x-cache-hits: 2, 1 x-timer: S1612802172.507868,VS0,VE1 content-length: 12011
URL
The URL syntax is protocol-dependent. You’ll find a detailed description in RFC 3986.
You can specify multiple URLs or parts of URLs by writing part sets within braces and quoting the URL as in:
«http://site.{one,two,three}.com»
or you can get sequences of alphanumeric series by using [] as in:
«ftp://ftp.example.com/file.txt»
«ftp://ftp.example.com/file.txt» (with leading zeros)
«ftp://ftp.example.com/file.txt»
Nested sequences are not supported, but you can use several ones next to each other:
«http://example.com/archive/vol/part{a,b,c}.html»
You can specify any amount of URLs on the command line. They will be fetched in a sequential manner in the specified order. You can specify command line options and URLs mixed and in any order on the command line.
You can specify a step counter for the ranges to get every Nth number or letter:
«http://example.com/file.txt»
«http://example.com/file.txt»
When using [] or {} sequences when invoked from a command line prompt, you probably have to put the full URL within double quotes to avoid the shell from interfering with it. This also goes for other characters treated special, like for example ‘&’, ‘?’ and ‘*’.
Provide the IPv6 zone index in the URL with an escaped percentage sign and the interface name. Like in
«http:///»
If you specify URL without protocol:// prefix, curl will attempt to guess what protocol you might want. It will then default to HTTP but try other protocols based on often-used host name prefixes. For example, for host names starting with «ftp.» curl will assume you want to speak FTP.
curl will do its best to use what you pass to it as a URL. It is not trying to validate it as a syntactically correct URL by any means but is instead very liberal with what it accepts.
curl will attempt to re-use connections for multiple file transfers, so that getting many files from the same server will not do multiple connects / handshakes. This improves speed. Of course this is only done on files specified on a single command line and cannot be used between separate curl invocations.
Как пользоваться curl?
Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.
Загрузка файлов
Самая частая задача – это загрузка файлов linux. Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:
curl https://raw.githubusercontent.com/curl/curl/master/README.md
Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:
curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md
А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:
curl -O https://raw.githubusercontent.com/curl/curl/master/README.md
Если загрузка была неожиданно прервана, вы можете ее возобновить:
curl -# -C – -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz
Если нужно, одной командой можно скачать несколько файлов:
curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README
Еще одна вещь, которая может быть полезной администратору – это загрузка файла, только если он был изменен:
curl -z 21-Dec-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README
Данная команда скачает файл, только если он был изменен после 21 декабря 2017.
Ограничение скорости
Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:
curl –limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz
Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:
curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md
Передача файлов
Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T:
curl -T login.txt ftp://speedtest.tele2.net/upload/
Или проверим отправку файла по HTTP, для этого существует специальный сервис:
curl -T ~/login.txt http://posttestserver.com/post.php
В ответе утилита сообщит где вы можете найти загруженный файл.
Отправка данных POST
Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:
curl -d “field1=val&fileld2=val1″http://posttestserver.com/post.php
Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:
curl -F “password=@pass;type=text/plain” http://posttestserver.com/post.php
Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.
Передача и прием куки
Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:
curl -c cookie.txt http://posttestserver.com/post.php
Затем можно отправить cookie curl обратно:
curl -b cookie.txt http://posttestserver.com/post.php
Передача и анализ заголовков
Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:
curl -I https://losst.ru
А опция -H позволяет отправить нужный заголовок или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:
curl -I –хедер ‘If-Modified-Since: Mon, 26 Dec 2016 18:13:12 GMT’ https://losst.ru
Аутентификация curl
Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:
curl -u ftpuser:ftppass -T – ftp://ftp.testserver.com/myfile_1.txt
Точно так же будет выполняться аутентификация на серверах HTTP.
Использование прокси
Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:
curl -x proxysever.test.com:3128 http://google.co.in
Несколько примеров на Guzzle
GET запросы на Guzzle
// Создаем клиента с базовым URL $client = new GuzzleHttp\Client(['base_uri' => 'https://foo.com/api/']); // Посылаем запрос на https://foo.com/api/test $response = $client->request('GET', 'test'); // Посылаем запрос на https://foo.com/root $response = $client->request('GET', '/root');
Разные типы запросов на Guzzle
$response = $client->get('http://httpbin.org/get'); $response = $client->delete('http://httpbin.org/delete'); $response = $client->head('http://httpbin.org/get'); $response = $client->options('http://httpbin.org/get'); $response = $client->patch('http://httpbin.org/patch'); $response = $client->post('http://httpbin.org/post'); $response = $client->put('http://httpbin.org/put');
Асинхронные запросы на Guzzle
$promise = $client->getAsync('http://httpbin.org/get'); $promise = $client->deleteAsync('http://httpbin.org/delete'); $promise = $client->headAsync('http://httpbin.org/get'); $promise = $client->optionsAsync('http://httpbin.org/get'); $promise = $client->patchAsync('http://httpbin.org/patch'); $promise = $client->postAsync('http://httpbin.org/post'); $promise = $client->putAsync('http://httpbin.org/put');
Если интересно, то читайте: Guzzle Quick Start
Пишите комментарии, если что-то осталось не понятно.
Помогла ли Вам эта статья?
Да
Нет
Запрос GET
Давайте посмотрим, как использовать Curl для создания запросов GET:
curl_get.php
<?php /** * Проверяем, установлен ли заданный параметр. Если один из указанных параметров * не задан, вызывается die(). * * @param $parameters Параметры, которые проверяются. */ function checkGETParametersOrDie($parameters) { foreach ($parameters as $parameter) { isset($_GET) || die("Please, provide '$parameter' parameter."); } } /** * Получаем параметры GET. * * @return GET строка параметра. */ function stringifyParameters() { $parameters = '?'; foreach ($_GET as $key => $value) { $key = urlencode($key); $value = urlencode($value); $parameters .= "$key=$value&"; } rtrim($parameters, '&'); return $parameters; } /** * Создаем Curl-запрос для заданного URL-адреса. * * @param $url URL-адрес, к которому создается запрос. * @return Curl-запрос к url-адресу; false, если возникает ошибка. */ function createCurlRequest($url) { $curl = curl_init(); if (!$curl) { return false; } $configured = curl_setopt_array($curl, ); if (!$configured) { return false; } return $curl; } // Здесь начинается поток. checkGETParametersOrDie(); $url = $_GET; $curl = createCurlRequest($url); if (!$curl) { die('An error occured: ' . curl_error($curl)); } $result = curl_exec($curl); if (!$result) { die('An error occured: ' . curl_error($curl)); } echo '<div>The result of the cURL request:</div>'; echo '<hr>'; echo $result; curl_close($curl); // Don't forget to close!
Вот, что мы делаем для PHP Curl post запроса:
- Мы создали сессию Curl с помощью функции curl_init(). В случае возникновения ошибки возвращается false, поэтому, прежде чем продолжить, мы должны проверить ее;
- После того, как мы успешно создали сессию Curl, нужно настроить ее с помощью функции curl_setopt_array(). В данном случае мы настроили сессию со следующими параметрами:
Сам URL-адрес. Для запросов GET нужно указать URL-адрес со строкой параметров, в формате key=value
Обратите внимание, как эта строка параметров составлена в функции stringifyParameters(): значения должны быть закодированы с помощью функции urlencode();
Для параметра CURLOPT_FOLLOWLOCATION задается значение true. Это нужно для перехода по HTTP-редиректам 3xx
Если установлено значение false, и для указанного URL-адреса задано перенаправление, мы не сможем достичь конечного (целевого) URL-адреса;
Для параметра CURLOPT_RETURNTRANSFER задается значение true. Это позволяет сохранять HTTP — ответ в переменной;
- Необходимо проверить, не возвращают ли Curl ошибки, проверяя возвращаемые значения функций. Когда получаем значение false, можно получить информацию о последней ошибке для данной сессии Curl с помощью функции curl_error();
- Когда мы закончили обработку сессии Curl, нужно ее закрыть с помощью функции curl_close().
Можно проверить этот скрипт и PHP отправить post запрос, введя, например, в адресной строке браузера localhost/path/to/curl_get.php?url=webcodegeeks.com&s=php.
Типсы и триксы cURL
cURL и получение кукиз помимо CURLOPT_COOKIEJAR
Думаю, уже стало понятно, что cURL правильно обрабатывает куки — сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк.
Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы:
1) Не используем CURLOPT_FOLLOWLOCATION
2) Используем curl_setopt($ch, CURLOPT_HEADER, 1)
3) Собираем кукизы из заголовка header примерно так:
preg_match_all('|Set-Cookie: (.*);|U', $content, $results); $cookies = implode(';', $results);
4) Задаём их используя curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Пожалуйста, все, перестаньте устанавливать настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет актуального комплекта корневых сертификатов CA, загрузите один на веб-сайте curl и сохраните его на ваш сервер:
Затем задайте путь в вашем файле php.ini file, например, на Windows:
curl.cainfo=c:phpcacert.pem
Отключение CURLOPT_SSL_VERIFYPEER позволяет осуществить атаку человек-по-середине (MITM), а это нам не надо!
Описание cURL и первые шаги
Для началом работы с инструментом, его нужно инициализировать. Делается это следующим образом:
$ch = curl_init();
Мы использовали функцию инициализации сессии cURL. При этом, можно задать URL сразу, вот так:
$ch = curl_init('https://myblaze.ru');
А можно сделать это потом, в опциях. Порядок установки опций не имеет значения. Делается это другой функцией:
curl_setopt (resource ch, string option, mixed value)
Приведу пример установки опций как раз на примере URL:
$url = "https://myblaze.ru"; curl_setopt($ch, CURLOPT_URL,$url);
Еще парочка примеров задания опций: давайте получим заголовок ответа сервера, при этом не будем получать саму страницу:
curl_setopt($ch, CURLOPT_HEADER, 1); // читать заголовок curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела
Итак, мы инициализировали сессию, задали нужные нам параметры, теперь выполняем получившийся запрос, закрываем сессию и выводим результат:
$result = curl_exec($ch); curl_close($ch); echo $result;
В итоге получаем наш первый полностью рабочий пример использования библиотеки libcurl:
$ch = curl_init(); $url = "https://myblaze.ru"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // читать заголовок curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела $result = curl_exec($ch); curl_close($ch); echo $result;
Как оно работает, надеюсь, понятно, ведь мы рассмотрели каждый шаг по отдельности 🙂 В результате мы получаем заголовок HTTP ответа от сервера, который чуть ниже обязательно разберем, чтобы лучше понимать все этапы взаимодействия браузера и сервера:
HTTP/1.1 200 OK Server: nginx/1.2.6 Date: Sat, 09 Mar 2013 16:38:39 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Keep-Alive: timeout=10 X-Pingback: https://myblaze.ru/xmlrpc.php 1
Великолепно! Мы получили заголовок ответа от сервера и опробовали библиотеку в действии. Чем это нам полезно? Тем, что теперь вы примерно представляете себе последовательность действий при работе с cURL:
- Инициализировать сессию (curl_init)
- Задать нужные нам опции (curl_setopt)
- Выполнить полученный запрос (curl_exec)
- Завершить сессию (curl_close)
Двигаемся дальше, но перед тем как делать с libcurl что-то более серьезное, как я и обещал, разберем подробно из чего состоит заголовок HTTP запроса к серверу и ответ на него.
Для сохранения куки в файле необходимо указать путь к этому файлу в соответствующих параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR.
$ch = curl_init('https://asgeto.ru'); 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://asgeto.ru'); 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);
Пару слов о других полезных опциях cURL
HTTP Аутентификация
Если на URL адресе есть HTTP аутентификация, то вы без труда можете воспользоваться следующим скриптом:
$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем имя и пароль curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // если перенаправление разрешено curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // то сохраним наши данные в cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);
FTP загрузка
В PHP также существует библиотека для работы с FTP, но вам ничего не мешает и тут воспользоваться средствами cURL:
// открываем файл $file = fopen("/path/to/file", "r"); // в url должно быть следующее содержание $url = "ftp://username:password@mydomain.com:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); // указывам ASCII мод curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ch); curl_close($ch);
Используем Прокси
Вы можете выполнить свой URL запрос через прокси:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://www.example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем адрес curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080'); // если необходимо предоставить имя пользователя и пароль curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass'); $output = curl_exec($ch); curl_close ($ch);
Функции обратного вызова
Также существует возможность указать функцию, которая будет срабатывать ещё до завершения работы cURL запроса. Например, пока содержание ответа загружается, вы можете начать использовать данные, не дожидаясь полной загрузки.
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com'); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); curl_close ($ch); function progress_function($ch,$str) { echo $str; return strlen($str); }
Подобная функция ДОЛЖНА возвращать длину строки, что является обязательным требованием.
POST и GET запросы без cURL
С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.
Пример:
$result = file_get_contents('https://phpstack.ru/');
Теперь у нас в переменной $result записан весь html код главной страницы этого сайта.
Мы совершили GET запрос, а html код — это ответ на него.
При помощи file_get_contents мы также можем отправить POST запрос.
Пример:
$postData = http_build_query(); $opts = [ 'http' => [ 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $postData ] ]; $context = stream_context_create($opts); $result = file_get_contents('https://httpbin.org/anything', false, $context);
Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php
В $result мы получили ответ на POST запрос. httpbin.org — это сторонний сервис, который вы можете использовать для отладки запросов. Он возвращает нам наш собственный запрос в формате JSON и еще некоторую информацию. Так мы можем увидеть, что мы отправляем в своих запросах.
Как видите file_get_contents — полезная функция, которая не только позволяет читать файлы на нашем сервере, но еще и отправлять запросы.
Подробнее о ней вы можете прочитать здесь: https://www.php.net/manual/ru/function.file-get-contents.php
curl examples
The following commands can all be entered directly into your terminal to retrieve a response.
1. HTTP request
The first example is the most basic example which demonstrates a simple curl command that simulates a request for a website URL. This command will output the HTTP response of the URL in question.
3. Saving the result of a curl command
The and curl options are used to save the result of the curl command. The difference between both options is that will save the file with a predefined filename, which in this case is . On the other hand, the option will save the file as its exisiting name, which is . An example of each scenario is shown below.
4. Adding an additional HTTP request header
This curl command has the ability to add an additional HTTP request header to your requests. Simply use the option and set the header name and value in enclosed quotes. If you do not define a value for the header then the header itself must be followed by a semicolon (e.g. ).
5. Generating additional information
The option (for verbose) can be defined within a curl command so that it will generate more information during the operation. For example, using the additional header example from above, we can add the option which will display more information in regards to the connection and will display the custom header as well as regular headers.
6. Resuming a download
If a download is started for a particular asset but gets interrupted or purposely stopped, it can easily be resumed with the option. Simply add to the curl command in question and the asset will resume downloading where it left off.
7. Storing HTTP headers
With the option, you have the ability to store the HTTP headers that a site sends back. This is useful for instance if you want to read the cookies from the headers by using a second curl command and including the option. The after the tells curl that the output file is stdout (the file into which kernel writes its output).
8. Testing the download time of an asset without any output
The following command uses a couple of curl options to achieve the desired result. The tells curl to store and display the headers in stdout and the option tells curl to download the defined resource. However, if you do not want any output, simply add to the end of the command. This example can be useful if you are testing the download speed of an asset but don’t want to print or save the output.
9. Specifying a maximum transfer rate
You can specify the maximum transfer rate for both uploads and downloads with the option. The rate is measured in bytes/second unless a suffix, such for kilobytes, for megabytes, and gigabytes, is added to the end of the specified number.
10. HTTP/2 support check
If you have the latest curl release, you can use the option to check if a particular URL supports the new HTTP/2 protocol. Therefore, if the site does support HTTP/2, you will see in the header instead of .
11. Retrieving a particular byte-range
Use the option to retrieve a particular byte-range of a document. This essentially means to retrieve a particular portion of a file. These byte-range commands can be specified in a number of ways (e.g. or ). Read our article to learn more about Byte-Range Requests.