Отправка данных из скрипта методом POST
HTML форма позволяет пользователю сформировать POST-запрос, который затем отсылается браузером. Мы сформируем такой запрос скриптом. Пусть у нас есть простая форма, состоящая из двух полей и кнопки для отправки данных:
<form action="/handler/action.php" method="post"> Имя: <input name="name" type="text" /><br/> Пароль: <input name="password" type="password" /><br/> <input name="submit" type="submit" value="Отправить" /> </form>
Обработчик формы action.php
выводит в браузер текст, введенный в поля формы:
<?php echo 'Имя: '.$_POST['name'].'<br/>'; echo 'Пароль: '.$_POST['password'].'<br/>';
Метод POST, в отличие от метода GET, посылает данные не в строке запроса, а в области данных, после заголовков. Передача данных аналогична методу GET: группы name=value
объединяются при помощи амперсанда (&):
name=Евгений&password=qwerty
Кроме того, необходимо учитывать, что данные передаются в текстовом виде, поэтому все национальные символы следует подвергать кодированию при помощи функции urlencode()
.
Отправка данных методом POST через сокеты
<?php $hostname = 'localhost'; $path = '/handler/action.php'; $content = ''; // Устанавливаем соединение с сервером $hostname $fp = fsockopen($hostname, 80, $errno, $errstr, 30); // Проверяем успешность установки соединения if (!$fp) die('<p>'.$errstr.' ('.$errno.')</p>'); // Данные HTTP-запроса $data = 'name='.urlencode('Евгений').'&password='.urlencode('qwerty'); // Заголовок HTTP-запроса $headers = 'POST '.$path." HTTP/1.1\r\n"; $headers .= 'Host: '.$hostname."\r\n"; $headers .= "Content-type: application/x-www-form-urlencoded\r\n"; $headers .= 'Content-Length: '.strlen($data)."\r\n\r\n"; // Отправляем HTTP-запрос серверу fwrite($fp, $headers.$data); // Получаем ответ while ( !feof($fp) ) $content .= fgets($fp, 1024); // Закрываем соединение fclose($fp); // Выводим ответ в браузер echo $content;
Результат работы скрипта выглядит примерно так
HTTP/1.1 200 OK Date: Sat, 28 Jun 2008 07:53:19 GMT Server: Apache/2.0.55 (Win32) PHP/5.2.1 X-Powered-By: PHP/5.2.1 Content-Length: 42 Content-Type: text/html Имя - Евгений<br/> Пароль - qwerty<br/>
Отправка данных методом POST с использованием CURL
Помимо сокетов, обеспечивающих низкоуровневое обращение к серверу, PHP располагает специальным расширением CURL (Client URL Library).
<?php // Задаем адрес удаленного сервера $curl = curl_init("http://localhost/handler/action.php"); // Передача данных осуществляется методом POST curl_setopt($curl, CURLOPT_POST, 1); // Задаем POST-данные $data = 'name=Евгений&password=qwerty'; curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Выполняем запрос и выводим ответ в браузер curl_exec($curl); // Закрываем CURL соединение curl_close($curl);
С помощью функции curl_init()
задается адрес удаленного сервера и путь к файлу на нем. В отличие от функции fsockopen()
, необходимо задавать адрес полностью, включая префикс http://
, т.е. расширение CURL позволяет работать с несколькими видами протоколов (HTTP, HTTPS, FTP). Если соединение с указанным сервером происходит успешно, функция curl_init()
возвращает дескриптор соединения, который используется во всех остальных функциях библиотеки.
Для того, чтобы сообщить CURL о том, что данные будут передаваться методом POST, необходимо задать параметр CURLOPT_POST
. POST-данные устанавливаются при помощи параметра CURLOPT_POSTFIELDS
.
По умолчанию библиотека удаляет HTTP-заголовки, возвращаемые сервером. Однако CURL можно настроить на выдачу заголовков, если установить при помощи функции curl_setopt()
ненулевое значение параметра CURLOPT_HEADER
.
P.S. Из-за ошибки библиотеки сокетов протокол HTTP 1.1 под Windows работает медленно. При работе скрипта использующего сокеты под управлением этой ОС, лучше использовать версию HTTP 1.0.