CGI -- Common Gateway Interface. Стандарт интерфейса внешних программ
с http-сервером.
Как работать
HTTP -- клиент-серверный протокол, следовательно со стороны CGI-программы, как
серверного процесса, все взаимодействие выглядит следующим образом
Получение данных от клиента
Обработка данных
Выдача ответа клиенту.
Пункты 1 и 3 я вкратце опишу здесь, а 2, надеюсь, сделаете сами :-).
Начнем с п.3, как наиболее простого.
3. Выдача данных клиенту
Обычно клиенту выдают текст в формате HTML (ничто
не мешает Вам отправить ему и картинку/видео/etc). Для того, чтобы сервер и
клиент вас поняли, необходимо сказать, что вы выдаете, c помощью заголовка
Content-Type: mime-type/mime-subtype. Обратите внимание на регистр и
последовательность -- если вы скажите нечто типа Content_type, то сервер
вас скорее всего не поймет. (Сообщение типа "500 Internal
Server Error" будет симптомом).
Пример:
print "Content-Type: text/htmln";
# Мы выдаем текст в формате HTML. Также можно: text/plain -- простой текст, в
# браузере отобразится аналогично тексту, заключённому между тегами
# <pre></pre>. image/gif -- Картинка, формат gif video/mpeg --
# mpeg-видео И целая куча других форматов, см. файл mime.types из apache
print "n";
# <-- еще одна пустая строка, обозначает конец вывода наших
# заголовков. ВАЖНО!
# Теперь мы можем написать свой текст клиенту
print qq{
<html>
<head>
<title>Моя первая CGI программа</title>
</head>
<body>
<h1>Моя первая CGI программа</h1>
</body>
</head>
};
Прием данных от клиента
Взаимодействие с клиентом обеспечивается так: Он заполняет форму своими
значениями, нажимает на кнопку "submit", броузер кодирует данные
соответствующим образом и отправляет их серверу.
Определение форм
Производится тегами <form> и </form>. Тег определения форм имеет
следующие атрибуты
action
скрипт на сервере, который будет запущен на сервере для обработки данных
формы.
method
тип взаимодействия с сервером. Может иметь значения GET и
POST. Плюс, еще некоторые специальные, которые вы можете посмотреть в
rfc
(Аттрибуты перечислены не все, как обычно)
Формы не могут быть вложенными.
Элементы ввода
Определяются тегами <input>, <textarea> и <select>
тег <input>:
<input type=checkbox>
Элемент ввода "Опция"
<input type=hidden>
Элемент ввода, который не виден
пользователю
<input type=file>
в Netscape Navigator позволяет загрузить
файл на сервер
<input type=image>
Изображение. Если по нему щелкнуть, это
вызовет submit формы и серверу будут выданы две переменные вида name.x и
name.y, где name -- то, что вы пропишете в name=... тега <input>
<input type=password>
Элемент ввода Пароль. Позволяет ввести
строку, которая на экране отображается звездочками. Никаких методов защиты при
передаче на сервер не применяется
<input type=radio>
Радиокнопки
<input type=reset>
Кнопка сброса значений формы на начальные
<input type=submit>
Кнопка отправки формы на сервер
<input type=text>
строка ввода
Все теги <input> имеют атрибут name -- Наименование элемента. Служит для
идентификации при передаче на сервер, а также другие типа value, width, etc,
название и назначение которых можно опять-таки посмотреть в учебнике.
В случае GET сервер установит переменную окружения QUERY_STRING в виде
name1=vaue1&name2=value2&..&nameN=valueN.
В случае POST аналогичная строка будет записана на стандартный ввод. Ее
длину можно получить через переменную окружения CONTENT_LENGTH.
В обоих случаях данные будут закодированы по следующему алгоритму:
Если ASCII код символа больше 32 и меньше 128, то он будет выдан без
изменения.
если символ - пробел, то он заменится на "+" (плюсик, без кавычек)
все остальное преобразуется в вид %xx, где xx -- шестнадцатеричный
код символа. Если вам повезло и у вас "Русский apache", то он
преобразует его в нормальную кодировку.
На самом деле, можно не возится со всем этим, а использовать модуль CGI.pm
(Имеется в поставке Perl 5.004 и более поздних. Если у вас perl версии 4
или 1, нужно срочно взять на CPAN новую версию perl)
Самый большой и последний пример
Предположим мы делаем поисковую систему, тогда у нас должен быть HTML с
формой и программа, которая будет выполнять поиск.
#!/usr/bin/perl -- поменяйте, как надо
use CGI qw(:standard);
print "Content-Type: text/htmlnn"; # Не забудьте про два "n"
$string = param("string");
@searchin = param("searchin"); # searchin это checkbox и его значения
# возвращаются списком
# Искать мы сегодня ничего не будем
print "<html>
<body>
<h1>Мы сегодня ничего не ищем</h1>
Но, если бы искали, то: <br>
Искали бы строку <b>$string</b><br>n";
print "В <b>" . join(" ", @searchin) . "</b>n";
print "
</body>
</html>
";
Да, кстати, если вы собираетесь писать в файлы с помощью CGI-программ, не
забывайте про file locking (См. часть C за подробностями).
print "Content-Type: type/sub-typen"; # Подставьте Ваш тип/подтип
print "Pragma: no-cachen"; # Для HTTP/1.0 клиентов
print "Cache-Control: no-cachen"; # Для HTTP/1.1
print "Expires: Thu Jan 1 00:00:00 1970nn"; # Это уже любой броузер должен
# понять
print "Status: 302n";
# Или 301. Разница состоит в том, что по стандарту 301 значит "перемещён
# навсегда", а 302 -- "перемещён временно"
print "Location: ВАШ Новый URLn";
# URL должен быть указан абсолютный
print "URI: ВАШ новый URLnn"; # Для http/1.0
Подробности: см. rfc1945(http/1.0), rfc2068(http/1.1)
Плюшки работают следующим образом: программа CGI добавляет в свой
ответ директиву Set-Cookie, а клиент (если он поддерживает плюшки), при
следующих запросах возвращает их в заголовке Cookie. Сами плюшки
представляют из себя пары имя=значение.
Сервер может установить не более 20 плюшек, размер всей плюшки не может
превышать 4Kb.
Имя=значение
единственный обязательный параметр. И имя, и значение
могут быть строками текста, не содержащими символов перевода строки,
пробелов, ; и табуляции. Если необходимо их использовать, можно эти
символы закодировать при помощи стандартного uri-кодирования.
expires=дата
устанавливается дата истечения срока действия плюшки.
После этой дата плюшка клиентом не возвращается. Если дата не
установлена, то плюшка действует до завершения работы браузера.
path=путь
обозначает путь на сервере, для которого возвращается
эта плюшка, если не указано, то только для того, который ее создал.
domain=домен
домен, для которого возвращается эта плюшка. Может
быть доменом уровня 2 и выше, т.е. .example.ru, а не .ru. Если не
установлен, то плюшка возвращается только серверу, который выдал
плюшку.
secure
указывает, что плюшка должна возвращаться только по
защищенному соединению (SSL).
Программы CGI могут получить пары имя-значение через переменную
окружения HTTP_COOKIE. В модуле CGI.pm значение можно получить при
помощи метода cookie().
В деталях, механизм плюшек описан в rfc2109 (HTTP State Management
Mechanism. D. Kristol, L. Montulli. February 1997.)
Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!