Данная спецификация определяет стандартный способ обмена данными между прикладной программой и HTTP-сервером. Спецификация была предложена для сервера NCSA и является основным средством расширения возможностей обработки запросов клиентов HTTP-сервером.
В CGI имеет смысл выделить следующие основные моменты:
- понятие CGI-скрипта ;
- типы запросов;
- механизмы приема данных скриптом;
- механизм генерации отклика скриптом.
Основное назначение CGI — обработка данных из HTML-форм. В настоящее время область применения CGI гораздо шире.
Понятие CGI-скрипта
CGI-скриптом называют программу, написанную на любом языке программирования или командном языке, которая осуществляет обмен данными с HTTP-сервером в соответствии со спецификацией Common Gateway Interface .
Наиболее популярными языками для разработки скриптов являются Perl и С.
Типы запросов
Различают два типа запросов к CGI-скриптам : по методу GET и по методу POST . В свою очередь, запросы по методу GET подразделяются на запросы по типам кодирования: isindex и form-urlencoded , а запросы по методу POST — multipart/form-data и form-urlencoded .
С ЧЕГО НАЧАТЬ ИЗУЧЕНИЕ 3D | CGI
В запросах по методу GET данные от клиента передаются скрипту в переменной окружения QUERY_STRING . В запросах по методу POST данные из формы передаются в потоке стандартного ввода скрипта. При передаче через поток стандартного ввода в переменной окружения CONTENT_LENGTH указывается число передаваемых символов.
Запрос типа ISINDEX — это запрос вида:
http://intuit.ru/somthing-cgi/cgi-script?word1+word2+word3
Главным здесь является список слов после символа «?». Слова перечисляются через символ » + » и для кириллицы в шестнадцатеричные последовательности не кодируются. Последовательность слов после символа » ?» будет размещена в переменной окружения QUERY_STRING .
Запрос типа form-urlencoded — это запрос вида:
http://intuit.ru/somthing-cgi/cgi-script?field=word1 имя_поля=значение «, которые разделены символом » .
Приведенный пример — это обращение к скрипту по методу GET . Все символы после «?» попадут в переменную окружения QUERY_STRING . При этом если в значениях полей появляется кириллица или специальные символы, то они заменяются шестнадцатиричным кодом символа, который следует за символом » % «.
При обращении к скрипту по методу POST данные после символа » ?» не будут размещаться в QUERY_STRING , а будут направлены в поток стандартного ввода скрипта. В этом случае количество символов в потоке стандартного ввода скрипта будет указано в переменной окружения CONTENT_LENGTH .
При запросе типа multipart/form-data применяется составное тело HTTP-сообщения, которое представляет собой данные, введенные в форме, и данные присоединенного внешнего файла. Это тело помещается в поток стандартного ввода скрипта. При этом к данным формы применяется кодирование как в form-urlencoded , а данные внешнего файла передаются как есть.
Что такое CGI?
Механизмы приема данных скриптом
Скрипт может принять данные от сервера тремя способами:
- через переменные окружения;
- через аргументы командной строки;
- через поток стандартного ввода.
При описании этих механизмов будем считать, что речь идет об обмене данными с сервером Apache для платформы Unix.
Переменные окружения
При вызове скрипта сервер выполняет системные вызовы fork и exec . При этом он создает среду выполнения скрипта, определяя ее переменные. В спецификации CGI определены 22 переменные окружения. При обращении к скрипту разными методами и из различных контекстов реальные значения принимают разные совокупности этих переменных. Например, при обращении по методу POST переменная QUERY_STRING не имеет значения, а по методу GET — имеет. Другой пример — переменная окружения HTTP_REFERER . При переходе по гипертекстовой ссылке она определена, а если перейти по значению поля location или через JavaScript-программу, то HTTP_REFERER определена не будет.
Получить доступ к переменным окружения можно в зависимости от языка программирования следующим образом:
#Perl $a = $ENV; . // C a = getenv(«CONTENT_LENGTH»);
В случае доступа к скрипту по методу GET данные, которые передаются скрипту, размещаются в переменной окружения QUERY_STRING .
Аргументы командной строки
Как ни странно звучит, но у CGI-скрипта может быть такой элемент операционного окружения как командная строка. Это не означает, что скрипт реально можно вызвать из командной строки через сервер. Тем не менее получить доступ к содержанию командной строки скрипта можно с помощью тех же функций, что и при вызове его из-под интерактивной оболочки:
В обоих примерах показана распечатка аргументов командной строки для программ на Perl и C соответственно.
Аргументы командной строки появляются только в запросах типа ISINDEX .
Поток стандартного ввода
Ввод данных в скрипт через поток стандартного ввода осуществляется только при использовании метода доступа к ресурсу (скрипту) POST . При этом в переменную окружения CONTENT_LENGTH помещается число символов, которое необходимо считать из потока стандартного ввода скрипта, а в переменную окружения CONTENT_TYPE помещается тип кодирования данных, которые считываются из потока стандартного ввода.
При посимвольном считывании в C можно применить, например, такой фрагмент кода:
int n; char *buf; n= atoi(getenv(«CONTENT_LENGTH»)); buf = (char *) malloc(n+1); memset(buf,’