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 с несколькими различными полями ввода, в том числе текстовым полем, кнопками переключения и флажками.

##### Please enter the following information:

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".
Воспользоваться поиском можно прямо здесь: