FAQ по perl и программированию для web - 4. CGI-скрипты

ОГЛАВЛЕНИЕ


4. CGI-скрипты

4.1 Что такое CGI и как с ним работать

CGI -- Common Gateway Interface. Стандарт интерфейса внешних программ с http-сервером.

Как работать

HTTP -- клиент-серверный протокол, следовательно со стороны CGI-программы, как серверного процесса, все взаимодействие выглядит следующим образом

  1. Получение данных от клиента
  2. Обработка данных
  3. Выдача ответа клиенту.

Пункты 1 и 3 я вкратце опишу здесь, а 2, надеюсь, сделаете сами :-). Начнем с п.3, как наиболее простого.

3. Выдача данных клиенту

Обычно клиенту выдают текст в формате HTML (ничто не мешает Вам отправить ему и картинку/видео/etc). Для того, чтобы сервер и клиент вас поняли, необходимо сказать, что вы выдаете, c помощью заголовка Content-Type: mime-type/mime-subtype. Обратите внимание на регистр и последовательность -- если вы скажите нечто типа Content_type, то сервер вас скорее всего не поймет. (Сообщение типа "500 Internal Server Error" будет симптомом).

Пример:

print "Content-Type: text/html\n";

# Мы выдаем текст в формате 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, название и назначение которых можно опять-таки посмотреть в учебнике.

Тег <textarea> -- Поле многострочного ввода.

Тег <select> -- списочный выбор

Пример:

  <form action=/cgi-bin/myscript.pl method=GET>
Имя: <input type=string name=name><p>
Пол: <input type=radio name=gender value=male>Мужской
<input type=radio name=gender value=female>Женский
<input type=submit><input type=reset>
</form>

Как это будет видно в моей программе?

Это определяется методом формы, GET или POST

В случае GET сервер установит переменную окружения QUERY_STRING в виде name1=vaue1&name2=value2&..&nameN=valueN.

В случае POST аналогичная строка будет записана на стандартный ввод. Ее длину можно получить через переменную окружения CONTENT_LENGTH.

В обоих случаях данные будут закодированы по следующему алгоритму:

  • Если ASCII код символа больше 32 и меньше 128, то он будет выдан без изменения.
  • если символ - пробел, то он заменится на "+" (плюсик, без кавычек) все остальное преобразуется в вид %xx, где xx -- шестнадцатеричный код символа. Если вам повезло и у вас "Русский apache", то он преобразует его в нормальную кодировку.