HTML и CGI
Общий шлюзовой интерфейс - ключ к интерактивным узлам Web.
ОБЩИЙ ШЛЮЗОВОЙ
ИНТЕРФЕЙС
HTML, вместе
с HTTP, представляет собой базовую
технологию World Wide Web. Наиболее
привлекательная возможность HTML -
гипертекстовые ссылки. При поиске
информации в обычной книге, вы
должны открыть содержание, а затем
пролистать книгу, чтобы отыскать
нужную страницу. В
противоположность этому, когда вы
ищите информацию на Web, простое
нажатие на гиперссылку приводит к
мгновенному переходу на выбранную
страницу - быстро и удобно. Однако
HTML предлагает информацию главным
образом для чтения. Он не является
интерактивным, за исключением тех
случаев, когда вы для перемещения
по документам используете мышь.
Страницы HTML - это статические
документы; они не изменяются до тех
пор, пока кто-то (обычно
администратор Web) не обратится к
серверу Web и не отредактирует их.С
самого начала разработчики Web
искали способы сделать серверы Web
интерактивными, для того чтобы дать
возможность пользователям не
только получать, но и вводить
информацию. Стандартный способ
создания такой информации теперь
известен как общий шлюзовой
интерфейс. Пользователь
запрашивает информацию у сервера
Web, а тот, используя CGI, запускает
программу для поиска информации и
возвращает результат пользователю.
Для этого сервер Web обычно
генерирует страницу HTML,
посредством вставки нескольких
операторов HTML в уже существующую
страницу. Сервер Web, применяющий CGI
таким образом, может потенциально
запускать самые разнообразные
программы.Если вы использовали
механизм поиска Web для того, чтобы
найти интересующий вас текст, то вы
применяли CGI. Но CGI сам по себе не
является механизмом поиска. На
самом деле он обеспечивает
взаимодействие таких программ, как
механизмы поиска, с серверами Web.
Серверы HTTP (Web) в первую очередь
предназначены для обслуживания
документов HTML. Файлы CGI, однако, не
документы, а программы. Для
хранения программ CGI большинство
серверов используют специальный
каталог, обычно называющийся CGI-BIN.
Сервер Web знает, что файл,
хранящийся в каталоге CGI-BIN, должен
исполняться, а не пересылаться для
воспроизведения пользовательскому
браузеру Web. Программы CGI могут быть
написаны на самых разных языках, в
том числе на языке командных файлов
DOS, BASIC, C и языках описания
сценариев, например Perl. Задача CGI
как раз в том и состоит, чтобы в
нужное время активизировать
программу CGI и передать программе
любые необходимые данные,
созданные пользователем или
операционной средой. Программа CGI
затем обрабатывает вводимые
данные. Выполнив эту обработку
(время исполнения - максимум
несколько секунд, поскольку целью
является интерактивность),
программа должна вернуть некоторый
результат пользователю через его
браузер Web. Для того чтобы браузер
мог воспроизвести результат,
программа CGI должна преобразовать
свои выходные данные в документ HTML.
ФОРМА НА
ЛЮБОЙ СЛУЧАЙ
Программа
CGI должна каким-то образом получить
от пользователя данные для
обработки. И тут в игру вступают
формы HTML. Они похожи на бумажные
бланки ввиду наличия полей для
ввода некоторых элементов данных.
Ниже показана простая форма,
имеющая одно поле для ввода текста:
имя продукта. Кроме того, у этой
формы есть поля выбора из
нескольких категорий, в которых
пользователь может, например,
отметить тип продукта, а также
указать, какой из сетевых
протоколов этот продукт
поддерживает. Форма еще имеет
кнопку, на которую пользователь
должен нажать для передачи
введенной информации. (Программа CGI
начнет обрабатывать информацию,
только когда данные в форме будут
переданы программе CGI.) Нажатие
кнопки Clear Form приводит к присвоению
всем переменным формы значения по
умолчанию. Код HTML для этой формы
ниже.
Пример формы HTML с несколькими различными полями ввода, в том числе текстовым полем, кнопками переключения и флажками.
Product name:
Select product type:
Bridge Router Switch
Protocols handled:
IP IPX AppleTalk
ПРИМЕР КОДА ФОРМЫ HTML
1 <FORM
ACTION="/CGI-BIN/EXAMPLE.PLI METHOD="GET">
2 <H5>Please enter the following
information:</H5><BR>
3 Product name:
4 <INPUT TYPE="TEXT" NAME="NAME"
size="25" MAXLENGTH ="30"><BR>
5 Select product type:
6 <INPUT TYPE="RADIO" NAME="ProdType"
VALUE="Bridge" CHECKED> Bridge
7 <INPUT TYPE="RADIO" NAME="ProdType"
VALUE="Router"> Router
8 <INPUT TYPE="RADIO" NAME="ProdType"
VALUE="Switch"> Switch<P>
9 Protocols handled: <INPUT TYPE="CHECKBOX"
NAME="IP" CHECKED> IP
10 <INPUT TYPE="CHECKBOX" NAME="IPX"
CHECKED> IPX
11 <INPUT TYPE="CHECKBOX" NAME="AppleTalk"
CHECKED> AppleTalk
12 <INPUT TYPE="SUBMIT" VALUE="Press here to
submit your entry">
13 <INPUT TYPE="RESET" VALUE="Clear
Form">
14 </FORM>
Отметим, что
указанные номера строк, в реальной
программе на HTML отсутствующие,
введены для упрощения
изложение.Исходный код формы
окружают теги <FORM ACTION =
"/SGI-BIN/EXAMPLE.PL"> и </FORM> (см.
строки 1 и 14). ACTION определяет
действия, которые будут
предприняты после передачи формы.
Иными словами, ACTION определяет,
какая программа CGI должна быть
запущена для обработки формы, и вы
указываете или полный, или
частичный URL данной программы (в
нашем случае это /SGI-BIN/EXAMPLE.PL). В
зависимости от сервера Web вы можете
задать для всех программ CGI каталог
по умолчанию. Если программа,
которую вы хотите запустить,
хранится в этом каталоге, то
достаточно указывать только имя
файла, ее содержащего. В противном
случае вам, возможно, придется
написать полный URL файла.METHOD
используется для передачи входных
данных из формы в программу CGI,
обрабатывающую эти данные.
Несколько позже мы подробно
рассмотрим представленный здесь
метод, а пока отметим, что можно
использовать два основных метода:
GET и POST. Если вы собираетесь
применять для передачи данных из
формы в программу CGI, указанную в
ACTION= "/SGI-BIN/EXAMPLE.PL", метод GET,
убедитесь, что эта программа CGI
способна воспринимать данные,
переданные таким образом. Кроме
того, если вы используете для
передачи данных из вашей формы
метод POST, удостоверьтесь, что
программа ожидает получения данных
именно по этому методу.
Строки 2 и 3 Распечатки 1 сообщают
пользователю о том, что нужно
ввести данные. Следующая затем
строка программы помещает в форму
текстовое поле (строка 4). Ввод INPUT
TYPE="TEXT" информирует браузер Web
о том, что это поле является
текстовым. Определение NAME="NAME"
указывает имя поля - NAME. (В нашем
примере запрашивается название
продукта; если вы хотите попросить
пользователя ввести адрес, то
можете назвать это поле ADDRESS.)
SIZE="25" говорит о том, что
текстовое поле будет иметь размер,
достаточный для отображения 25
символов одновременно.
MXLENGTH="30" означает, что поле
может вмещать до 30 символов текста.
Иначе говоря, если вы наберете
больше 25 символов, текст начнет
сдвигаться. Как только число
введенных символов достигнет 30,
никакие дополнительные символы
ввести больше не удастся, и
последует предупредительный
сигнал.Далее в форме расположены
кнопки переключения, а еще ниже -
рамки для выставления флажков. И те
и другие позволяют осуществлять
выбор среди нескольких
возможностей, но они несколько
отличаются по своему назначению. Вы
можете одновременно отметить
несколько флажков, но выбрать
только одну кнопку переключения.
Для сравнения, выбор одного флажка
не отменяет выбора другого. Давайте
сначала поговорим о кнопках
переключения. Кнопка определяется
указанием RADIO в качестве типа ввода.
Три строки (с 6 по 8) относятся к
кнопкам переключения, каждую из
которых можно выбрать. Все строки
содержит комбинацию NAME="PRODTYPE",
определяя логическое поле с именем
PRODTYPE. Если отмечена первая кнопка,
поле PRODTYPE примет значение BRIDGE.
(Значение определяется комбинацией
"VALUE="BRIDGE"".) Обратите
также внимание на ключевое слово
CHECKED в строке 6. При первом появлении
формы будет выделена кнопка BRIDGE;
иными словами, это значение мы
сделали значением по умолчанию;
пользователь может изменить его,
нажав на кнопки Router или Switch.Далее
идет серия из трех флажков,
позволяющих выбрать, какой из
сетевых протоколов поддерживает
продукт (строки с 9 по 11). При щелчке
в рамке флажка появляется "X",
указывающий на то, что флажок
поднят; при повторном щелчке
"X" исчезает, т.е. флажок
снимается. Рамка флажка создается
при помощи фразы "INPUT
TYPE="CHECKBOX". Для того чтобы
программа работала правильно, вы
должны определять тип вводимого
параметра как одно слово. Вы должны
также указать название поля ввода.
В Распечатке 1 имя поля ввода для
первого флажка определено как IP.
Как видите, код содержит еще
ключевое слово CHECKED, указывающее на
то, что по умолчанию этот флажок
будет отмечен; очистить его
пользователь может, просто щелкнув
в рамке.Когда флажок поднят,
значение по умолчанию для поля с
этим именем равно "ON". Хотя в
примере это не указано, вы можете
дополнительно использовать
атрибут VALUE для установки значения,
например "GREEN", в случае если
этот флажок отмечается. В нашем
примере все три флажка по умолчанию
выделены. Таким образом, если
пользователь не снимет флажок,
форма вернет значения IP=ON, IPX=ON и
APPLETALK=ON. Если отмечен только флажок
IP, форма вернет только IP=ON. Флажки,
соответствующие IPX и APPLETALK, мы не
включили.Строка 12 определяет
кнопку SUBMIT. После заполнения формы
для ее передачи программе CGI,
запускаемой на сервере Web,
пользователь должен нажать на
кнопку SUBMIT. Как можно видеть в
строке 12, кнопка SUBMIT создается при
указании SUBMIT в качестве типа ввода.
Текст, размещаемый на кнопке, можно
задать в переменной VALUE.Когда
пользователь нажимает на кнопку
SUBMIT, браузер Web предпринимает
некоторые действия, определенные в
ACTION для этой формы (например, как в
строке 1). В данном случае сервер Web
запустит сценарий на языке Perl,
который в нашем примере называется
EXAMPLE.PL и расположен в каталоге
CGI-BIN.Как сервер Web узнает о том, что
ему нужно выполнить программу, а не
просто передать ее в ответ на
запрос браузера Web? Это следует из
названия каталога, где программа
находится - CGI-BIN. В большинстве
серверов Web этот каталог
зарезервирован специально для
исполняемых файлов. (Вы можете
хранить исполняемые файлы и в
других каталогах, но CGI-BIN должен
содержать все файлы,
предназначенные для удаленного
запуска через Web.)Хранение всех
исполняемых файлов в каталоге CGI-BIN
является, кроме того, хорошей мерой
защиты. Как администратор Web, вы
должны разрешить серверу Web
выполнять только находящиеся в
этом каталоге программы. Помимо
этого, тщательно проверьте все
программы, помещаемые в данный
каталог, и убедитесь, что они не
могут быть использованы для порчи,
или замены файлов, или обхода мер
защиты. Если, к примеру, кто-то может
применять одну из ваших программ
для того, чтобы прочитать файл
системных паролей, защита вашей
системы никуда не годится. В
рассматриваемом нами примере мы
упомянули Perl, Practical Extraction and Report
Language. Для тех, кто с ним не знаком,
поясним. Perl представляет собой
интерпретируемый язык, который
изначально разрабатывался для
использования в Unix-системах, но
сейчас он перенесен во многие
другие операционные системы.
Интерпретаторы Perl существуют,
например, для систем Macintosh и Windows NT.
Программы на языке Perl обычно
называют сценариями, поскольку, по
сравнению с разработкой программ
на C и других стандартных языках
программирования, создаются они
относительно быстро и просто. Perl
ближе к языку командных файлов DOS,
нежели к классическим языкам
программирования. Особенно хорош
Perl в работе со строками, что, как вы
уже имели возможность убедиться,
очень важно для программирования
CGI.Строка 13 описывает кнопку Reset.
Если пользователь нажмет на эту
кнопку, все параметры
устанавливаются равными значениям
по умолчанию. В нашем примере будут
отмечены кнопка переключения Bridge и
все три флажка (IP, IPX и AppleTalk). При
нажатии на кнопку Submit информация
передается серверу Web в виде пар из
имен полей (также называемых
ключами) и значений. Предположим,
что в приводимом нами примере формы
пользователь в качестве имени
продукта ввел SuperDuper, отметил кнопку
переключения Router и в качестве
поддерживаемых протоколов указал IP
и IPX. В этом случае, при нажатии на
кнопку Submit, форма будет передана с
параметрами NAME=SuperDuper, IP=ON и IPX=ON.
(Если флажок AppleTalk снят, то значения
поля AppleTalk ("AppleTalk=off") просто не
будет переданон.)Итак, мы
рассмотрели, как формы HTML получают
информацию от пользователя Web и
передают ее программе CGI в виде пары
ключ/значение. Поскольку оператор
ACTION, заданный в открывающем теге
<FORM>, указывает на файл,
расположенный в каталоге CGI-BIN,
сервер Web знает, что указанный файл
должен быть запущен, а не показан
запрашивающим браузером Web, как это
было бы в случае простого документа
HTML.
ЗНАКОМЯСЬ
С CGI
Создание
программ CGI не слишком отличается
от написания других типов программ.
Рискуя слишком упростить, мы бы
охарактеризовали программирование
как получение входной информации
от пользователя или из файла данных
и сохранение ее в переменных
программы с их последующей
обработкой и пересылкой
результатов либо в файл, либо на
экран. Программисты знают, что
программы обычно получают входные
данные с логического устройства,
известного как устройство
стандартного ввода (для краткости
STDIN), и посылают выходные данные на
устройство стандартного вывода
(STDOUT). Чаще всего STDIN и STDOUT
представляют собой консоль
компьютера (клавиатуру и
видеодисплей), но большая часть
операционных систем поддерживает
перенаправление, поэтому STDIN и STDOUT
могут быть и файлами на диске, и
другими устройствами.Многие
операционные системы и языки
программирования также используют
переменные окружения - переменные,
которые могут быть установлены в
операционной системе и прочитаны
программами, или наоборот.
Переменные окружения позволяют
обмениваться информацией либо
операционной системе и исполняемой
программе, либо программам,
написанным на разных языках.
Программы CGI похожи на обычные. Они
тоже получают информацию со STDIN или
через переменные окружения и
посылают выходные данные на STDOUT.
Для того чтобы понять принцип
взаимодействия браузера Web с
программой CGI, нам необходимо
вернуться немного назад и
рассмотреть, каким образом браузер
передает простые запросы HTML и как
на них реагирует сервер
Web.Предположим, вы вставляете
следующую гипертекстовую ссылку в
свой документ HTML:
<A
HREF="TEST.HTML">
Если
выбрать эту ссылку, браузер
инициирует следующий запрос
серверу Web:
GET /TEST.HTML
HTTP/1.0
Accept: text/plain
Accept: text/html
Каждая
из этих строк называется
заголовком. Первая представляет
собой заголовок GET, сообщающий
серверу Web о том, что браузер хочет
получить документ TEST.HTML и что он
использует версия 1.0 протокола
Hypertext Transport Protocol. Поскольку в этом
случае было указано только имя
файла, сервер Web по умолчанию ищет
файл в корневом каталоге сервера
для документов Web. Если хотите
получить файл, расположенный во
вспомогательном каталоге, ваша
гипертекстовая ссылка должна
содержать полное имя пути к файлу
относительно корневого каталога
для Web-документов. Если вы хотите
сослаться на файл, находящийся на
другом сервере Web, в гипертекстовой
ссылке должен быть указан полный URL
для этого файла.Вслед за заголовком
GET идут два заголовка Accept,
указывающие на то, что браузер
может воспринимать файлы с обычным
текстом или текстом в формате HTML.
Если браузер может воспринимать
большее число типов данных, в
запросе появится больше заголовков
Accept, описывающих каждый тип данных
в терминах Multipurpose Internet Mail Extensions (MIME).
Реакция сервера Web на этот запрос
будет выглядеть примерно следующим
образом:
HTTP /1.0 200
OK
Date: Monday, 24-May-96
11:09:05 GMT
Server: NCSA/1.3
MIME-version 1.0
Content-type: text/html
Content-length: 231
<HTML>
<HEAD>
<TITLE> Заголовок документа</TITLE>
</HEAD>
Пример страниц на HTML.
</HTML>
Заголовок
"Server" передает серверу Web имя и
номер версии, а также версию
используемого HTTP. Другие заголовки
описывают тип информационного
наполнения (в нашем случае это
текст в формате HTML) и длину (231 байт)
передаваемого документа. Браузер Web
затем читает и обрабатывает
HTML-сегмент этого файла.В случае с CGI
вся эта процедура не сильно
отличается, за исключением того,
что запрашиваемый файл будет
находиться в каталоге CGI-BIN. Это
указывает серверу Web на то, что
требуемый файл должен быть
выполнен, а не послан браузеру Web
для отображения как документ
HTML.Выше я уже отмечал, что
информация, получаемая от
пользователя или его браузера Web,
может быть послана серверу Web одним
из двух способов: по методу GET или
POST.При методе GET все данные формы
включаются в URL в так называемую
строку запроса. Для примера
предположим, что у нас есть простая
форма, имеющая только два поля,
которые называются COLOR и SIZE, и что
пользователь ввел SKY BLUE и LARGE
соответственно. Давайте также
предположим, что программа CGI,
которая, как предполагается, будет
обрабатывать данные, является
сценарием на языке Perl, именуется
EXAMPLE.PL и находится в каталоге CGI-BIN.
Вы нажимаете кнопку Submit, и браузер,
предварительно сформировав запрос
HTML, отправит его серверу Web.Код
формы HTML должен содержать оператор
ACTION, а также сообщить серверу Web,
какой из методов (в нашем случае GET)
будет использован для пересылки
данных. Таким образом, первым
оператором нашей формы станет:
<FORM ACTION="/CGI-BIN/EXAMPLE.PL"
METHOD="GET">
Это позволит серверу Web узнать
полный путь к программе, которая
должна быть запущена
("/CGI-BIN/EXAMPLE.PL"), а также то, что
следует применять метод GET. Как
отмечалось раньше, метод GET
использует строку запроса для
передачи данных программе CGI. В
нашем примере, когда пользователь
нажимает кнопку Submit, его браузер Web
сделает следующий запрос серверу
Web:
GET
/CGI-BIN/EXAMPLE.PL? COLOR=SKY%20BLUE&size=LARGE HTTP 1.0
Строка
текста, следующая за знаком
вопроса, представляет собой строку
запроса. В ответ на этот запрос
сервер запускает сценарий EXAMPLE.PL и
помещает строку COLOR=SKY% 20BLUE&size=LARGE
HTTP 1.0 в переменную окружения QUERY_STRING.
ПОДРОБНОСТИ
В INTERNET
Одним из
лучших способов получить
информацию о сервисах Internet, таких
как World Wide Web, является сама Web. Для
этого можно использовать механизм
поиска AltaVista компании Digital (http://www.altavista.digital.com), указав в качестве
параметра поиска "common gateway interface".
Воспользоваться поиском можно
прямо здесь: