Литвек - электронная библиотека >> Дэвид Тейнсли >> Руководства и инструкции и др. >> Linux и UNIX: программирование в shell. Руководство разработчика. >> страница 99
общее количество байтов, отосланных с применением метода post. Производится считывание строки из потока стандартного ввода, а затем выполняется то же самое преобразование, что и при использовании метода get. Процесс считывания завершается после того, как считанное количество байтов становится равным количеству байтов, хранящихся в переменной CONTENT_LENGTH.

После выполнения небольшого изменения в конструкции form action получится обобщенный декодер форм. Для осуществления считывания из стандартного потока ввода можно использовать команду cat. Ниже показана конструкция, которую следует добавить в сценарий conv.cgi, в результате чего появится возможность использования методов get и post.

if ["$REQUEST_METHOD"="POST"]; then

QUERY_STRING=`cat -`

fi

Обратите внимание на то, что команда cat содержит дефис, благодаря чему эту команду можно применять для считывания данных из стандартного потока ввода.

При использовании метода post осуществляется обычная проверка значения переменной QUERY_string. Затем все символы, поступающие из стандартного потока ввода, присваиваются переменной QUERY_STRING. В этой ситуации возможно использование метода get, поскольку в любом случае требуется получить информацию из переменной querY_string.

Замените строку form action в cgi–сценарии books.cgi:

<FORM action="/cgi‑bin/conv.cgi" METHOD=GET>

строкой

<FORM action ="/cgi‑bin/conv.cgi" METHOD=POST>

Кроме того, будут выполнены небольшие изменения в сценарии conv.cgi, благодаря чему можно будет проверять значения, введенные в текстовые поля, а также определять установленные флажки. Обновленный сценарий будет иметь следующий вид:

$ pg conv.cgi

#!/bin/sh

#conv.cgi

#декодирование строки URL

echo "Content‑type: text/html"

echo ""

echo "<HTML><PRE>"

# это post ???

if [ "$REQUEST_METHOD"="POST" ]; then

QUERY_STRING=`cat -`

fi

# отображение имени метода и кодированной строки

echo "Method : $REQUEST_METHOD"

echo "Query String : $QUERY_STRING"

echo "<HR>"

# используется sed для замены & символом табуляции

LINE=`echo $QUERY_STRING | sed 's/&/ /g' `

for LOOP in $LINE

do

NAME=`echo $LOOP | sed 's/=/ /g' | awk '{print $1}'`

TYPE=`echo $LOOP | sed 's/=/ /g' | awk '{print $2}' | \

sed -e 's/%\(\)/\\\x/g' | sed 's/+/ /g'`

# используется printf для преобразования шестнадцатеричных символов

printf "${NAME}=${TYPE}\n"

VARS=`printf "${NAME}=\\${TYPE}\n"`

eval `printf $VARS`

done

echo "<HR>"

if [ "$contact" != "" ]; then

printf "Hello $contact, it's great to meet you\n"

else

printf "You did not give me your name… no comment !\n"

fi

if [ "$film" != " — Pick a Film —" ]; then

printf "Hey I agree, $FILM is great film\n"

else

printf "You didn't pick a film\n"

fi

if i "$actor" != " —- Pick Your Favourite Actor --" ]; then

printf "So you like the actor $actor, good call\n"

else

printf "You didn't pick a actor from the menu\n"

fi

if [ "$view_cine"="on" ]; then

printf "Yes, I agree the cinema ls still the best place to watch a film\n" else

printf "So you don't go to the cinema, do you know what you're missing\n" fi

if [ "$view_vid"="on" ]; then

printf "I like watching videos at home as well\n"

else

printf "No video!!. you're missing out on all the classics to rent or buy\n'

fi

if [ "$textarea" != "" ]; then

printf " And here are your comments…OK $textarea\n"

else

printf "No comments entered, so no comment !\n"

fi

echo "</PRE>"

echo "</HTML>"

Обратите внимание, что в этом сценарии везде используется функция printf; хотя в некоторых случаях могут быть задействованы конструкции echo (когда не требуется доступ к переменным). Применение функций printf улучшает восприятие сценариев.

Теперь загрузим форму и осуществим тестирование путем отсылки некоторых данных с помощью метода post:

http://<имя_сервера>/cgi‑bin/books.cgi

На рис. 29.11 иллюстрируются данные, введенные на Web–страницу. После завершения ввода некоторых данных щелкните на кнопке "Send". Результаты выполнения этой операции показаны на рис. 29.12.

