Страница 6 из 16
4. CGI-скрипты 4.1 Что такое CGI и как с ним работать CGI -- Common Gateway Interface. Стандарт интерфейса внешних программ с https-сервером. Как работать 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/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", то он преобразует его в нормальную кодировку.
|