Пример 10.2. Вывод списка параметров, полученных сервером в запросе от клиента (html, txt)

Данный сценарий ориентирован на передачу данных из веб-формы одним из основных методов: GET или POST. Поскольку передача данных в этих методах отличается, то в сценарии сначала определяется метод передачи данных путем обращения к переменной окружения REQUEST_METHOD, значение которой доступно сценарию через одноименный элемент ассоциативного массива (хэша) ENV, содержащего значения всех переменных окружения.

После определения использовавшегося в запросе клиента метода, выбирается адекватный способ чтения параметров, полученных из веб-формы:

В случае метода POST определяется общий размер переданных данных (в байтах) из переменной окружения CONTENT_LENGTH, а затем блок данного размера считывается из входного потока STDIN с помощью функции read.

В случае метода GET данные доступны в переменной окружения QUERY_STRING.

Если метод запроса не совпадает ни с одним из рассмотренных выше или его значение не определено, то происходит принудительное завершение сценария с выдачей соответствующего сообщения.

Поскольку в рамках протокола HTTP символы, отличные от латинских букв и цифр передаются в виде шестнадцатиричных кодов (пробелы заменяются на '+'), требуется предварительное обратное преобразование полученных данных с помощью операторов замены s/// и tr// с использованием шаблонов в виде регулярных выражений.

Далее с помощью функции split происходит разделение блока символов на подстроки по заданному разделителю:

Пары, описывающие имя параметра и его значение разделяются с помощью символа '&'. Результат разделения помещается в скалярный массив @pars.

Внутри пары имя и значение разделяются символом '='.

Рассмотренный пример может быть взят за основу для любого сценария, обрабатывающего данные из веб-формы, поскольку позволяет получить исходные данные, полученные от клиента. Расширение сценария сводится к добавлению кода обработки полученных данных и формирования итогового документа, возвращаемого веб-сервером клиенту.

Рассмотрим для примера сценарий выполняющий четыре арифметические операции над целыми числами, которые пользователь вводит через поля веб-формы в браузере.

#!c:/perl/bin/perl

print "Content-type: text/html\n\n";

print "<HTML><BODY>\n";

$method = $ENV{'REQUEST_METHOD'};

if ($method eq 'POST')

{

$length = $ENV{'CONTENT_LENGTH'};

read(STDIN, $qstr, $length);

}

else

{

if ($method eq 'GET') { $qstr = $ENV{'QUERY_STRING'}; }

else

{

print "Method ".$method." is not supported </BODY></HTML>";

exit(0);

}

}

$qstr =~ tr/+/ /;

$qstr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

@pars = split(/&/, $qstr);

$n_pars = @pars;

foreach $par (@pars)

{

($name, $value) = split(/=/, $par);

$opers{$name} = $value;

}

$op1 = int($opers{'A'});

$op2 = int($opers{'B'});

$op = $opers{'op'};

switch:

{

if ($op eq '+') { $res = $op1 + $op2; last switch; }

if ($op eq '-') { $res = $op1 - $op2; last switch; }

if ($op eq '*') { $res = $op1 * $op2; last switch; }

if ($op eq '/')

{

if ($op2 == 0)

{

print " Divide by zero! </BODY></HTML>";

exit(0);

}

else

{

$res = $op1 / $op2; last switch;

}

}

{

print "Operator ".$op." is not supported </BODY></HTML>";

exit(0);

}

}

print "Result: ".$op1.$op.$op2.' = '.$res;

print "<p><a href=\'".$ENV{'HTTP_REFERER'}."\'>Back</a></p>";

print "</HTML></BODY>\n";


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: