Отправка POST-запросов с помощью php. Часть 2
В предыдущей статье по отправке POST-запросов, мы разобрали, как работает отправка запросов с помощью сокетов. В этой статье, рассмотрим, как работает библиотека curl. Для корректной работы всех примеров в php должна быть установлена поддержка этой библиотеки. Эта библиотека поддерживает множество протоколов: FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS и др. Сейчас нас интересует только протокол HTTP.
Инициализация
Для работы с библиотекой в php есть несколько функций. Первой рассмотрим функцию curl_init(). Эта функция предназначена для инициализации сеанса CURL.
resource curl_init ( [string $url] )
Параметры:
- $url – строка с URL, к которому будет открыто соединение. Данный параметр необязателен, поскольку URL можно установить с помощью функции curl_setopt().
Функция вернет дескриптор сеанса CURL.
Установка параметров
При работе с сокетами, мы посылали серверу заголовки. Теперь за нас это будет делать библиотека curl. Только нужно сделать некоторые настройки. Для настройки параметров сеанса, существует функция curl_setopt().
bool curl_setopt ( resource $ch, string $option, mixed $value )
Параметры:
- $ch – дескриптор сеанса CURL. Тот, который нам вернет функция curl_init();
- $option – опция конфигурация в виде строки. Об опциях поговорим чуть ниже;
- $value – значение опции. Это может быть число, текст или ресурс.
Функция вернет true, если значение опции установлено успешно и false если установить опцию не удалось.
Название конфигураций, те которые передаются в переменной $option, на самом деле имеют вид чисел. Например, 10002, 42, 47 и др. Для использования эти числа не удобны, потому что они не осмыслены и плохо запоминаются. Для удобства, в библиотеке CURL, были объявлены константы с вполне осмысленным названием. Весь перечень этих констант можно посмотреть в справочнике по php http://www.php.net/manual/en/function.curl-setopt.php. Нас интересуют только некоторые из них.
- CURLOPT_URL – данная опция устанавливает URL, к которому будем отсылать запрос;
- CURLOPT_HEADER – если данная опция установлена не в 0, то будут отображены заголовки ответа сервера. Если нужны заголовки ответа, то нужно обязательно установить в 1, ибо по умолчанию данная опция установлена в 0;
- CURLOPT_RETURNTRANSFER – если эта опция установлена не в 0, то функция curl_exec() (см. ниже) вернет результат, а не выведет его. По умолчанию, функция curl_exec() выводит результат запроса;
- CURLOPT_POST – при отправке POST-запроса, нужно установить эту опцию в 1;
- CURLOPT_POSTFIELDS – в эту опцию устанавливаются переменные для post-запроса в виде строки запроса;
- CURLOPT_USERAGENT – в данную опцию устанавливается содержимое заголовка User-Agent (см. предыдущую статью).
Этих опций будет достаточно для простого post-запроса. Данные опции устанавливаются так
//устанавливаем урл, к которому обратимся curl_setopt($curl, CURLOPT_URL, 'http://www.example.loc/post/test.php');
Выполнение
Для выполнения запроса с учетом всех установленных опций существует функция curl_exec().
mixed curl_exec ( resource $ch )
Параметры:
- $ch – дескриптор сеанса CURL, который возвращает функция curl_init();
В зависимости от значения опции CURLOPT_RETURNTRANSFER функция либо вернет результат работы, либо выведет результат работы.
Для завершения сеанса CURL и освобождения ресурсов существует функция curl_close().
void curl_close ( resource $ch )
Параметры:
- $ch – дескриптор сеанса CURL, который возвращает функция curl_init();
Функция ничего не возвращает.
Ошибки
Для получения номера ошибки используется функция curl_errno().
int curl_errno ( resource $ch )
Параметры:
- $ch – дескриптор сеанса CURL, который возвращает функция curl_init();
Функция вернет целое число – номер ошибки.
Для получения текста сообщения об ошибке используется функция curl_error().
string curl_error ( resource $ch )
Параметры:
- $ch – дескриптор сеанса CURL, который возвращает функция curl_init();
Функция вернет строку с текстом ошибки.
Скрипт
Порядок работы в скрипте следующий:
- инициализировать сеанс с помощью curl_init();
- установить нужные опции с помощью функции curl_setopt();
- выполнить запрос с помощью функции curl_exec();
- получить номер и сообщение об ошибке с помощью функций curl_errno() и curl_error() соответственно;
- завершить сеанс CURL с помощью функции curl_close().
Код
Теперь осталось написать код. Как и в прошлый раз возьмем для тестирования небольшой скрипт.
test.php
<?php echo 'Name:'.$_POST['name'],"",'Surname:'.$_POST['surname']; ?>
Этот код выведет переменные name и surname, переданные по методу POST.
Ну и собственно код.
curl.php
<?php /** * Пример работы с библиотекой curl на php * @link http://www.web-junior.net/otpravka-post-zaprosov-s-pomoshhyu-php-chast-2/ **/ //инициализируем сеанс $curl = curl_init(); //уcтанавливаем урл, к которому обратимся curl_setopt($curl, CURLOPT_URL, 'http://www.example.loc/post/test.php'); //включаем вывод заголовков curl_setopt($curl, CURLOPT_HEADER, 1); //передаем данные по методу post curl_setopt($curl, CURLOPT_POST, 1); //теперь curl вернет нам ответ, а не выведет curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //переменные, которые будут переданные по методу post curl_setopt($curl, CURLOPT_POSTFIELDS, 'name='. urlencode('John').'&surname='.urlencode('Smith')); //я не скрипт, я браузер опера curl_setopt($curl, CURLOPT_USERAGENT, 'Opera 10.00'); $res = curl_exec($curl); //проверяем, если ошибка, то получаем номер и сообщение if(!$res){ $error = curl_error($curl).'('.curl_errno($curl).')'; echo $error; } //если не ошибка, то выводим результат else{ echo $res; } curl_close($curl); ?>
Если не будет никаких ошибок, то этот код должен вывести
HTTP/1.1 200 OK
Date: Wed, 21 Oct 2009 13:52:31 GMT
Server: Apache/2.2.9 (Win32) PHP/5.2.11
X-Powered-By: PHP/5.2.11
Content-Length: 26
Content-Type: text/html
Name:John<br/>Surname:Smith
Что значат эти заголовки, читайте в предыдущей статье.
Читайте все статьи цикла.
В первой части рассматривается работа с сокетами.
Во второй части описывается библиотека cURL.
В третьей части можно почитать о работе с Stream Function.
В четвертой части описывается отправка файла через POST.
В пятой части описывается отправка POST-запросов в Zend Framework.
Популярность: 32%
Интересное из других блогов:
2leep.comИ не забывайте комментировать статью.
Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта
Автор: FXIX, 23 июня 2010 в 15:14
используетвозможно в строке:
//переменные, которые будут переданные по методу post
curl_setopt($curl, CURLOPT_POSTFIELDS, ‘name=’.urlencode(‘John’).’&surname=’.urlencode(‘Smith’));
ошибка. последняя скобка что закрывает?
Автор: djafar, 24 июня 2010 в 11:14
используетпоследняя скобка закрывает первую )) соответственно список аргументов метода curl_setopt
Автор: Сергей, 22 мая 2011 в 18:29
используетАвтору респект. Пасиб за статью!
Автор: sl4mmer, 22 мая 2011 в 22:48
используетНе поню уже, но есть какая-то стандартная функция, которая приводит массив к виду %key%=urlencode(%value%)& и т.д. Можно было бы слегка упростить ваш пример)