Рис. 29.11. Форма cgi, в которой используется метод post Linux и UNIX: программирование в shell. Руководство разработчика.. Иллюстрация № 18 Сценарий опрашивает различные переменные для того, чтобы установить факт ввода информации. Затем будет выполнена дальнейшая обработка, позволяющая убедиться в том, что все поля имеют значения. Если значения имеются не для всех полей, форма возвращается пользователю и отображается запрос на повторный ввод информации. Как только форма будет корректно заполнена, ее можно добавить в файл. Таким образом можно создавать небольшие базы данных.

Linux и UNIX: программирование в shell. Руководство разработчика.. Иллюстрация № 19 Рис. 29.12. Данные формы были полностью декодированы с помощью метода post

Практическое применение сценария cgi

Создадим сценарий, который будет выполнять некоторую полезную обработку. Пусть это будет отчет какой‑то фиктивной компании, именуемой Wonder Gifts.

Файл отчета содержит номера различных товаров, проданных в каждом квартале 1998 г. Номера товаров соответствуют отделам Stationery, Books и Gifts.

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

В данном случае форма будет содержать два раскрывающихся меню и переключатель. Одно меню предназначено для выборки по кварталам, второе — для выборки по отделам. Переключатель служит для выбора устройства вывода. В нашем примере отчет выводится только на экран; переключатели выполняют демонстрационную роль.

Ниже приводится файл данных, содержащий сведения о продаже по кварталам. В нем имеются следующие поля: отдел, год, квартал, и количество различных товаров.

$ pg qtr_1998.txt

STAT 1998 1st 7998 4000 2344 2344 BOOKS 1998 1st 3590 1589 2435 989 GIFTS 1998 1st 2332 1489 2344 846 STAT 1998 2nd 8790 4399 4345 679 BOOKS 1998 2nd 889 430 2452 785 GIFTS 1998 2nd 9822 4822 3555 578 STAT 1998 3rd 8911 4589 2344 8690 BOOKS 1998 3rd 333 1489 6322 889 GIFTS 1998 3rd 2310 1483 3443 778 STAT 1998 4th 9883 5199 2344 6456 BOOKS 1998 4th 7333 3892 5223 887 GIFTS 1998 4th 8323 4193 2342 980 Сценарий формы.

$ pg gifts.cgi

t!/bin/sh

# сценарий gifts.cgi …. используется POST

echo "Content‑type: text/html"

echo ""

echo "<HTML>"

echo "<BODY>"

# gifts_result.cgi используется для обработки вывода этой формы

echo "<FORM action="/cgi‑bin/gifts_result.cgi" METHOD=POST>"

echo "<P>"

echo "<HR>"

echo "<H1><CENTER>GIFTS Inc <BR>"

echo "QUARTERLY REPORT</H1></CENTER>"

echo "</P><HR>"

echo "Department: <SELECT NAME=dept>"

echo "<OPTION>GIFTS"

echo "<OPTION>STATIONERY"

echo "<OPTION>BOOKS"

echo "</SELECT>"

echo "Quarter End:<SELECT NAME=qtr>"

echo "<OPTION>1st"

echo "<OPTION>2nd"

echo "<OPTION>3rd"

echo "<OPTION>4th"

echo "</SELECT>"

echo "<BR><BR>"

echo "Report To Co To:<BR>"

echo "<INPUT TYPE="radio" NAME=stdout VALUE=Printer>Printer"

echo "<INPUT TYPE="radio" NAME=stdout VALUE=Screen CHECKED>Screen"

echo "<INPUT TYPE="radio" NAME=stdout VALUE=Both>Both"

echo "<BR><BR><HR>"

echo "<INPUT TYPE=Submit VALUE="Send it">"

echo "<INPUT TYPE=Reset VALUE="Clear">"

echo "</FORM>"

echo "</BODY>"

echo "</HTML>"

Переменной dept присваивается выбранное значение для отдела; переменной qtr присваивается номер выбранного квартала. Переменной stdout присваивается значение "printer", "screen" или "both"; в качестве значения по умолчанию выбирается screen (это значение указывается с помощью слова "CHECKED"). Ниже
ЛитВек: бестселлеры месяца
Бестселлер - Джон Грэй - Практическое пособие по исполнению желаний - читать в ЛитвекБестселлер - Джулия Куин - Где властвует любовь - читать в ЛитвекБестселлер - Элизабет Гилберт - Есть, молиться, любить - читать в ЛитвекБестселлер - Андрей Валентинович Жвалевский - Время всегда хорошее - читать в ЛитвекБестселлер - Макс Фрай - Лабиринт Мёнина - читать в ЛитвекБестселлер - Джоанн Харрис - Шоколад - читать в ЛитвекБестселлер - Розамунда Пилчер - В канун Рождества - читать в ЛитвекБестселлер - Анатолий Александрович Некрасов - Материнская любовь - читать в Литвек