CGI-интерфейс
Разработка CGI-программ
Самым простым и исторически самым первым способом создания динамических ресурсов для сети Интернет является использование интерфейса CGI.
CGI-интерфейс
Common Gateway Interface (CGI) является стандартом интерфейса внешней прикладной программы с Web сервером. Их взаимодействие иллюстрируется рис.4.1.
Рис. 4.1. Распределение функций между уровнями с использованием интерфейса CGI
Клиентская часть приложения представляет собой HTML-документ, в котором реализован интерфейс с пользователем. Реализуется в основном посредством форм, хотя могут использоваться и другие элементы, в том числе скрипты и апплеты.
Серверная часть состоит из исполняемого модуля, решающего основные задачи обработки данных, поступающих от клиентской части, формирования ответа в формате HTML, и т.д. Такой модуль называется cgi-модулем или расширением сервера.
Сам интерфейс CGI представляет собой правила взаимодействия сервера с внешним по отношению к нему модулем (cgi-модулем). Он определяет 4 информационных потока (рис. 4.2):
· стандартный входной поток;
· стандартный выходной поток;
Рис. 4.2. CGI-интерфейс.
Переменные окружения в среде любой ОС служат для связи между процессами, они представляют собой набор специальных переменных, значения которых устанавливаются перед запуском программы и доступны программе в ходе выполнения. Состав переменных и их имена зависят от процесса, запускающего данную программу.
Этих переменных достаточно много, они содержат различные данные, в частности:
SERVER_SOFTWARE — содержит информацию о Web-сервере (название/версия);
GATEWAY_INERFACE — содержит информацию о версии CGI(CGI/версия);
CONTENT_LENGTH — значение этой переменной соответствует длине стандартного входного потока в символах;
CONTENT_TYPE — эта переменная специфицирована для запросов содержащих дополнительную информацию, таких как HTTP POST и PUT, и содержит тип данных этой информации;
REQUEST_METHOD — метод запроса, который был использован «POST»,»GET»,»HEAD» и т.д.;
PATH_INFO — значение переменной содержит полученный от клиента виртуальный путь до cgi-модуля;
PATH_TRANSLATED-значение переменной содержит физический путь до cgi-модуля, преобразованный из значения PATH_INFO;
QUERY_STRING — значение этой переменной соответствует строке символов следующей за знаком «?» в URL соответствующему данному запросу;
HTTP_USER_AGENT — название программы просмотра, которую использует клиент при посылке запроса.
Аргументы командной строки. Кроме переменных окружения запускаемой программе передается список параметров, помещаемых в командную строку при запуске. СGI-модуль в командной строке от сервера получает:
· остаток URL после имени cgi-модуля в качестве первого параметра (первый параметр будет пуст, если присутствовало только имя cgi-модуля);
· список ключевых слов в качестве остатка командной строки для скрипта поиска или чередующиеся имена полей формы с добавленным знаком равенства и соответствующих значений переменных.
Стандартный входной поток. Состав данных, направляемых сервером во входной поток СGI-модуля, зависит от использованного клиентом метода запроса.
В случае метода запроса POST данные передаются как содержимое HTTP запроса в следующей форме:
где name — имя переменной,
value — значение переменной,
N — количество переменных
При этом устанавливаются значения переменных окружения CONTENT_LENGTH и CONTENT_TYPE.
Таким образом, если в результате использования формы с аргументом тега FORM — METHOD=»POST» сформирована строка данных firm=МММ&price=100023, то сервер установит значение CONTENT_LENGTH равным 21 и CONTENT_TYPE в application/x-www-form-urlencoded, а в стандартный поток ввода посылается блок данных.
В случае запроса метода GET, строка данных передается как часть URL. Например,
В этом случае переменная окружения QUERY_STRING принимает значение name1=value1&name2=value2, а во входной поток ничего не посылается.
Стандартный выходной поток. СGI-модуль выводит информацию в стандартный выходной поток. Этот вывод может представлять собой или документ, сгенерированный cgi-модулем, или инструкцию серверу, где получить необходимый документ.
Вывод cgi-модуля должен начинаться с заголовка содержащего определенные строки и завершаться двумя символами CR («\n», код 0x10). Эти стоки воспринимаются как директивы серверу. Строки, не являющиеся директивами сервера, посылаются непосредственно клиенту. CGI спецификация определяет три директивы сервера:
Content-type — MIME или тип возвращаемого документа;
Location — указывает серверу, что возвращается не сам документ, а ссылка на него;
*Status — задает серверу HTTP/1.0 строку-статус, в которой кодируется различная информация (например, об успешном завершении операции).
При отправке клиенту HTML-документа директива имеет вид Content-Type:text/html\n\n.
Если будет передан URL, то директива может выглядеть, например, так Location: http://host/file.htm, и сервер вернет клиенту заданный этим путем документ, как если бы клиент запрашивал этот документ непосредственно.
Обычно CGI–программы размещаются в каталоге со стандартным именем (чаще всего cgi-bin). В этом случае для идентификации достаточно имени файла (без расширения). Ссылка на этот ресурс может выглядеть, например, так: http://www.orp.com/cgi-bin/myscript. Иногда сервер не содержит специального каталога. В этом случае файлы программ могут располагаться в произвольном месте, путь к которому включен в URL. Но при этом необходимо указывать и расширение файла: http://www.orp.com/mucat/myscript.exe. Для некоторых серверов (например, IIS 7) может потребоваться задавать разрешение на выполнение с указанием имени программы.
Использоваться такие ссылки могут в любом атрибуте, допускающем URL (href, src). При этом после самого адреса могут размещаться данные, которые будут переданы серверу вместе с URL. Данные начинаются с символов, следующих за знаком «?», например,
вызов CGI
В этом случае серверу будет отправлена строка /mycgi/cd2.exe?date. Сервер передает эту строку CGI-программе через переменные окружения (в PATH_INFO будет URL, а в QUERY_STRING – строка «date»).
После принятия и расшифровки запроса выполняется динамическое формирование cgi-модулем HTML-документа, например, таблицы выборки из базы данных.
Для формирования ответа клиенту, cgi-модуль должен выдать в стандартный выходной поток заголовок, состоящий из строки:
Content-type: text/html и пустой строки (двух символов CR)
После этого заголовка может следовать любой текст в формате HTML (или другого языка, который может интерпретироваться браузером, например, XML).
У CGI имеется несколько разновидностей, в частности, WinCGI, для которого данные запроса и ответа передаются не через входной поток, а через запись в файлы. Параметры запроса записываются сервером в файл, запускается программа, читает и обрабатывает запрос, записывает ответ в файл (HTML), который сервер направляет клиенту.
Языком написания CGI-программ может быть любой, однако при использовании языков с транслятором интерпретирующего типа (Perl, PHP, VBAScript и др.) сервер должен содержать соответствующий интерпретатор (обычно в виде подключаемого модуля). При использовании языка с транслятором компилирующего типа (Pascal, C++, C#, Java), исполняемый модуль должен создаваться в консольном режиме.
Создать на языке C# программу, выводящую клиенту приветствие в ответ на запрос.
7 Приложения CGI
До настоящего момента мы рассказывали вам о том, как разместить в документах HTML различную статическую информацию. Статическую в том смысле, что она не изменяется во времени без вмешательства администратора сервера WWW. Если сервер WWW содержит только статические документы HTML, то такой сервер мы будем называть статическим, или пассивным.
Вне всякого сомнения, пассивные серверы очень нужны, так как далеко не всякая информация изменяется динамически. Однако есть приложения, в которых нужны серверы, не просто отображающие мультимедийную информацию, но и способные вести диалог с пользователем в интерактивном режиме, выполнять обращения к базам данных, а также выполнять другую аналогичную работу. Например, если даже информация по своему характеру является статической, но ее объем чрезвычайно большой, поиск по гипертекстовым ссылкам может отнять слишком много времени. Было бы удобнее в этом случае организовать запросный режим для поиска по ключевым словам.
Серверы, которые ведут диалог с удаленным пользователем или выполняют обработку данных пользователя, мы будем называть активными.
Наиболее известный способ создания активных серверов WWW заключается в использовании так называемых приложений CGI. В отечественной литературе, посвященной серверам WWW, часто встречается транслитерация “CGI-скрипты”, которая произошла от оригинального термина CGI Scripts.
Что кроется за аббревиатурой CGI?
CGI — это стандартный шлюзовой интерфейс (Common Gateway Interface) для запуска внешних программ под управлением сервера WWW. Соответственно, приложениями CGI называются программы, которые, пользуясь этим интерфейсом, получают через протокол HTTP информацию от удаленного пользователя, обрабатывают ее, и возвращают результат обработки обратно в виде ссылки на уже существующий документ HTML или другой объект (например, графическое изображение) или в виде документа HTML, созданного динамически.
Передача информации от удаленного пользователя приложению CGI обычно выполняется следующим образом.
В документе HTML, который создается для ввода информации, предназначенной для обработки, размещается форма ввода. Эта форма состоит из необходимых органов управления: полей редактирования текстовой информации, переключателей, списков и так далее. Больше всего форма ввода похожа на привычные вам диалоговые панели операционной системы Microsoft Windows. Каждому органу управления присваивается произвольное имя. Кроме того, в этой форме должна быть кнопка, которую следует нажать после заполнения формы.
Когда пользователь заполняет форму и нажимает указанную кнопку, данные передаются приложению CGI, путь к которому задается в заголовке формы. Это приложение получает через протокол HTTP данные из полей формы в виде пар значений “имя поля/значение”.
После обработки полученных данных приложение CGI создает документ HTML, и записывает его в стандартное устройство вывода stdout. Этот документ автоматически передается удаленному пользователю.
Все описанные процедуры мы рассмотрим в этой главе более подробно. Кроме того, мы приведем исходные тексты различных приложений CGI. Заметим, что возможны и другие сценарии работы с программами CGI.
Так как приложение CGI является ни чем иным, как программой, вы должны оттранслировать ее для той операционной системы, под управлением которой работает ваш сервер WWW. В некоторых случаях вы можете найти более удобным создавать программы CGI с использованием специально предназначенных для этого интерпретаторов, таких как Perl, или языка пакетных заданий. Например, вы можете создать программу CGI для сервера Microsoft Information Server как обычный пакетный файл *.bat. В нашей книге мы сконцентрируемся на использовании для создания программ CGI мобильного языка программирования C. Транслятор этого языка вы можете найти в любой операционной системе.
Создание форм
Чаще всего программы CGI применяются для обработки данных, введенных удаленными пользователями при помощи форм. Поэтому изучение программ CGI мы начнем с создания форм.
Каждая форма содержит органы управления, с помощью которых пользователь может вводить текстовые или цифровые значения, выбирать строки из списков. В форме могут располагаться переключатели, обычные или графические кнопки.
Описание формы
Для того чтобы сделать форму в документе HTML, вы должны воспользоваться оператором , завершающим описание формы. Между операторами находятся описания органов управления в виде операторов ,
и с соответствующими параметрами.
Вот пример определения простейшей формы:
Здесь органы управления размещаются в таблице, состоящей из одного столбца и трех строк. В верхних двух строках мы разместили поля для ввода и редактирования текста, в последней строке — кнопку с названием Send. Внешний вид формы при ее просмотре в навигаторе показан на рис. 7.1.
Рис. 7.1. Простейшая форма для ввода двух текстовых строк
Перечислим допустимые параметры оператора
Форма выглядит так, как это показано на рис. 7.3.
Рис. 7.3. Форма для запуска программы CGI просмотра значений переменных среды
Обратите внимание, что после имени программы CGI через разделительный символ “?” указана строка параметров param1, которая может быть получена и проанализирована программой CGI.
Исходный текст программы CGI приведен в листинге 7.3.
Листинг 7.3. Файл chap7\viewenv\test.bat
В первой строке программа выводит в стандартный поток вывода STDOUT строку заголовка HTTP. Эта строка описывает тип передаваемых данных как text/plain, то есть обычный текст без оформления с использованием операторов HTML.
Вторая строка выводит в стандартный поток вывода пустую строку, которая отделяет заголовок HTTP от передаваемых данных.
Третья строка выводит путь к загрузочному файлу программы CGI и параметры, полученные ей при запуске.
И, наконец, в последней строке вызывается команда SET, которая выводит в поток STDOUT значения всех переменных среды, определенных в системе перед запуском программы.
Результат работы нашей программы CGI показан на рис. 7.4.
Рис. 7.4. Результат работы программы CGI, отображающей значения переменных среды
Ниже мы привели полный листинг, полученный при работе нашей программы CGI:
В этом листинге отображаются переменные среды, определенные специально для программы CGI сервером Microsoft Internet Information Server, а также переменные среды, стандартные для операционной системы Microsoft Windows NT.
Рассмотрим по отдельности назначение переменных среды. Заметим, что набор переменных, создаваемых при запуске программы CGI, зависит от конкретной реализации сервера WWW.
Технология WWW допускает защиту страниц HTML, когда доступ к отдельным страницам предоставляется только для отдельных пользователей при предъявлении пароля. При этом используется так называемая система аутентификации, или проверки подлинности идентификатора пользователя.
Переменная среды AUTH_TYPE содержит тип идентификации, который применяется сервером. Например, для сервера WWW типа Microsoft Information Server при включении аутентификации в этой переменной будет храниться строка “NTLM”.
В этой переменной находится версия интерфейса CGI, с которой работает данный сервер. В нашем случае интерфейс имеет версию 1.1.
В этой переменной перечислены типы данных MIME, которые могут быть приняты навигатором от сервера WWW. Из приведенного выше листинга видно, что сервер Microsoft Internet Information Server может передать навигатору Microsoft Internet Explorer (который был использован для работы с программой CGI) графические изображения (image) в формате gif, jpeg, pjpeg, x-xbitmap. Подробно эти типы данных описаны в спецификации протокола MIME, рассмотрение которой выходит за рамки нашей книги.
В переменную HTTP_REFER записывается адрес URL документа HTML, который инициировал работу программы CGI. В нашем случае этот документ был записан на локальном диске компьютера в каталоге C:\!websrv\Sample\Chap7\viewenv.
Переменная HTTP_ACCEPT_LANGUAGE содержит идентификатор предпочтительного национального языка для получения ответа от сервера WWW. В нашем случае это английский язык, хотя сервер может прислать ответ на любом национальном языке.
Разрешение видеоадаптера, установленное в компьютере пользователя.
Допустимое количество цветов в системе пользователя.
Операционная система, под управлением которой работает навигатор.
Тип центрального процессора в компьютере удаленного пользователя.
В эту переменную записывается имя навигатора, с помощью которого запрашивается документ HTML. Анализируя это имя, программа CGI может принимать решение об использовании тех или иных расширений стандарта языка HTML, допустимого для конкретного навигатора.
Имя узла, на котором работает сервер WWW.
Метод кодирования, который может быть использован навигатором для формирования ответа серверу WWW.
Информация авторизации от навигатора. Используется навигатором для собственной аутентификации в сервере WWW.
Имя пользователя в виде, как оно было зарегистрировано при настройке навигатора. Используется формат адресов электронной почты.
Специальные команды серверу WWW.
Количество байт данных, которые программа CGI должна получить от навигатора.
Тип данных, присланных навигатором.
Путь к виртуальному каталогу, в котором находится программа CGI.
Как правило, при настройке сервера WWW администратор выделяет один или несколько каталогов для хранения расширений сервера в виде программ CGI или ISAPI. Для файлов, записанных в такие каталоги, устанавливается доступ на запуск.
Администратор создает таблицу соответствия физических каталогов и виртуальных, определяя права доступа к виртуальным каталогам с помощью программы настройки параметров сервера WWW.
Физический путь к программе CGI.
Строка параметров, указанная в форме после адреса URL программы CGI после разделительного символа “?”.
Адрес IP узла, на котором работает навигатор удаленного пользователя.
Доменное имя узла, на котором работает навигатор удаленного пользователя. Если эта информация недоступна (например, для узла не определен доменный адрес), вместо доменного имени указывается адрес IP, как в переменной REMOTE_ADDR.
Имя пользователя, которое используется навигатором для аутентификации. Используется только в том случае, если сервер WWW способен работать с аутентификацией и программа CGI отмечена как защищенная.
Метод доступа, который используется для передачи данных от навигатора серверу WWW. В своих примерах мы используем методы доступа GET и POST, хотя протокол HTTP допускает применение и других методов доступа, например, PUT и HEAD.
В эту переменную записывается путь к виртуальному каталогу и имя программы CGI. Анализируя эту переменную, программа CGI может определить путь к своему загрузочному файлу.
Доменное имя сервера WWW или адрес IP сервера WWW, если доменное имя недоступно или не определено.
Имя и версия протокола, который применяется для выполнения запроса к программе CGI.
Номер порта, на котором навигатор посылает запросы серверу WWW.
Название и версия программного обеспечения сервера WWW. Версия следует после названия и отделяется от последнего символом “/”.
Имя, с которым пользователь подключился к серверу WWW. Используется только в том случае, если сервер WWW способен подключать пользователей по именам.
Примеры программ CGI
В этом разделе мы приведем примеры несложных программ CGI, демонстрирующих динамическое создание документов HTML и обработку данных, введенных при помощи форм.
Программа CGIHELLO
Программа CGIHELLO представляет собой простейшую программу CGI, которая запускается при помощи кнопки в форме, возвращая навигатору документ HTML, созданный динамически.
Эта программа хороша для проверки возможности запуска программ CGI на вашем сервере WWW или на сервере вашего поставщика услуг Internet. Так как она очень проста, существует немного причин, по которым она могла бы не работать. Это неправильная настройка прав доступа к виртуальному каталогу, содержащему загрузочный модуль программы CGI, а также неправильная ссылка на этот каталог в параметре ACTION оператора
В этом документе определена форма, содержащая единственную кнопку, созданную оператором и имеющую тип SUBMIT.
Глава 5
Основы Серверного JavaScript
В этой главе даются основы серверной функциональности и различия между клиентским и серверным JavaScript. Здесь показано, как внедрять серверный JavaScript в HTML-файлы. Обсуждается, что происходит во время прогона программы на клиенте и на сервере, чтобы Вы могли разобраться во всём этом. В главе описано, как использовать JavaScript для изменения HTML-страницы, отправляемой клиенту, и, наконец, как распределить информацию между серверными и клиентскими процессами.
В главе имеются следующие разделы:
Серверный JavaScript имеет то же ядро языка, что и клиентский JavaScript, с которым Вы, возможно, уже знакомы. Задачи, выполняемые Вами при запуске JavaScript на сервере, несколько отличаются от задач, выполняемых при работе JavaScript на клиенте. Разные окружения и задачи обращаются к различным объектам.
Что Делать и Где
Клиентская среда (браузер) является передним краем работы приложения. В этой среде, к примеру, Вы отображаете HTML-страницы в окне и обслуживаете истории сессий HTML-страниц, отображаемых в браузере в течение сессии. Объекты этой среды, следовательно, обязаны иметь возможность манипулировать страницами, окнами и историей.
По контрасту, в серверной среде Вы работаете с ресурсами сервера. Например, Вы можете установить соединение с реляционной базой данных, распределить информацию между пользователями приложения или манипулировать файловой системой сервера. Объекты этой среды обязаны иметь возможность манипулировать реляционной БД и файловой системой сервера.
Кроме того, HTML-страница не отображается на сервере. Она запрашивается на сервере для отображения на клиенте. Запрошенная страница может содержать клиентский JavaScript. Если запрошенная страница является частью приложения JavaScript, сервер может генерировать эту страницу «на лету».
При разработке приложения JavaScript помните о разнице между клиентской и серверной платформами. Различия показаны в следующей таблице.
Таблица 5.1 Сравнение Клиента и Сервера
Серверы | Клиенты |
---|---|