Отправка POST-запросов с помощью php. Часть 2

curl-refinedВ предыдущей статье по отправке 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

И не забывайте комментировать статью.

Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта

Отзывов: 4 на «Отправка POST-запросов с помощью php. Часть 2»

  1. Автор: FXIX, 23 июня 2010 в 15:14

    использует Firefox 3.6.3 Firefox 3.6.3 на Windows XP Windows XP

    возможно в строке:
    //переменные, которые будут переданные по методу post
    curl_setopt($curl, CURLOPT_POSTFIELDS, ‘name=’.urlencode(‘John’).’&surname=’.urlencode(‘Smith’));
    ошибка. последняя скобка что закрывает?

    • Автор: djafar, 24 июня 2010 в 11:14

      использует Firefox 3.6.4 Firefox 3.6.4 на Windows 7 Windows 7

      последняя скобка закрывает первую )) соответственно список аргументов метода curl_setopt

  2. Автор: Сергей, 22 мая 2011 в 18:29

    использует Opera 11.10 Opera 11.10 на Windows XP Windows XP

    Автору респект. Пасиб за статью!

  3. Автор: sl4mmer, 22 мая 2011 в 22:48

    использует Opera 11.11 Opera 11.11 на GNU/Linux x64 GNU/Linux x64

    Не поню уже, но есть какая-то стандартная функция, которая приводит массив к виду %key%=urlencode(%value%)& и т.д. Можно было бы слегка упростить ваш пример)

RSS-лента комментариев. Адрес для трекбека

Ваш отзыв

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Нажимая на кнопку "Добавить" вы принимаете правила комментирования