Базовая работа с php curl: get, post, json, headers
Содержание:
- Получить (GET) страницу
- POST запрос с помощью CURL
- The HTTP Protocol
- Команды Curl для HTTP
- HTTPS is HTTP secure
- Запросы и ответы содержат заголовки
- Cookie options
- 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
- Предварительные сведения
- Формы
- Что такое curl?
- PHP cURL POST
- Location header
- Мульти запросы cURL в PHP
- Часто используемые функции CURL и константы
Получить (GET) страницу
Простейший и самый обычный HTTP-запрос — получить содержимое URL.
URL может ссылаться на web-страницу, картинку или файл. Клиент
отсылает GET-запрос на сервер и получает запрашиваемый документ. Если
выполнить команду
# curl http://curl.haxx.se
вы получите web-страницу, выведенную в ваше терминальное окно. Полный
HTML-документ, который содержится по этому адресу URL.
Все HTTP-ответы содержат набор заголовков, которые обычно скрыты.
Чтобы их увидеть вместе с самим документом, используйте ключ curl -i.
Вы можете также запросить только заголовки при помощи ключа -I
(который заставит curl сделать HEAD-запрос).
POST запрос с помощью CURL
Давайте напишем наш первый скрипт, который отправит данные методом POST на какую-нибудь страницу и посмотрит, что отобразилось на этой странице.
Сначала нам нужен файл, который бы принял наши данные и что-то вывел на страницу. Я расположил его по адресу https://intop24.ru/demo/curl/post.php. В нем содержится следующий код:
if (isset($_POST) && sizeof($_POST) > 0) { print_r($_POST); }
Теперь попробуем передать туда какие-то данные:
$url = «https://intop24.ru/demo/curl/post.php»; $post_data = array ( «foo» => «bar», «query» => «Nettuts», «action» => «Submit» ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Указываем, что у нас POST запрос curl_setopt($ch, CURLOPT_POST, 1); // Добавляем переменные curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;
Результат можно посмотреть здесь: curl_post.php
The HTTP Protocol
HTTP is the protocol used to fetch data from web servers. It is a very simple protocol that is built upon TCP/IP. The protocol also allows information to get sent to the server from the client using a few different methods, as will be shown here.
HTTP is plain ASCII text lines being sent by the client to a server to request a particular action, and then the server replies a few text lines before the actual requested content is sent to the client.
The client, curl, sends a HTTP request. The request contains a method (like GET, POST, HEAD etc), a number of request headers and sometimes a request body. The HTTP server responds with a status line (indicating if things went well), response headers and most often also a response body. The «body» part is the plain data you requested, like the actual HTML or the image etc.
Команды Curl для HTTP
Curl также можно использовать c прокси-сервером. Если вы находитесь за прокси-сервером, прослушивающим порт 8090 на sampleproxy.com, загрузите файлы, как показано ниже:
curl -x sampleproxy.com:8090 -U username:password -O http:// testdomain.com/testfile.tar.gz
В приведённом выше примере вы можете выбросить -U username:password, если прокси-сервер не требует метода аутентификации.
Типичный HTTP-запрос всегда содержит заголовок. Заголовок HTTP отправляет дополнительную информацию об удалённом веб-сервере вместе с фактическим запросом. С помощью инструментов разработчика в браузере вы можете посмотреть сведения о заголовке, а проверить их можно с помощью команды curl.
Пример ниже демонстрирует, как получить информацию о заголовке с веб-сайта.
curl -I www.testdomain.com
Используя curl, вы можете сделать запрос GET и POST. Запрос GET будет выглядеть следующим образом:
curl http://mydomain.com
А вот пример запроса POST:
curl –data “text=Hello” https://myDomain.com/firstPage.jsp
Здесь text=Hello — это параметр запроса POST. Такое поведение похоже на HTML-формы.
Вы также можете указать несколько методов HTTP в одной команде curl. Сделайте это, используя опцию –next, например:
curl –data “text=Hello” https://myDomain.com/firstPage.jsp —next https://myDomain.com/displayResult.jsp
Команда содержит запрос POST, за которым следует запрос GET.
Каждый HTTP-запрос содержит агент пользователя, который отправляется как часть запроса. Он указывает информацию о браузере клиента. По умолчанию запрос содержит curl и номер версии в качестве информации об агенте пользователя. Пример вывода показан ниже:
“GET / HTTP/1.1” 200 “_” ”curl/7/29/0”
Вы можете изменить дефолтную информацию об агенте пользователя, используя следующую команду:
curl -I http://mydomain.com –-user-agent “My new Browser”
Теперь вывод будет выглядеть так:
“GET / HTTP/1.1” 200 “_” ”My new Browser”
HTTPS is HTTP secure
There are a few ways to do secure HTTP transfers. By far the most common protocol for doing this is what is generally known as HTTPS, HTTP over SSL. SSL encrypts all the data that is sent and received over the network and thus makes it harder for attackers to spy on sensitive information.
SSL (or TLS as the latest version of the standard is called) offers a truckload of advanced features to allow all those encryptions and key infrastructure mechanisms encrypted HTTP requires.
Curl supports encrypted fetches when built to use a TLS library and it can be built to use one out of a fairly large set of libraries — will show which one your curl was built to use (if any!). To get a page from a HTTPS server, simply run curl like:
Запросы и ответы содержат заголовки
При вводе адреса веб-сайта мы видим только текст ответа. Но на самом деле происходит гораздо больше процессов. Когда мы делаем запрос, мы отправляем заголовок запроса, который содержит информацию о запросе. Ответ также содержит заголовок ответа.
Для того чтобы увидеть заголовок ответа в запрос curl, добавим ключ :
Заголовок будет включен над телом ответа:
Чтобы в ответе получить только заголовок, используем ключ
Заголовок содержит метаданные ответа. Вся эта информация передается в браузер при запросе URL в нашем браузере (например, при просмотре веб-страницы в Интернете), но браузер не отображает эту информацию. Можно просмотреть информацию заголовка с помощью консоли Chrome Developer Tools, перейдя на вкладку .
Теперь давайте уточним метод. Метод GET (чтение) подразумевается по умолчанию, когда не указан другой метод, но мы сделаем это здесь явно с параметром -X:
При посещении веб-сайта мы отправляем запрос, используя метод GET. Существуют и другие методы HTTP, которые можно использовать при взаимодействии с REST API. Вот общие методы, используемые при работе с конечными точками REST:
HTTP метод | Описание |
---|---|
POST | Создание ресурса |
GET | Чтение (получение) ресурса |
PUT | Обновление ресурса |
DELETE | Удаление ресурса |
Note: Метод GET используется по умолчанию в запросах curl. При использовании curl для выполнения запросов HTTP, отличных от GET, необходимо указывать нужный метод HTTP.
Cookie options
The simplest way to send a few cookies to the server when getting a page with curl is to add them on the command line like:
Cookies are sent as common HTTP headers. This is practical as it allows curl to record cookies simply by recording headers. Record cookies with curl by using the () option like:
(Take note that the option described below is a better way to store cookies.)
Curl has a full blown cookie parsing engine built-in that comes in use if you want to reconnect to a server and use cookies that were stored from a previous connection (or hand-crafted manually to fool the server into believing you had a previous connection). To use previously stored cookies, you run curl like:
Curl’s «cookie engine» gets enabled when you use the option. If you only want curl to understand received cookies, use with a file that doesn’t exist. Example, if you want to let curl understand cookies from a page and follow a location (and thus possibly send back cookies it received), you can invoke it like:
Curl has the ability to read and write cookie files that use the same file format that Netscape and Mozilla once used. It is a convenient way to share cookies between scripts or invokes. The () switch automatically detects if a given file is such a cookie file and parses it, and by using the () option you’ll make curl write a new cookie file at the end of an operation:
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.
Предварительные сведения
Протокол HTTP
HTTP — это протокол, используемый при обмене данных между веб-сервером и программой-клиентом (например, браузером). Он состоит из строк ASCII-текста, отсылаемых от клиента к серверу для запроса какого-либо действия. При получении запроса сервер отвечает клиенту несколькими служебными текстовыми строками, а затем выдает запрошенное содержимое.
Используя ключ , можно увидеть, какие именно команды curl отсылает серверу. Этот ключ дает возможность разобраться в особенностях взаимодействия curl и веб-сервера и помогает отладить запрос.
URL
URL (Uniform Resource Locator — единый указатель ресурса) задает адрес определенного ресурса в Интернет. Например, URL веб-страницы cURL, записывается так: .
Формы
Формы представляют собой наборы полей, размещенные на веб-странице. Пользователь вводит в эти поля данные, затем нажимает на кнопку «OK» или «Отправить», после чего данные отправляются на сервер. Сервер принимает данные и решает, как поступить дальше: искать ли информацию в базе данных, показать ли введенный адрес на карте или использовать информацию для аутентификации пользователя. Разумеется, «решает» — означает, что на стороне сервера должна быть какая-то программа, которая принимает и обрабатывает присланные данные. Простейший пример: форма запроса поисковика Google.
Справка
Справку по curl можно получить, набрав в командной строке
$ curl --help
или
$ curl --manual
— приглашение командной строки.
Формы
Формы — основной способ представления 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-форм.
Что такое curl?
На самом деле, curl — это больше чем просто утилита командной строки для Linux или Windows. Это набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах и других операций с URL адресами.
Поддержка библиотеки curl была добавлена в множество различных языков программирования и платформ. Утилита curl — это независимая обвертка для этой библиотеки. Именно на этой утилите мы и остановимся в этой статье.
PHP cURL POST
Разница между и запросами — это синтаксиc для отправки. Для можно указать больше параметров, например, поля, которые будут отправляться. Допустим, вы хотите отправить форму на сайте куда делаете запрос, тогда в данном случае вам точно понадобиться .
// Для начала скажем, что мы хотим использовать cURL $curl = curl_init(); // Определение прааметров. Ссылку (куда будет делаться запрос), какие заголовки будут у этого запроса, задаем, что запрос должен быть в формате POST и передаем параметры этого запроса в виде массива 'ключ' => 'значение'. curl_setopt_array($curl, [ CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://testcURL.com', CURLOPT_USERAGENT => 'Codular Sample cURL Request', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => ]); // Отправляем запроса и сохраняем его в $res $res = curl_exec($curl); // Закрываем запрос и удаляем инициализацию $curl curl_close($curl);
Процедура отправки этого запроса почти идентична тому, что было в за исключением двух дополнительных строчек. С помощью мы говорим cURL о том, что хотим отправить запрос и затем прописываем параметры для отправки с в виде массива (сначала имя параметра и затем его значение).
CURLOPT_POSTFIELDS =>
Обратите внимание на то, что если на форме будет стоять капча (проверка на ботов), тогда зарегистрироваться автоматически не получится
Location header
When a resource is requested from a server, the reply from the server may include a hint about where the browser should go next to find this page, or a new page keeping newly generated output. The header that tells the browser to redirect is .
Curl does not follow headers by default, but will simply display such pages in the same manner it displays all HTTP replies. It does however feature an option that will make it attempt to follow the pointers.
To tell curl to follow a Location:
If you use curl to POST to a site that immediately redirects you to another page, you can safely use () and / together. curl will only use POST in the first request, and then revert to GET in the following operations.
Мульти запросы cURL в PHP
Обычно в скрипте PHP выполнение запросов cUrl производится последовательно, то есть друг за другом. Пока не вернется результат предыдущего запроса, новый не выполнится.
Например, если нужно собрать независимые друг от друга данные с разных сайтов, то можно организовать их параллельный сбор. Можно также произвести несвязанные вычисления или обработку данных через асинхронные запросы к скриптам в отдельных файлах.
// создание обработчиков $ch1 = curl_init(); $ch2 = curl_init(); // установка опций curl_setopt($ch1, CURLOPT_URL, "https://site1.ru"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.site2.ru"); curl_setopt($ch2, CURLOPT_HEADER, 0); // создание управляющего объекта $mh = curl_multi_init(); // добавление обработчиков curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $running = null; // запуск выполнения запросов в асинхронном режиме do { curl_multi_exec($mh, $running); } while ($running > 0); // освобождение ресурсов curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
Функция curl_multi_exec() многократно вызывается в цикле с постусловием, где параметр $running имеет значение количества активных соединений.
Чем больше обработчиков в параллельной работе, тем больше сокращается время выполнения скрипта, поэтому нелишним будет внедрить привычку использовать эту возможность cURL в своих скриптах.
Часто используемые функции CURL и константы
- curl_init — Инициализирует сеанс;
- curl_close — Завершает сеанс;
- curl_exec — Выполняет запрос;
- curl_errno — Возвращает код ошибки;
- curl_setopt — Устанавливает параметр для сеанса, например:
- CURLOPT_HEADER – значение 1 означает, что необходимо вернуть заголовки;
- CURLOPT_INFILESIZE — параметр для указания ожидаемого размера файла;
- CURLOPT_VERBOSE — значение 1 означает что CURL будет выводить подробные сообщения о всех производимых операциях;
- CURLOPT_NOPROGRESS – отключение индикатора прогресса операции, значение 1;
- CURLOPT_NOBODY – если Вам не нужен документ, а нужны только заголовки, то поставьте значение 1;
- CURLOPT_UPLOAD — для закачки файла на сервер;
- CURLOPT_POST – выполнить запрос методом POST;
- CURLOPT_FTPLISTONLY — получение списка файлов в директории FTP сервера, значение 1;
- CURLOPT_PUT — выполнить запрос методом PUT, значение 1;
- CURLOPT_RETURNTRANSFER — возвратить результат, не выводя в браузер, значение 1;
- CURLOPT_TIMEOUT – максимальное время выполнения в секундах;
- CURLOPT_URL – указание адреса для обращения;
- CURLOPT_USERPWD — строка с именем пользователя и паролем в виде :;
- CURLOPT_POSTFIELDS – данные для POST запроса;
- CURLOPT_REFERER — задает значение HTTP заголовка «Referer: »;
- CURLOPT_USERAGENT — задает значение HTTP заголовка «User-Agent: »;
- CURLOPT_COOKIE — содержимое заголовка «Cookie: », который будет отправлен с HTTP запросом;
- CURLOPT_SSLCERT- имя файла с сертификатом в формате PEM;
- CURLOPT_SSL_VERIFYPEER – значение 0, для того чтобы запретить проверку сертификата удаленного сервера (по умолчанию 1);
- CURLOPT_SSLCERTPASSWD — пароль к файлу сертификата.
- curl_getinfo — Возвращает информацию об операции, вторым параметром может выступать константа для указания, что именно нужно показать, например:
- CURLINFO_EFFECTIVE_URL — последний использованный URL;
- CURLINFO_HTTP_CODE — последний полученный код HTTP;
- CURLINFO_FILETIME — дата модификации загруженного документа;
- CURLINFO_TOTAL_TIME — время выполнения операции в секундах;
- CURLINFO_NAMELOOKUP_TIME — время разрешения имени сервера в секундах;
- CURLINFO_CONNECT_TIME — время, затраченное на установку соединения, в секундах;
- CURLINFO_PRETRANSFER_TIME — время, прошедшее от начала операции до готовности к фактической передаче данных, в секундах;
- CURLINFO_STARTTRANSFER_TIME — время, прошедшее от начала операции до момента передачи первого байта данных, в секундах;
- CURLINFO_REDIRECT_TIME — время, затраченное на перенаправление, в секундах;
- CURLINFO_SIZE_UPLOAD — количество байт при закачке;
- CURLINFO_SIZE_DOWNLOAD — количество байт при загрузке;
- CURLINFO_SPEED_DOWNLOAD — средняя скорость закачки;
- CURLINFO_SPEED_UPLOAD — средняя скорость загрузки;
- CURLINFO_HEADER_SIZE — суммарный размер всех полученных заголовков;
- CURLINFO_REQUEST_SIZE — суммарный размер всех отправленных запросов;
- CURLINFO_SSL_VERIFYRESULT — результат проверки SSL сертификата, запрошенной с помощью установки параметра CURLOPT_SSL_VERIFYPEER;
- CURLINFO_CONTENT_LENGTH_DOWNLOAD — размер загруженного документа, прочитанный из заголовка Content-Length;
- CURLINFO_CONTENT_LENGTH_UPLOAD — размер закачиваемых данных;
- CURLINFO_CONTENT_TYPE — содержимое полученного заголовка Content-type, или NULL в случае, когда этот заголовок не был получен.
Подробнее о функциях CURL и константах к ним можете посмотреть на официальном сайте PHP — php.net
На этом все, для начинающих я думаю достаточно Удачи!