CGI (Common Gateway Interface)


1) Общие сведения о CGI
С 1993 года CGI является очень часто используемой технологией создания трехзвенных клиент/серверных приложений в Интернет. CGI-приложение совместно с Web-сервером выполняют роль сервера приложений в трехзвенной архитектура клиент/сервер. CGI – набор правил (спецификация), согласно которым пользовательские программы, запускаемые на Web-сервера, могут возвращать данные клиенту в виду HTML-документа. CGI – это консольное приложение, загружаемое в ответ на запрос клиента на выборку или обновление данных, функционирующее как отдельный однопоточный процесс под управлением Web-сервера и выгружаемое сразу после завершения работы. WinCGI – Windows реализация CGI.

Общая структура взаимодействия web-клиента с СУБД и БД по CGI

2) Варианты реализации
Программа, запускаемая Web-сервером в соответствии со спецификацией CGI, называется CGI-скриптом. Она может быть написана на любом языке программирование (С, Basic, Pascal и т.п.) или на командной языке (языки shell, perl и т.п.), допускающем создание исполняемых модулей. CGI-скрипт исполняет роль посредника между Web-сервером и другими серверами, например, сервером БД, и поэтому часто называется шлюзом. CGI-программы по умолчанию размещаются в каталоге C:\InetPub\Scripts|Cgi-bin, но можно создавать и свой виртуальный каталог.

3) Способы взаимодействия CGI и WEB-сервера
В спецификации CGI предусмотрено несколько способов взаимодействия CGI-программы и Web-сервера, отличающиеся вариантом обмена данными между сервером и программой.
• Передача параметров в командной строке (например, с помощью дескриптором ISINDEX, помещаемого в раздел <HEAD> HTML-документа, или FORM-URLENCODED).
• Передача значений переменных окружения (их более 17 штук).
• Передача данных через стандартный входной поток (STDIN, STDOUT).

Запрос типа ISINDEX – это запрос вида: http://site.ru/somthig-cgi/cgi-script?слово1+слово2+слово3
Главным здесь является список слов после символа «?». Слова перечисляются через символ «+» и для кириллицы не кодируются в шестнадцатеричные последовательности. Последовательность слов после символа «?» будет размещена в переменной окружения QUERY_STRING.

Запрос типа FORM-URLENCODED – это запрос вида: http://site.ru/something-cgi/cgi-script?field=word1&field2=word2
Данные формы записываются в виде пар «имя_поля-значение», которые разделены символом «&».

Переменные окружения, которые не зависят от типа запроса:
SERVER_SOFTWARE – показывает название и версию http-сервера в формате: название/версия.
SERVER_NAME – показывает доменное имя сервера.
SERVER_ADDR – показывает IP сервера.
SERVER_ADMIN – e-mail администратора web-сервера.
GATEWAY_INTERFACE – версия CGI на момент компиляции httpd демона в формате: CGI/версия
DATE_GMT – текущая дата и время во временной зоне GMT.
DATE_LOCAL – текущие дата и врем во временной зоне сервера.
DOCUMENT_ROOT – путь к главному каталогу web-сервера.
Переменные окружения, которые зависят от типа запроса:
SERVER_PROTOCOL – протокол, по которому был получен запрос.
SERVER_PORT – порт, на который был получен запрос.
REQUEST_METHOD – тип запроса: POST, GET и так далее.
REQUEST_URL – страница, отправившая запрос.
SCRIPT_NAME – URL скрипта без имени сервера.
SCRIPT_FILENAME – полное имя файла скрипта на диске.
QUERY_STRING – информация, содержащаяся в командной строке вызова скрипта (после ? в URL’е).
CONTENT_TYPE – MIME-тип данных, передаваемых скрипту.
CONTENE_LENGTH – длина передаваемых данных.

Поток стандартного вывода:

Ввод данных в скрипт через поток стандартного ввода осуществляется только при использовании метода доступа к ресурсу (к скрипту) POST. При этом в переменную окружения CONTENT_LENGTH помещается число символов, которое необходимо считать из потока стандартного ввода скрипта, а в переменную окружения CONTENT_TYPE помещается тип кодирования данных, которые считывают из потока стандартного ввода. При посимвольном считывании в С можно применить, например, такой фрагмент кода:

int n;
char *buf;
n=atoi(getenv(*CONTENT_LENGTH*));
buf=(char *)malloc(n+1);
memset(buf, ‘\000’,n+1);
for (i=0; iBR> {buf[i]=getchar()}

free(buf);

4) Методы передачи данных
a) Метод GET выполняет передачу данных CGI-программе через переменные окружения (среды), которые фактически добавляются к URL через разделительный знак ?.

Прежде всего, для этих целей используется переменная query_string – длинная строка, состоящая из пар имя = значение, отделяемых друг от друга символом амперсанда — &. Получается быстро, однако объем передаваемых данных не превышает 256?1024 байт в зависимости от типа Web-сервера.

b) Метод POST выполняет передачу данных через стандартный поток ввода stdin (Ini-файл для WinCGI). Фактически данные добавляются к телу HTML-запроса. Количество передаваемых байт указывается в переменной среды content_length. Это более медленный способ передачи данных, но объем передаваемых данных не ограничен.

c) Параметр HREF тэга A
Помимо методов GET и POST тэга

, можно вызвать CGI-программу через параметр HREF тэга ссылки <A>. Параметры передаются после имени файла за знаком ?.
<A HREF=”http://myserver/cgi-bin/mycgi.exe”>
Передача данных аналогична использованию метода GET.

5) Диаграмма последовательностей

Общая структура взаимодействия web-клиента с СУБД и БД по CGI

Действие 1: Пользователь просматривает HTML-документ и встречает ссылку на страницу, содержащую форму (используется тэг <FORM>), предназначенную, например, для запроса к БД. Пользователь вводит в полях ввода на форме требуемые данные и нажимает на кнопку SUBMIT (отправить) или графическую кнопку IMAGE. HTML-тэг <FORM> имеет два обязательных атрибута: METHOD и ACTION. Атрибут ACTION определяет URL, в качестве которого должно быть имя CGI-программы, обычно размещаемой в каталоге. Атрибут METHOD, обычно принимающий значение GET или POST, определяет механизм передачи данных серверу.

Действие 2: Web-браузер собирает введенные на форме данные, определяет способ передачи данных в зависимости от указанного метода (GET или POST) и передает вызов Web-серверу.

Действие 3: Web-сервер получает вызов через сокетное соединение. Сервер разбирает сообщение на части и определяет, что это метод POST или GET. Далее запускается CGI-взаимодействие.

Действие 4: Web-сервер задает переменны окружения (в ОС MS-DOS они задаются командой Set). Переменные окружения (environment variable) играют роль доски объявлений при обмене данными между Web-сервером и CGI-программой. Обычно используют следующие переменные: server_name, request_method, path_info, script_name, content_type, content_length и ряд других. Когда CGI-программа вызывается посредством формы (наиболее распространенный вариант), браузер передает серверу длинную строку, в начале которой указан полный путь до CGI-программы. Далее следуют другие данные, называемые данными пути, и передаются CGI-программе через переменную окружения path_info: http://myserver/cgi-bin/mycgi.exe/showrecord?recNo=20 где: showrecord? – данные пути, recNo=20 – строка запроса.

Действие 5: Web-сервер запускает CGI-программу, располагаемую по умолчанию в каталоге C:\InetPub\scripts|cgi-bin. Однако можно создавать и свои виртуальные каталоги.

Действие 6: CGI-программа анализирует переменные окружения и определяет, что отвечает на POST. В языке С доступ к переменным окружения получают с помощью функции getenv().

Действие 7: CGI-программа получает тело сообщения через стандартный поток ввода (stdin). Переменная окружения content_length сообщает, сколько данных находится в сообщении. В языке С можно воспользоваться функциями fread или scanf для чтения данных из потока.

Действие 8: CGI-программа выполняет некоторые действия, например, запрос к БД.

Действие 9: CGI-программа вне зависимости от метода GET или POST возвращает результат всегда через стандартный поток выхода (stdout). В языке С используются функции printf или fwrite.

Действие 10: Web-сервер возвращает результат Web-браузеру.

6) Особенности доступа
• Доступ к БД из CGI может быть выполнен с помощью программного интерфейса ODBC или объектных интерфейсов OLE DB или ADO. В Delphi используется BDE.
• Безопасность доступа обеспечивается использованием протоколов SSL (Secure Sockets Layer), S-HTTP (Secure HTTP), брандмауэров.
• Для обеспечения большей интерактивности CGI-программы на некоторых Web-серверах можно применять файлы magic cookies или просто cookies, обозначающие серверные данные, сохраненные на клиенте.
• Некоторые серверы могут производить синтаксический анализ отправляемого браузеру HTML-документа и предоставляют набор команд для вставки внутрь комментариев: текущий даты, времени, сведения о последнем изменении документа и ряд других. Это называется серверной вставкой SSI – Server-Side Include.

7) Достоинства CGI

• Языковая независимость, заключающаяся в возможности написания CGI-программ на любом языке программирования или командном языке. Так командный язык Perl обеспечивает кроссплатформенность CGI (PCGI).
• Процессорная независимость, заключающаяся в том, что при запуске CGI-программы порождается отдельный от Web-сервера процесс и в случае ошибки она не может «сломать» Web-сервер.
• Открытость стандарта.
• Архитектурная независимость от реализации сервера, т.е. его можно использовать на любом сервере.
• Прозрачность использования.

8) Недостатки CGI

• Большие временные затраты, обусловленные запуском отдельного однопоточного процесса для каждого клиентского запроса, заканчивающегося по его окончании. Это приводит к невысокому быстродействию. Есть разработка FastCGI, но она не очень широко поддерживается.
• Трудно «вести» БД, поскольку для каждого запроса запускается отдельный процесс, т.е. требуется новое подключение.
• CGI ограничен по способности функционирования, поскольку спецификация предусматривает только простую ответную роль программы при генерации результата на запрос пользователя.
• CGI неудобен тем, что жестко привязан к Web-страницам.

9) Создание CGI в Delphi
• Подход Delphi для создания CGI
CGI и WinCGI-приложения в Delphi относятся к классу TCGIApplication. Генерируемый мастером код приложений CGI и WinCGI практически одинаков и отличаются только строкой директивы компилятора: {$APPTYPE CONSOLE|GUI}. Для создания CGI-приложения следует из главного меню Delphi 5-7 выполнить команды: File\New.

В открывшемся многостраничном окне New Items репозитория объектов Delphi следует выбрать страницу Business и активизировать пиктограмму DB Web Application Wizard. Далее отвечать на вопросы.

• Структурная схема модуля CGI на Delphi

Общая структура взаимодействия web-клиента с СУБД и БД по CGI

• Обзор принципов реализации CGI на Delphi
WebDispatcher с помощью объекта WebRequest анализирует поступающие запросы и выбирает нужный объект Action, который передает запрос на сервер БД. Соответствующий Producer является генератором контента HTML-кода, который переправляется через объект WebResponse на Web-сервер и далее клиенту. В объектах Producer доступны тэги вида <# …..>, позволяющие взаимодействовать коду на Pascal и коду на HTML. Для Web-браузера эти тэги не имеют смысла, однако помогают подставлять данные из БД внутрь страниц на HTML.

• Пример программы CGI

Program MyCGI;
{$APPTYPE CONSOLE} // {$APPTYPE GUI} – для WinCGI
Uses Webbroker, HTTPApp, CGIApp, Unit1 In ‘Unit1.Pas’ {WebVodule1: TWebModule}
{$R*.RES}
Begin
Application.Initialize;
Application.CreateForm(TWebModule1: WebModule1);
Application.Run;
End.


Комментарии запрещены.




Статистика