Отправка данных из скрипта методом POST

28.06.2010

Теги: CURLHTTPPHPPOSTWeb-разработкаФорма

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.

Поиск: CURL • HTTP • PHP • POST • Web-разработка • Форма

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.