Отправка POST запроса из perl-сценария
Для отправки данных стоит восполльзоваться модулем LWP (Library for WWW accesss in Perl).
Большинство модулей в этой библиотеке являются объектно-ориентированными. Эмулируемый Агент пользователя, посланные запросы и ответы, полученные от сервера WWW, представлены объектами.
Вариант 1
Пусть мы хотим послать запрос в скрипт endpost.cgi следующего вида:
endpost.cgi - принимающий запрос скрипт #!/usr/bin/perl use CGI ':standart'; $query=CGI->new(); print "Content-type: text/html\n\n"; if ($query->param("login") && $query->param("passwd")) { if ($query->param("login") eq 'gorynych' && $query->param("passwd") eq 'gorynych') { print "данные успешно переданы!"; exit; } } $text = $query->param("text"); print << "EOF"; Укажите правильный псевдоним и пароль для передачи! <P> <FORM action="/cgi-bin/endpost.cgi" method=post> <TABLE border=0> <TR><TD valign=top>Введите текст: </TD> <TD><TEXTAREA name=text cols=40 rows=5>$text</TEXTAREA></TD></TR> <TR><TD valign=top>Введите псевдоним: </TD> <TD><INPUT type=text name=login value=""></TD></TR> <TR><TD valign=top>Введите пароль: </TD> <TD><INPUT type=password name=passwd value=""></TD></TR></TABLE><BR> <INPUT type=submit value="отправить"> </FORM> EOF #end post.cgi - посылающий запрос скрипт #!/usr/bin/perl $text = StrEscaped("Есть многое на свете, друг Гораций, что и не снилось нашим мудрецам!"); $url = "http://your.host.com/cgi-bin/endpost.cgi"; $passwd = "gorynych"; $login = "gorynyc"; # создадим нового Агента пользователя use LWP::UserAgent; $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(POST=>$url); # указываем тип контекста $req->content_type('application/x-www-form-urlencoded'); # вводим сам контекст для передачи $req->content("text=$text&login=gorynych&passwd=gorynych"); my $res = $ua->request($req); # получаем ответ от выводим его print "Content-type: text/html\n\n"; print $res->content; # если вы хотите получить полный ответ, с заголовком HTTP, # воспользуйтесь вызовом print $res->as_string # вспомогательные процедуры sub StrEscaped { # используем эту процедуру для преобразования # передаваемых символов кириллицы my ($str)=@_; $str=~s/([^0-9A-Za-z\?&=:;])/sprintf("%%%x", ord($1))/eg; return $str }
Пусть Вам нужно отправить псевдоним и пароль в некую CGI программу, которая проверяет переданные значения и возвращает 1 в случае успеха и 0 при вводе некоректных значений.
Модифицируем наш сценарий:
1. добавим в начало разбор параметров
use CGI ':standart'; $query = CGI->new(); # если были переданы POST параметры "login" и "passwd" # заносим их в соответствующие переменные if ($query->param("login") && $query->param("passwd")) { $login=$query->param("login"); $passwd=$query->param("passwd"); } # вводим значения, если переменные неопределенны $passwd = "user" unless $login; $login = "passwd" unless $passwd; use LWP::UserAgent; $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(POST=>$url); $req->content_type('application/x-www-form-urlencoded'); $req->content("text=$text&login=$login&passwd=$passwd"); my $res = $ua->request($req); ... вместо того, чтобы выводить контекст ответа, мы будем его проверять: $res = $res->content; if ($res eq 1) { print "данные успешно переданы!"; } else { # возвращаем текст в читаемый вид # и выводим форму для ввода, указывая в качестве # принимающего сценария наш новый post.cgi $text = StrUnescaped($text); print << "EOF"; Укажите правильный псевдоним и пароль для передачи! <P> <FORM action="/cgi-bin/post.cgi" method=post> <TABLE border=0> <TR><TD valign=top>Введите текст: </TD> <TD><TEXTAREA name=text cols=40 rows=5>$text</TEXTAREA></TD></TR> <TR><TD valign=top>Введите псевдоним: </TD> <TD><INPUT type=text name=login value=""></TD></TR> <TR><TD valign=top>Введите пароль: </TD> <TD><INPUT type=password name=passwd value=""></TD></TR></TABLE><BR> <INPUT type=submit value="отправить"> </FORM> EOF #end } sub StrUnescaped { my ($str)=@_; $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; return $str }
Замечание:
"Ленивые люди" используют модуль HTTP::Request::Common, для отправки POST запроса (он сам оперирует заголовками и преобразованием символов и использует предустановленный content_type).
Это выглядит так:
use HTTP::Request::Common qw(POST); use LWP::UserAgent; $ua = LWP::UserAgent->new; my $req = POST $url, [ text => "$text", login => "$login", passwd => "$passwd" ];