Я ищу те ворота, откуда я вышел.
Вячеслав Бутусов, группа "Наутилус Помпилиус"
К эволюции формата CGI (Common Gateway Interface) в последнее время приковано повышенное внимание специалистов в области интернетовских технологий. Дело в том, что CGI позволяет превратить статическую HTML-страницу в нечто живое - интерактивное, способное благодаря этому надолго "заманить" к себе случайно набредшего на нее посетителя.
Идея создания динамических HTML-страниц в том, что в ответ на некие действия человека, например нажатие кнопки или ввод информации в форму, с Web-сервера вызывается заранее подготовленное приложение, которое анализирует эти действия и выдает пользователю результаты своей работы.
Самый наглядный пример - онлайновые шахматы. Вы подключаетесь к определенной страничке и видите шахматную доску с фигурками, как в обычных игровых программах. Слева от доски - список доступных для вас ходов типа check-boxes и кнопки с различными игровыми настройками. Вы выбираете ход, программа задумывается, и через несколько секунд позиция на доске меняется - программа пошла. Конечно, анимация здесь отсутствует начисто, но тем не менее играть вполне возможно.
Как же это устроено? Оказывается, довольно просто. Само приложение может быть написано практически на каком угодно языке программирования, главное требование - чтобы это приложение могло осуществлять вывод информации в stdout. Очевидно, что наиболее приспособлен для этой цели язык Си.
Платформа при этом может быть выбрана практически любая - от Sun до обычной PC.
Но как вашей программе получить информацию о действиях пользователя? Для этого в HTML-операторе <FORM> надо указать атрибут ACTION с установкой GET. При этом в результате определенных действий пользователя с вашего Web-сервера (или HTML) будет вызвана заранее подготовленная программа в соответствии со спецификацией, указанной в строке ACTION. Она обработает запрос и выдаст результат в stdout с неким префиксом (в ASCII-формате), описывающим свою выдачу. В принципе, это может быть и изображение, и музыкальный клип, и запакованная игра, хотя, как правило, это все же перегружаемая HTML-страница.
Вернемся к шахматам. Вы выбрали ход, с сервера запускается программа, теперь она должна получить информацию о введенном ходе. Для этого служит большой набор переменных окружения HTML-сервера, которые, собственно, и описываются стандартом CGI. Некоторые из них статические, например SERVER_SOFTWARE, характеризующая название и версию вашего сервера; другие переменные устанавливаются динамически в момент запуска программы. В первую очередь это QUERY_STRING, которая и содержит "запрос" к вашему приложению, в нашем случае это будет строка с текстом хода типа "e2 - e4".
Теперь программа меняет позицию после вашего хода (как она это делает - в следующем абзаце), и вы начинаете ждать ответа. Вообще-то разработчики самого свежего стандарта CGI 1.1 не рекомендуют использовать приложения, заставляющие человека подолгу мучиться за монитором в ожидании ответа, но для шахмат это вполне простительно.
После того как программа проанализировала ситуацию, ей необходимо показать человеку ответный ход. Для этого она просто пишет в stdout текст HTML-страницы, которая статически будет отображать уже новую позицию - после хода программы. В нее включен также модифицированный список новых возможных ходов. Эта страничка автоматически перезагружается сервером в ваш просмотрщик.
Конечно, несмотря на то что генерация новой странички в полностью текстовом виде не такая трудная задача для нормального программиста, при попытках реализации достаточно сложных динамических приложений типа справочных систем снижение производительности становится весьма заметным.
Здесь на помощь приходит язык Java. Он позволяет забыть про CGI, правда, за каждое удобство в мире программирования приходится расплачиваться, поэтому простота создания динамических HTML-страниц в силу стремления авторов Java сделать его максимально переносимым оборачивается проблемами при попытках красочно и эффектно оформить вашу страничку.
Однако в игру уже вступила еще и Microsoft. Несколько лет назад это был бы Borland, но по ряду самых разных причин семейство MS VC-компиляторов стало, по крайней мере на сегодня, на мой взгляд, значительно более профессиональным, чем продукты их вечного конкурента, хотя MS-компиляторы по-прежнему уступают им в удобстве работы и организации интерфейса.
Новый продукт MS VC++ 4.1 отличается от версии 4.0 гораздо больше, чем кажется на первый взгляд. Я бы лично поставил этому компилятору номер 4.99.
В новой версии MFC обеспечена практически всесторонняя поддержка Интернет! И про CGI опять-таки можно смело забыть. В частности, класс CHttpServer (из семейства классов, поддерживающих Internet Server API, ISAPI, позволяющих значительно расширить возможности Web-сервера) позволит вам создавать динамические странички любой красоты без низкоуровневого, если так можно в данном контексте выразиться, CGI-программирования и длительного тестирования.
Однако для ряда немайкрософтовских операционных систем, хотя бы для того же UNIX, вопросы, связанные с использованием интерфейса CGI, по-прежнему остаются актуальными, поэтому всем, кто интересуется этой проблемой, я советую обратиться в недавно появившуюся, но уже ставшую невероятно популярной конференцию http://www.comp.infosystems.authoring.cgi.
Сергей Бобровский