Что такое CGI?
Что такое CGI? Это общий интерфейс шлюзов, связывающий программу,
работющую под управлением вебсервера и клиента в виде HTTP-браузера.
Иными словами, это средство, которое позволяет генерить HTML-документы
"на лету", в зависимости от условий и пожеланий программиста.
Как и любое клиент-серверное средство, CGI-программа состоит из
двух частей - одной, которая работает на клиенте, в среде браузера, и
другой, работающей на сервере, в среде вебсервера. Клиентская часть
пишется на HTML (возможно, с употреблением раздичных дополнительных
средств, расширяющих его возможности), серверная часть может быть на-
писана на любом языке программирования, способном создавать выполняе-
мые программы на платформе, на которой установлен вебсервер. Мы будем
использовать для этих целей Перл, потому что он удобен для обработки
текстовых строк - а HTML документ представляет собой именно текст.
Принцип работы интерфейса очень прост - вебсервер, если ему это
разрешено, может запустить выполняемую программу; в отличие от запуска
этой же программы пользователем потоки вода, вывода и ошибок запущен-
ной программы будут перенаправлены: ввода и вывода в протокол HTTP, а
ошибок - в файл лога ошибок вебсервера. Таким образом, мы можем созда-
вать HTML-документ "на лету", просто выводя в поток вывода его теги с
помощию команды print или ее аналога.
Впрочем, лучше один раз увидеть, чем сто раз услышать. Для того,
чтобы работать с клиент-серверными пограммами, нужно сначала устано-
вить клиент и сервер. В качестве клиента может быть использован любой
браузер, поддерживающий протокол HTTP (рекомендуется Netscape, потому
что он достаточно строго реагирует на ошибки; можно быть увереным, что
то, что работает в нем будет работать где угодно - а обратное выполня-
ется редко), в качестве сервера рекомендуется вебсервер Apache. Это
один из самых распространенных вебсерверов, он может быть скомпилиро-
ван полд все мыслимые платформы и ситемы, и отладженные под него прог-
раммы скорее всего сможет установить любой провайдер.
Вебсервер Apache для Windows лучше всего получить по адресу
ftp://cdl.bmstu.ru/soft/cgi . Установите его, однако не в директорию,
которую он предлагает для установки, а в c:apache . Вебсервер может
работать и в том случае, если он установлен в руть по-умолчанию, одна-
ко при его настройке возникнут некоторые разночтения с предлагаемым
здесь вариантом - если Вы хотите избегнуть нежелательных осложнений,
измените путь по-умолчанию.
Запустите вебсервер (на экране появится пустое черное окно - это
нормальный результат успешного запуска; ни в коем случае не закрывайте
это окно принудительно - для финиширования вебсервер создал Вам специ-
альную иконку). Обратитесь к нему из браузера через URL
http://localhost и убедитесь, что демонстрационная веб-страница, кото-
рая находится в директори htdocs успешно запускается.
Если вебсервер не удалось запустить, прочитайте выводимое им со-
общение об ошибке. Чаще всего вебсервер не может запуститься из-за то-
го, что не указано имя. Откройте на редактирование основной файл кон-
фигурации вебсервера (httpd.conf) и снимите ремарку с пересенной
Servername, присвоив серверу любое имя - например localhost.
Теперь имеет смысл попробовать выполнить первую CGI-программу.
Для того, чтобы иметь возможность писать CGI-программы на Перле,
следует установить Перл. Взять его можно там же, где и вебсервер, ус-
тановка этой программы не содержит особых подводных камней. Вам будет
предложено скомпиллировать Перл из текста на Си, если Вы откажетесь от
этого (что рекомендуется), будет развернута уже скомпилированная би-
нарная версия. После установки не забудьте проложить в файле
Autoexec.bat путь в директорию c:perlin - туда, где содержится файл
perl.exe.
Проверьте правильность установки Перла, написав простейшую прог-
рамму, состоящую из одной строки:
print "Hello";
Запустите эту программу из любой директории, набрав "perl
filename", где filename - имя файла, в который Вы вписали приведенную
выше строчку. Если на экране появилось слово Hello, это ззначит что Вы
все сделали правильно.
В отличие от многих других вебсерверов, Апач сам вызывет интерп-
ретатор Перла, таким образом в каждой программе нужно указывать, где
он находиться. Таким образом, первой строчкой нашего CGI-скрипта дол-
жен быть путь к интерпретатору:
#!perl
после того, как путь к интерпретатору указан, нужно выставить
серверный http-заголовок, указывающий тип отдаваемых данных:
print "Content-type: text/html
";
Обратите внимание, что поле http-заголовков завершается двойным
переводом строки. Сами заголовки, если их несколько, отделяются друг
от друга одинарным переводом строки.
Третья строчка нашей программы будет содержать необходимую для
создания html-документов обвеску:
print "";
print "";
print "
";
Обратите внимание, что при использовании внутри команды print,
двойные кавычки необходимо отчеркивать - иначе интерпретатор примет
кавычки за окончание команды, а то, чт о идет после них - за незавер-
шенную строку, и ответит ошибкой выполнения.
Теперь необходимо вести строчку вывода, и закрыть html-докумнт.
print "Hello";
print "";
Таким образом, вся наша первая программа будет выглядеть так:
#!perl
print "Content-type: text/html
";
print "";
print "";
print "
";
print "Hello";
print "";
Проверьте правильность ее выполнения, запустив программу локаль-
но. Для этого наберите в командной строке: perl filename, где filename
- это имя Вашей программы. Если все в порядке, программа должна напи-
сать на экране http-заголовок, а затем теги html-документа, который
программа создает.
После локальной проверки нужно запустить программу как кли-
ент-серверное приложение. Для этого нужно дать программе права на вы-
полнение (для операционых систем, где это актуально), и расположить в
директории, в которой вебсервер распознает програмы как CGI-приложе-
ния. По умолчанию, это директория cgi-bin, в которой и надо разместить
нашу программу.
Для запуска программы нужно набрать в окне location ее URL:
http://localhost/cgi-bin/filename
Как передавать данные между клиентом и сервером?
Как передать данные с сервера на клиент мы уже рассмотрели. Сле-
дующим шагом представляется передача данных с клиента на сервер и фор-
мирование клиента с учетом переданной на сервер информации.
Существуют несколько МЕТОДОВ, с помощью которых можно передать
информацию на сервер; самые распространенные из них - это метод GET,
передающий данные в URL и метод POST, передающий данные в теле запро-
са. Hедостатком первого является ограниченный объем передоваемой ин-
формации (до 127 байт), недостатком виторого - сложность в формирова-
нии запроса.
В самом деле, чтобы сформировать запрос методом GET вполне доста-
точно написать знак вопроса после URL вызова, и перечислять через ам-
персанд пары "имя=значение":
http://localhost/cgi-bin/test2.cgi?v1=vasya&v2=petya и так далее.
Теперь нужно получить эти данные на сервере, для чего достаточно полу-
чить содержимое переменной окружения вебсервера QWERY-STRING. Эта пе-
ременная содержит то, что в URL располагалось после знака вопроса.
Есть, однако, одна особенность, которая делает затруднительной
использование этой переменнй. Дело в том, что русские буквы, как и
специальные символы, в URL заперщены - поэтому их придется заменить на
специальный код, который не содержит запретных символов, а просле при-
ема на сервере потребуется произвести обратную перекодировку. Такая
перекодировка является вполне стандартной для CGI-программирования, и
в комплекте любого Перла предусмотрен модуль, который умеет читать со-
ответствующую переменую, перекодировать ее содержимое и раскладывать
приняные данные по переменным. Модуль, в котором содержася эти подп-
рограммы называется CGI. Подключите его к своей программе, написав:
use CGI qw(param);
после чего Вы сможете захватывать из входного потока любую переменную,
написав, к примеру:
$v1=param("v1");
теперь, если Вы вызвали скрипт с помощью приведенной выше URL-и, то
модуль будет искать в принятых данных переменную потока "v1", а найдя,
присвоит ее значение скаляру $v1, который будет теперь равняться
"vasya". Чтобы подтвердить правильность наших построений, давайте вы-
полним программу, которая иллюстрирует такую передачу данных:
#!perl
use CGI qw(param);
$v1=param("v1");
$v2=param("v2");
print "Content-type: text/html
";
print "";
print "";
print "";
print "Hello, $v1 , $v2 !!!";
print "";
Метод POST передает данные в теле запроса, а получать их следует
через входной поток программы (напомню, при запуске программы вебсер-
вером он направлен в протокол HTTP). Для отсылки данных этим методом в
HTML служат формы. Hапример, выполнив на клиенте приведенную ниже фор-
му мы получим точно такой же результат, как и в предыдущем примере:
Модуль CGI, обрабатывающий входные данные работает совершенно
одинаково как при применении метода GET, так и при использовании мето-
да POST.
Дата публикации: 10/12/2005 Прочитано: 1715 раз
Дополнительно на данную тему:
CGI интерфейс
Работа с MySql. Создание Web интерфейса
Image Magick или фотошоп для perl
Спецификация языка Perl
Маленькие хитрости твоего мыла
Особенности CGI-режиссуры
Особенности CGI-режиссуры (часть 2)
Запуск и отладка Perl-программ и CGI-скриптов под Windows
Делаем счетчик посещений на Perl
Работа с файлами и каталогами на Perl
|