Существует два понятия, общих почти для всех программ, - это обработка входных данных и вывод результатов. На этой странице мы сфокусируем внимание на обработке ввода CGI-программ. Во-первых, откуда берутся входные данные, и, во-вторых, как входные данные передаются серверу. Для написания эффективных CGI-программ вы должны иметь иметь ясное представление об этих вещах.
Сервер принимает три типа запросов: GET, POST и HEAD. Запрос программы к Web-серверу выглядит следующим образом:
GET /index.html
HTTP/1.0
Первая часть, в данном случае GET, - это метод запроса,
вторая, index.html, - запрашиваемый URL,
третья, HTTP/1.0, - протокол, используемый клиентом.
Два основных метода запроса - это GET и POST. Это те самые методы которые доступны вам при создании формы. Метод HEAD редко используется броузером, поскольку он запрашивает только заголовок ответа, а тело ответа в таком случае не передается. Например, для проверки того, не изменилась ли страница, броузер может запросить заголовок, но при этом не порождается полноценный обмен данными.
По умолчанию при запросе используется метод GET. Метод POST используется только тогда, когда это явно указано в запросе формы. Для CGI-программиста очень важно понимать, что при запросе методом GET данные формы передаются серверу вместе с URL. Web-серверы, поддерживающие CGI, копируют эти данные в переменную окружения с именем QUERY_STRING. После этого забота о получении данных из переменной окружения и их обработке возлагается на CGI-программу.
URL со строкой запроса выглядит так:
http://www.domen-name.com/login.pl?nick=maks&psw=parol
Знак ? отделяет строку запроса от собственно URL ресурса; nick и psw - переменные передаваемые серверу, maks и parol - их значения соответственно.
Метод POST используется тогда, когда это явно указано в атрибуте формы METHOD. В отличии от метода GET, POST помещает данные не в URL, а в тело запроса. Запрос POST во многом похож на ответ HTTP. Первая строка представляет собой стандартный запрос HTTP, в котором указан метод POST. В ней могут быть необходимые дополнительные заголовки, отделяемые от тела запроса пустой строкой.
Тело запроса при использовании метода POST передается программе как стандартный поток ввода.
Понятно, что при разработке форм перед CGI-программистом встанет вопрос: какой из этих методов применять. В большинстве случаев применимы оба метода и оба будут хорошо работать. Однако бывают ситуации, когда использование того или иного метода дает определенные преимущества.
Рассмотрим несколько ситуаций, когда есть смысл предпочесть метод GET или POST.
Если вы хотите, чтобы ваша программа вызывалась с помощью ссылки, предпочтение следует отдать методу GET.
Если вы не хотите, чтобы аргументы, передаваемые вашей программе, записывались в файл отчета сервера, используйте метод POST. Например, если форма требует указать имя пользователя и пароль, вы вряд ли захотите, чтобы имена и пароли сохранялись в файле отчета. Кроме того, не разумно передавать пароль как часть URL.
Если ваша форма имеет значительные размеры, непример в ней есть текстовые окна с заметками и коментариями, следует использовать метод POST. Вообще говоря, можно и в этом случае применять метод GET, но тогда вы сможете столкнуться с ограничениями на размер URL, разными для разных операционных систем и броузеров (ограничение обусловленно размером переменных окружения). Проще воспользоваться методом POST.
Если ваша форма содержит файловое поле, используйте метод
POST. Кроме того, в этом случае нужно
установить значение атрибута ENCTYPE в
multipart/form-data
.