dimarina.ru

html, css и javascript1   Разное1   Рецепты программирования на PHP или практические советы по программированию7   Управление проектом1  

 

Рецепты программирования на PHP или практические советы по программированию → Отправляем данные формы автоматически методом POST

Практическая необходимость в использовании автоматической отправки данных возникает не так часто, тем не менее, лично я, не раз убеждался в полезности этой функции. Например, если требуется переслать данные между двумя несвязанными серверами. Я использовал этот скрипт, чтобы связать воедино два сервера работающих под разными операционными системами Windows / UNIX и базами данных MS SQL / MySQL. Этим методом можно переносить бинарные или длинные файлы между серверами, например, картинки. В общем, полезностей весьма много, особенно если говорить про полностию автоматизированные веб-сервисы.

Этот метод также позволяет проделывать весьма дурные штучки. Например, постить миллион сообщений в разные форумы в автоматическом режиме. Кстати, капчи довольно неплохо защищают форумы от автоматических публикаций, но и против них есть пути обхода. Об этом поговорим в другой раз. Можно логинится в защищенные паролем зоны сайтов и брать оттуда информацию, подделывать cookies и реферреры, и много других злодейств.

Резюмируя скажу, что в серьезном автоматизированном веб-сервисе скорее всего пригодится функция автоматического POST'а.

Ниже приведен скрипт, осуществляющий отправку данных методом POST. Метод POST, в отличие от метода GET, посылает данные на сервер не в строке запроса (которая как правило ограничена в размере), а в области данных, после HTTP заголовка. Передача нескольких переменных аналогична методу GET: группы имя=значение объединяются при помощи амперсанда. Кодировать массив удобнее всего через встроенную функцию http_build_query.

Кстати, аналогичные функции есть уже встроенные, например, в пакет curl.

1 //передает массив $data методом POST
2 function _post($host,$path,$data) {
3     $res FALSE;
4     if(!$fp fsockopen($host80$errno$errstr30)) return $errstr." ".$errno;
5     $edata http_build_query($data)."\r\n\r\n";
6     $headers "POST ".$path." HTTP/1.1\r\n";
7     $headers.= "Host: ".$host."\r\n";
8     $headers.= "Content-type: application/x-www-form-urlencoded\r\n";
9     $headers.= "Content-Length: ".strlen($edata)."\r\n";
10     $headers.= "Connection: Close\r\n\r\n";
11     fwrite($fp$headers.$edata);
12     while (!feof($fp)) $res .= fgets($fp1024);
13     fclose($fp);
14     return $res;
15 }
16
17 $data = array(
18     "pic" => "GIF89...some binary data..."
19     ,"width"=>12
20     ,"height"=>34
21 );
22 echo "Ответ сервера: "._post("domain.ru","somedir/index.html",$data);

Если надо проанализировать как сервер воспринял переданную ему информацию, то необходимо "разобрать" ответ сервера. Например, так:

1 $response _post("domain.ru","somedir/index.html",$data);
2 if(preg_match("/HTTP\/1\.1 200 OK/",$response)) echo $response;
3 else echo "Ошибка: ".$response;

Написать комментарий





Включите отображение картинок в браузере
Число на картинке: