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

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

3) Способы взаимодействия CGI и WEB-сервера
В спецификации CGI предусмотрено несколько способов взаимодействия CGI-программы и Web-сервера, отличающиеся вариантом обмена данными между сервером и программой.
. Передача параметров в командной строке (например, с помощью дескриптором ISINDEX, помещаемого в раздел 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 тэга ссылки . Параметры передаются после имени файла за знаком?.

Передача данных аналогична использованию метода GET.

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


Действие 1 : Пользователь просматривает HTML-документ и встречает ссылку на страницу, содержащую форму (используется тэг ), предназначенную, например, для запроса к БД. Пользователь вводит в полях ввода на форме требуемые данные и нажимает на кнопку SUBMIT (отправить) или графическую кнопку IMAGE. HTML-тэг имеет два обязательных атрибута: 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


. Обзор принципов реализации 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.

ехнология веб-дизайна CGI (аббревиатура от англ. Common Gateway Interface) - в нашем лексиконе так именуется НЕ язык, как ошибочно полагают многие, но именно серверная технология (т.наз. «шлюз, или шлюзовой интерфейс)»). Действительно, для её реализации на практике требуется какой-либо из языков программирования, но об этом мы побеседуем чуть ниже.

Сущность CGI такова: используется принцип передачи управления информацией (данными) от одного объекта к другому. Для наглядности, в качестве примера рассмотрим простейший из вариантов: в паре «сервер-клиент» пользователю предложено заполнить некую форму (что такое формы, см. ); пользователь заполняет её, а затем нажимает кнопку с надписью «Отослать» (или же с иной надписью, но нас интересует не надпись, а значение этой кнопки, то есть её функция). Функцией же является вызов (активация) скрипта, обслуживающего CGI, и передача ему управления теми данными, которые пользователь в форму ввёл.

Непонятно?

Скажем другими словами: представьте, что на веб-странице есть некая форма. Вы её заполнили. Пока вы заполняете форму, пока меняете её содержание и т.п., управление содержанием формы осуществляется программными средствами вашего компьютера (браузера, выражаясь точнее). Но когда вы нажали кнопку «Отослать», происходит некоторое изменение (это обновилась страница): на сервер , в распоряжение скрипта CGI, ушли данные из заполненной формы.

Собственно, самому серверу «до лампочки», что именно вы ему пытаетесь отослать. А вот скрипт CGI, вызванный (говорят «активированный») нажатием кнопки, ждёт и принимает как раз этот блок информации, и с момента нажатия кнопки вы уже ничего с отправленными данными поделать не можете: управление ими перешло к CGI.

Почтовая форма на сайте

Цена упаковка для лекарств органайзеры для лекарств в интернет магазине по низкой цене.

В веб-дизайне эта технология применяется очень широко. Уже пять-семь лет назад нельзя было представить себе приличного сайта, на котором не было бы почтовых форм. А ведь с помощью форм проводятся масштабные многостраничные опросы и прочее, и прочее...

Обработка данных

Гусь домашний цена за кг купить в интернет магазине свежее мясо домашнего.

Для обработки полученных из Сети данных, применяется исполняемый на сервере скрипт. Мы не станем вдаваться в частности серверного программирования, скажем лишь о том, что чаще всего такие скрипты выполнены на языках PERL (Practical Extraction and Report Language, файлы имеют расширение.pi) или С (расширение.cgi).

В отличие от рассмотренной в предыдущей статье технологии JavaScript, методика применения CGI обладает неоспоримым достоинством: поскольку вся обработка информации выполняется на сервере, функционирование сайта ни в коей мере не зависит от клиентского оборудования (браузер у пользователя может быть любым, главное, чтобы он был корректным).

Вы наверняка сталкивались со страницами, которых ранее не существовало и которые были созданы по вашему запросу динамически – сформированы, как говорится, «на лету».

Например, любая книга отзывов предоставляет вам определенную форму, в которую вы добавляете свой отзыв, и затем, когда вы в следующий раз откроете эту страницу, она будет содержать новое сообщение.

Одна из технологий, позволяющая добавить динамическое содержание в Web-страницы, называется CGI. Она позволяет ассоциировать с тем или иным URL не просто статический документ, а программу, в результате работы которой могут быть сформированы данные в реальном времени.

Рассмотрим пример с предоставлением сведений о погоде. Метеорологическая сводка о погоде меняется каждый день, и ежедневно может создаваться новая статическая страница с прогнозом. Однако, если вы хотите предоставлять мгновенные данные, вы должны каждый раз генерировать новую страницу. Это может быть реализовано на основе CGI-технологии. В момент обращения на сервер на нем запускается CGI-программа, которая обращается к цифровому измерительному устройству и выдает сведения о температуре, давлении и т.д. Когда вы в очередной раз обратитесь на этот адрес, вы получите новые сведения.

Другой пример: когда вы заполняете некоторый запрос, например запрос в поисковой системе, то в ответ получаете результаты работы СGI-программы в виде набора искомых адресов.

CGI-программу можно представить как часть Web-сервера, которая запускается Web-сервером в реальном времени. Сервер передает запросы пользователя CGI-программе, которая их обрабатывает и возвращает результаты своей работы на экран пользователя (рис. 3). На большинстве Web-серверов CGI-механизм организован следующим образом: создается специальная поддиректория, в которой хранятся подобные программы, и администратор Web-сервера настраивает доступ к ней таким образом, чтобы файлы из нее не считывались, а запускались на выполнение. Результат работы программы отсылается браузеру в ответ на запрос. С точки зрения клиента нет никакой разницы, что находится по адресу данного URL – статический документ или CGI-программа. Браузер воспринимает информацию одинаково независимо от того, сформирована ли она «на лету» или речь идет о статической странице. Результат работы CGI-программы имеет тот же формат, что и статический документ.

Аббревиатура CGI наверняка попадалась вам в строке вашего браузера во время путешествия по Всемирной паутине, и вы, скорее всего, видели ссылку на /cgi-bin/ – директорию, в которой обычно и лежат cgi-программы. Множество интерактивных сервисов, таких как гостевая книга, форум и т.д., построены именно на cgi-программах.


Под термином «CGI» понимают не только программу, но и протокол. В этом смысле CGI – это стандартный для Web-сервера способ передать пользовательский запрос прикладной программе и получить данные назад для передачи их пользователю. Протокол CGI для пересылки данных между сервером и приложением является частью протокола HTTP.

Следует отметить, что если вы собираетесь разместить свою страницу на серверах бесплатного хостинга, то вполне возможно, что cgi-скрипты на этих серверах не поддерживаются.

Альтернативой CGI является технология компании Microsoft Active Server Page (ASP), построенная по тому же принципу: скрипт, включенный в Web-страницу, выполняется на сервере до того, как страница отсылается пользователю.

Существуют и другие технологии, работающие по тому же принципу.

Как видно на рис. 3, CGI-программа работает на стороне сервера.

Однако возможно также организовать динамические страницы за счет передачи на клиентский компьютер программ, которые генерируют динамическое содержание страниц уже на стороне клиента (рис. 4).

Рис. 4

Эта технология реализована следующим образом: активные документы хранятся на Web-серверах и скачиваются на локальный компьютер так же, как и статические страницы, но после того, как программа активного документа оказывается на локальном компьютере, она запускается и выполняет определенные вычисления на компьютере пользователя, опираясь на локальные вычислительные ресурсы. А результаты этих вычислений уже отображаются на экране. Соответственно скорость отображения данных на экране не зависит от скорости связи с удаленным сервером, поскольку вывод активного документа происходит только после его загрузки на локальный компьютер. Для создания активных документов могут использоваться различные технологии: приложения, написанные на JavaScript, Java-аплеты и элементы управления ActiveX.

CGI - Common Gateway Interface является стандартом интерфейса (связи) внешней прикладной программы с информационным сервером типа HTTP, Web сервер.

Обычно гипертекстовые документы, извлекаемые из WWW серверов, содержат статические данные. С помощью CGI можно создавать CGI-программы, называемые шлюзами , которые во взаимодействии с такими прикладными системами, как система управления базой данных, электронная таблица, деловая графика и др., смогут выдать на экран пользователя динамическую информацию.

Программа-шлюз запускается WWW сервером в реальном масштабе времени. WWW сервер обеспечивает передачу запроса пользователя шлюзу, а она в свою очередь, используя средства прикладной системы, возвращает результат обработки запроса на экран пользователя. Программа-шлюз может быть закодирована на языках C/C++, Fortran, Perl, TCL, Unix Schell, Visual Basic, Apple Script. Как выполнимый модуль, она записывается в поддиректорий с именем cgi-bin WWW сервера.

Передача данных шлюзам

Для передачи данных об информационном запросе от сервера к шлюзу, сервер использует командную строку и переменные окружения. Эти переменные окружения устанавливаются в тот момент, когда сервер выполняет программу шлюза.

Запросы для различных методов

Информация шлюзам передается в следующей форме:

имя=значение&имя1=значение1&..

где имя - имя переменной, и значение - ее реальное значение. В зависимости от метода, который используется для запроса, эта строка появляется или как часть URL (в случае метода GET), или как содержимое HTTP запроса (метод POST). В последнем случае, эта информация будет послана шлюзу в стандартный поток ввода.

На файловый дескриптор стандартного потока ввода посылается CONTENT_LENGTH байт. Так же сервер передает шлюзу CONTENT_TYPE (тип передаваемых данных). Сервер не обязан посылать символ конца файла после отсылки CONTENT_LENGTH байт данных и после того, как шлюз их прочитает.

Пример

Возьмем результат работы формы с методом POST (METHOD="POST") в качестве примера. Пусть получено 7 байт, закодированных примерно так:

В этом случае, сервер установит значение CONTENT_LENGTH равным 7 и CONTENT_TYPE в application/x-www-form-urlencoded. Первым символом в стандартном потоке ввода для шлюза будет "a", за которым будет следовать остаток закодированной строки.

Аргументы командной строки

Шлюз в командной строке от сервера получает:

Остаток URL после имени шлюза в качестве первого параметра (первый параметр будет пуст, если присутствовало только имя шлюза), и
- список ключевых слов в качестве остатка командной строки для скрипта поиска, или
- чередующиеся имена полей формы с добавленным знаком равенства (на четных позициях) и соответствующих значений переменных (на нечетных позициях).

Ключевые слова, имена полей формы и значения передаются раскодированными (из HTTP URL формата кодирования) и перекодированными в соответствии с правилами кодирования Bourne shell, так что шлюз в командной строке получит информацию в том виде, как она есть, без необходимости осуществлять дополнительные преобразования.