Начиная с этой лекции, мы вступим в процесс обучения программированию CGI. Благодаря предыдущим лекциям вы овладели базовыми знаниями программирования CGI. Теперь вы можете сесть и написать свою программу CGI!
3. Программирование CGI
1. Серверное подключение (SSI) и шлюз.
2. Шлюз: подключение других протоколов через WEB.
В процессе написания CGI-программ лучше всего следовать следующим пунктам проектирования приложения:
(1) Задайте вопрос – проблему, которую вы хотите решить.
(2) Этап проектирования — определение базовой структуры и функций программы CGI.
(3) Этап кодирования – реализация идей действиями.
(4) Трансплантация программы — написание переносимого кода.
(5) Стремитесь к совершенству – поднимите программу на более высокий уровень.
1. Серверное подключение (SSI) и шлюз.
В этом разделе мы представим SSI (Server Side Include) и шлюз. Строго говоря, SSI не является частью программирования CGI, но SSI может выполнять некоторые задачи, которые могут выполнять простые программы CGI, и иногда SSI является даже лучшим выбором. Поэтому здесь дается краткое введение.
SSI определяет набор команд, встроенных в текст HTML. Прежде чем текст HTML будет отправлен HTTP-клиенту, WEB-сервер предварительно обрабатывает эти команды SSI и выводит обработанный текст HTML в браузер HTTP-клиента.
Формат команды SSI:
< !--# параметр команды="значение" -->
Команды SSI отличаются от Java или JavaScript тем, что они обрабатываются на стороне сервера, а не на стороне клиента. Это похоже на программы CGI. Конечно, в пределах функционального объема SSI имеет те же преимущества, что и программы CGI. Он может улучшить использование ресурсов сервера, и любой WEB-браузер на клиенте может просматривать текст HTML, содержащий SSI.
Ниже приведены шесть часто используемых команд SSI:
(1) Включить команду
(2) эхо-команда
(3) команда выполнения
(4) команда конфигурации
(5) команда fsize
(6) команда флешмода
включить команду
Единственным поддерживаемым параметром является файл, который вставляет содержимое файла, указанного параметром файла, в текущий текст HTML. Если вы знаете язык C, вы увидите, что он имеет ту же функцию, что и команда «#include» на языке C. Например, есть два HTML-текста: main.html и header.html. Используйте команду include в main.html: main.html:
<html>
<tilte> Тестирование включения команды SSI </ /title>
< !--#include file="header.html" -->
<тело>
Приведенный выше заголовок взят из header.html!
</тело>
</html>
заголовок.html:
< H1> Это заголовок в header.html </H1>!
(Однако кажется, что OmniHTTPD не поддерживает команду включения :< !)
эхо-команда
Единственный поддерживаемый параметр — var, который используется для отображения переменных, предоставляемых сервером, например:
DOCUMENT_NAME: текущее имя файла
DOCUMENT_URL: относительный путь к тексту SSI.
DATE_LOCAL: местная дата
DATE_GMT: дата по Гринвичу (стандартное время по Кринвичу).
LAST_MODIFIED: дата последнего изменения файла, содержащего эту команду SSI.
HTTP_USER_AGENT: имя браузера.
Например: main.shtml <html>
Последний раз этот документ обновлялся < !--#echo var="LAST_MODIFIED"-->
</html>
Когда вы открываете main.shtml в браузере, вы можете увидеть время последнего изменения. (Следует отметить, что файл main.shtml должен храниться в каталоге HtDocs OmniHTTPD и доступен в браузере по адресу http://localhost/main.shtml.)
команда выполнения
Два параметра — cgi и cmd. Первый вызывает исполняемый файл, например cgi="/cgi-bin/finger.cgi"; второй вызывает системную команду, например cmd="ls". К сожалению, OmniHTTPD не поддерживает эту команду SSI (возможно, последняя версия сейчас поддерживает).
команда конфигурации
Эта команда устанавливает способ обработки сервером файлов и отображения дат. Он имеет два параметра:
(1) timefmt определяет формат отображения дат. Используйте man strftime в UNIX для запроса доступных значений.
(2) sizefmt определяет формат отображения длины файла. Значение — байты или адрес. Эта команда также не поддерживается в OmniHTTPD.
команда fsize
Эта команда отображает размер данного файла. Параметром является файл, определяющий путь и имя файла.
команда флешмода
Эта команда отображает дату последнего изменения указанного файла. Параметром является файл, определяющий путь и имя файла.
2. Шлюз: подключение других протоколов через WEB.
Протокол HTTP не может получить доступ ко всем ресурсам в Интернете. Если вы хотите получить доступ к ресурсам, отличным от протокола HTTP (например, POP3 и SMTP для отправки и получения электронной почты), вам понадобится шлюз. Программа CGI — хороший способ реализовать шлюз.
Некоторые часто используемые шлюзы предусмотрены на многих HTTP-серверах UNIX, например, Finger, Wais, Archie и т. д. Но в OmniHTTPD эти шлюзы не предусмотрены. Но мы можем добавить в OmniHTTPD функциональность шлюза, написав программы CGI.
Формы и их обработка
HTML-формы являются частью WEB-документов и используются для отправки на сервер информации, заполненной пользователями. Обычно эта информация передается в программу CGI, которая выполняет ряд операций или обработку данных на основе входной информации, а затем генерирует HTML-документ, представляющий результаты обработки, и отправляет его обратно в браузер клиента.
Видно, что ключевой частью программы CGI является получение входных данных и генерация HTML-документов, а части операций и обработки данных такие же, как и в большинстве приложений. В этой лекции я расскажу, как получать данные и выводить HTML-документы в Perl и Delphi.
Сначала мы создаем HTML-документ с именем Greeting.html:
файл Greeting.html (хранится в каталоге HtDocs OmniHTTPD)
<html>
<голова>
<title>Это страница приветствия </title>
< h1> Приветствие </ /h1>
<тело>
<час>
<form action="/cgi-bin/greeting.pl" метод=POST>
< p> Ваше имя: < input type=text name="firstname" size=60 maxlength=80> </p>
< p> Ваша фамилия: < input type=text name="lastname" size=60 maxlength=80> </p>
<час>
< p> < input type=submit value="Все ОК!"> < input type=reset value="Очистить все"> </ /p>
</форма>
</тело>
</html>
Вот программа Perl CGI Greeting.pl:
Файл Greeting.pl (хранится в каталоге cgi-bin OmniHTTPD) # Приветствую вас!
требуется «cgi-lib.pl»;
# ==================================
# получаем входные значения
&ReadParse(*вход);
$mFirstName = $input{'firstname'};
$mLastName = $input{'lastname'};
# ==================================
# выполняем здесь некоторые операции
$mFullName = "$mFirstName $mLastName";
# ==================================
# создаем HTML-документ для вывода
PRint&PrintHeader;
print "< html>< head>< title> Приветствую вас! <//title>< /head> ";
print "<body> Привет, <i>$mFullName</i> ! ";
print "< hr> от Greeting.pl </body>< /html>";
# ==================================
# Все готово!
Протестируйте программу CGI, просмотрев http://localhost/greeting.html.
В приведенной выше программе Perl, как программе CGI, вы должны использовать require «cgi-lib.pl» для ссылки на файл cgi-lib.pl. Этот файл содержит множество функций и процедур для программирования CGI. require эквивалентен #include в C, но следует отметить, что после оператора require должна стоять точка с запятой.
Процесс ReadParse считывает данные, отправленные формой HTML, а параметром является указатель массива. Следует отметить, что в Perl перед вызовами функций и процедур должен стоять символ &.
mFirstName, mLastName и mFullName являются переменными. В Perl именам переменных должен предшествовать знак $.
Фактическое возвращаемое значение функции PrintHeader — «Тип контента: text/html», которое сообщает браузеру, что следующие данные являются HTML-документом.
Создать HTML-документ очень просто: достаточно использовать оператор печати для вывода содержимого HTML-документа. Как насчет этого? Можете ли вы использовать Perl для написания программ CGI?
Далее давайте напишем программу на Delphi, выполняющую ту же функцию:
Сначала закройте все проекты в Delphi, выберите меню «Файл/Новый», выберите в диалоговом окне тип приложения «Веб-сервер» и используйте опцию «Автономный исполняемый файл CGI». Появится новый проект с именем главного окна WebModule1.
Дважды щелкните мышкой по свойству Actions WebModule1, и появится окно редактирования свойства Actions. Создайте в окне новое действие с именем WebActionItem1, установите для его свойства Default значение True и дважды щелкните событие OnAction в его событиях, добавьте следующий код:
процедура TWebModule1.WebModule1WebActionItem1Action (Отправитель: TObject; Запрос: TWebRequest; Ответ: TWebResponse; var Обработано: Boolean);
вар
mFirstName, mLastName, mFullName: строка;
ХтмлДок: строка;
начинать
// Получаем входные значения:
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// Выполняем здесь некоторые операции
mFullName:= mFirstName + ' ' + mLastName;
// Создаем HTML-документ для вывода
HtmlDoc := '< html>< head>< title> Приветствую вас </ /title>< /head>';
HtmlDoc := HtmlDoc + '<body> Привет, <i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> от Greeting.cgi </body>< /html>';
Response.Content := HtmlDoc;
конец;
Сохраните модуль этого проекта как cgimain.pas и проект как Greeting.dpr. После компиляции (с помощью сочетания клавиш Ctrl+F9) скопируйте файл Greeting.exe в каталог cgi-bin OmniHTTPD и переименуйте его в Greeting.cgi. В то же время измените файл Greeting.html, который мы написали ранее, следующим образом:
Измените метод < form action="/cgi-bin/greeting.pl" = POST> на
<form action="/cgi-bin/greeting.cgi" метод=POST>
Таким образом, вы можете протестировать программы CGI, написанные на Delphi, посетив http://localhost/greeting.html.
Как видно из этой программы, в Delphi событие OnAction WebActionItem возникает, как только программа CGI получает запрос. В этом случае ввод данных и генерация HTML-документа выполняются следующим образом:
Получите значение элемента формы через Request.ContentFields.Values[имя элемента формы HTML].
Создавайте HTML-документы, присваивая значение Response.Content.
Ниже приводится содержимое трех файлов программы Delphi: ------------------------------------ ---- -------------------
приветствие.дпр:
программа-приветствие;
{$APPTYPE КОНСОЛЬ}
использует
HTTPApp,
CGIApp,
cgimain в «cgimain.pas» {WebModule1: TWebModule};
{$E cgi}
{$R *.RES}
начинать
Приложение.Инициализировать;
Application.CreateForm(TVWebModule1, WebModule1);
Приложение.Выполнить;
конец.
-------------------------------------------------- ----------
cgimain.pas:
модуль cgimain;
интерфейс
использует Windows, Сообщения, SysUtils, Классы, HTTPApp;
тип
TWebModule1 = класс (TVWebModule)
процедура WebModule1WebActionItem1Action (Отправитель: TObject; Запрос: TWebRequest; Ответ: TWebResponse; var Обработано: Boolean);
частный
{Частные заявления}
общественный
{Публичные заявления}
конец;
вар
ВебМодуль1: ТВВебМодуль1;
выполнение
{$R *.DFM}
процедура TWebModule1.WebModule1WebActionItem1Action (Отправитель: TObject; Запрос: TWebRequest; Ответ: TWebResponse; var Обработано: Boolean);
вар
mFirstName, mLastName, mFullName: строка;
ХтмлДок: строка;
начинать
// Получаем входные значения:
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// Выполняем здесь некоторые операции
mFullName:= mFirstName + ' ' + mLastName;
// Создаем HTML-документ для вывода
HtmlDoc := '< html>< head>< title> Приветствую вас </ /title>< /head>';
HtmlDoc := HtmlDoc + '<body> Привет, <i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> от Greeting.cgi </body>< /html>';
Response.Content := HtmlDoc;
конец;
конец.
-------------------------------------------------- ----------
cgimain.dfm:
объект WebModule1: TWebModule1
Олдкреатеордер = ложь
Действия = <
элемент
По умолчанию=Истина
Имя = 'WebActionItem1'
OnAction = ВебМодуль1ВебДействиеЭлемент1Действие
конец>
Слева = 192
Топ = 107
Высота = 150
Ширина = 215
конец