Глава 4. Использование CGI при создании интерактивных интерфейсовСергей Нужин4.1 WWW (World Wide Web) и средства интерактивного взаимодействия 4.2Спецификация CGI
4.3Последовательность действий для обработки входных данных cgi-модуля для разных методов запроса GET и POST
Приложение 1: Конструкции языка HTML для построения форм При написании данной главы использовались материалы National Center for Supercomputing Applications 4.1 WWW (World Wide Web) и средства интерактивного взаимодействияЦель данной главы познакомить пользователя с той частью WWW-технологий которая связана с созданием интерактивных интерфейсов и предполагается что пользователь знаком с основами WWW, HTML и С/С++. В общем случае, интерактивный интерфейс пользователя представляет собой систему, обеспечивающую взаимодействие пользователя и программы. Для WWW, интерактивный интерфейс можно определить как последовательность HTML-документов, реализующих интерфейс пользователя. Можно также условно классифицировать принципы построения интерфейса по типу формирования HTML-документа:
В первом случае источником интерфейса является HTML-документ, созданный в каком-либо текстовом или HTML-ориентированном редакторе. Следовательно, данный документ остается неизменным в течение использования. Во втором случае источником интерфейса является HTML-документ сгенерированный cgi-модулем. Следовательно, появляется некоторая гибкость в видоизменении интерфейса во время использования. Таким образом, можно ввести понятие интерактивного интерфейса для WWW. Интерактивный интерфейс для WWW представляет собой последовательность статических или динамически формируемых HTML-документов, реализующих интерфейс пользователя. Практически любая задача, решающая проблему получения данных от клиента, связана с построением интерфейса. Наиболее интересным является построение интерфейсов к различным базам данных, доступ к SQL-серверу, получение информации от периферийных устройств, создание клиентских рабочих мест. Все это возможно посредством CGI(Common Gateway Interface). Common Gateway Interface (CGI) является стандартом интерфейса внешней прикладной программы с WWW сервером. Задача построения вышеназванных интерфейсов делится на две части:
Клиентская частьДля создания клиентской части необходимо создать HTML-документ, в котором реализован интерфейс с пользователем. В языке HTML это возможно посредством форм. Конструкции языка HTML, используемые при реализации форм, даны в приложении 1 к гл. 4. Серверная частьСерверная часть состоит из исполняемого модуля, решающего основные задачи обработки данных поступающих от клиентской части, формирования ответа в формате HTML, и т.д. Такой модуль называется cgi-модулем. Методы HTTP запросаДля реализации взаимодействия "клиент-сервер" важно, какой метод HTTP запроса использует клиентская часть при обращении к WWW серверу. В общем случае, запрос - это сообщение, посылаемое клиентом серверу. Первая строка HTTP запроса(см. гл.3) включает в себя метод, который должен быть применен к запрашиваемому ресурсу, идентификатор ресурса(URI-Uniform Resource Identifier), и используемую версию HTTP-протокола. В рассматриваемом нами случае, клиентская часть применяет методы запроса POST и GET. Метод POST используется для запроса серверу, чтобы тот принял информацию, включенную в запрос, как относящуюся к ресурсу, указанному идентификатором ресурса. Метод GET используется для получения любой информации, идентифицированной идентификатором ресурса в HTTP запросе. Для WWW-сервера стандарта NCSA прикладные программы или CGI-модули, обрабатывающие поток данных от клиента или (и) формирующие обратный поток данных могут быть написаны на таких языках программирования как:
4.2 Спецификация CGICGI определяет 4 информационных потока.
Рисунок 4-2. CGI-интерфейс. 4.2.1 Переменные окруженияПеременные окружения условно делятся на два типа:
К переменным первого типа относятся следующие переменные: SERVER_SOFTWARE содержит информацию о WWW сервере (название/версия) SERVER_NAME содержит информацию об имени машины, на которой запущен WWW сервер, символическое имя или IP адрес соответствующие URL. GATEWAY_INERFACE содержит информацию о версии CGI(CGI/версия) Следующие переменные являются специфичными для разных типов запросов и значения этим переменным присваиваются перед вызовом cgi-модуля. CONTENT_LENGTH значение этой переменной соответствует длине стандартного входного потока в символах. CONTENT_TYPE эта переменная специфицирована для запросов содержащих дополнительную информацию, таких как HTTP POST и PUT, и содержит тип данных этой информации. SERVER_PROTOCOL эта переменная содержит информацию об имени и версии информационного протокола (протокол/версия). SERVER_PORT значение переменной содержит номер порта, на который был послан запрос. REQUEST_METHOD метод запроса, который был использован "POST","GET","HEAD" и т.д. PATH_INFO значение переменной содержит полученный от клиента виртуальный путь до cgi-модуля PATH_TRANSLATED значение переменной содержит физический путь до cgi-модуля, преобразованный из значения PATH_INFO. SCRIPT_NAME виртуальный путь к исполняемому модулю, используемый для получения URL. QUERY_STRING значение этой переменной соответствует строке символов следующей за знаком "?" в URL соответствующему данному запросу. Эта информация не декодируется сервером. REMOTE_HOST содержит символическое имя удаленной машины, с которой был произведен запрос. В случае отсутствия данной информации сервер присваивает пустое значение и устанавливает переменную REMOTE_ADDRESS. REMOTE_ADDRESSсодержит IP адрес клиента AUTH_TYPE если WWW-сервер поддерживает аутентификацию (подтверждение подлинности) пользователей и cgi-модуль является защищенным от постороннего доступа то, значение переменной специфицирует метод аутотентификации. REMOTE_USER содержит имя пользователя в случае аутотентификации. REMOTE_IDENT содержит имя пользователя, полученное от сервера (если сервер поддерживает аутентификацию согласно RFC 931) HTTP_ACCEPT список типов MIME известных клиенту. Каждый тип в списке должен быть отделен запятой согласно спецификации HTTP (тип/подтип,тип/подтип и т.д.) HTTP_USER_AGENT название программы просмотра которую использует клиент при посылке запроса. 4.2.2 Стандартный выводСGI - модуль выводит информацию в стандартный выходной поток. Этот вывод может представлять собой или документ, сгенерированный cgi-модулем, или инструкцию серверу, где получить необходимый документ. Обычно cgi-модуль производит свой вывод. Преимущество такого подхода в том, что cgi-модуль не должен формировать полный HTTP заголовок на каждый запрос.
Заголовок выходного потока
Заголовки с синтаксическим разбором
Любые строки не являющиеся директивами сервера, посылаются непосредственно клиенту. На данный момент, CGI спецификация определяет три директивы сервера:
Content-type
Например: Content-type: text/html <CR><CR> сообщает серверу, что следующие за этим сообщением данные - есть документ в формате HTML
Location
Если аргументом является URL, то сервер передаст указание клиенту на перенаправление запроса. Если аргумент представляет собой виртуальный путь, сервер вернет клиенту заданный этим путем документ, как если бы клиент запрашивал этот документ непосредственно. Например: Location: http://host/file.txt приведет к тому, что WWW сервер выдаст file.txt, как если бы он был затребован клиентом. Если cgi-модуль возвращает ссылки на gopher сервер, например на gopher://gopher.ncsa.uiuc.edu/. Вывод будет следующий:
Location: gopher://gopher.ncsa.uiuc.edu/
*Status
где: nnn - 3-х цифровой код статуса
ххххх - строка причины Например: HTTP/1.0 200 OK Server: NCSA/1.0a6
Content-type: text/plain
<динамически генерируемый текст сообщения> В данном случае, клиенту будет сообщено об успешном выполнении запроса. 4.2.3 Стандартный входной потокВ случае метода запроса POST данные передаются как содержимое HTTP запроса. И будут посланы в стандартный входной поток. Данные передаются cgi-модулю в следующей форме:
где name - имя переменной, value - значение переменной, N - количество переменных На файловый дескриптор стандартного потока ввода посылается CONTENT_LENGTH байт. Так же сервер передает cgi-модулю CONTENT_TYPE (тип данных). Сервер не посылает символ конца файла после передачи CONTENT_LENGTH байт данных или после того, как cgi-модуль их прочитает. Переменные окружения CONTENT_LENGTH и CONTENT_TYPE устанавливаются в тот момент, когда сервер выполняет cgi-модуль. Таким образом, если в результате исполнения формы с аргументом тега FORM - METHOD="POST" сформирована строка данных firm=МММ&price=100023, то сервер установит значение CONTENT_LENGTH равным 21 и CONTENT_TYPE в application/x-www-form-urlencoded, а в стандартный поток ввода посылается блок данных.
В случае метода GET, строка данных передается как часть URL.
В этом случае переменная окружения QUERY_STRING принимает значение
4.2.4 Аргументы командной строкиСGI-модуль в командной строке от сервера получает:
|
Для демонстрации реализации формы с методом запроса GET воспользуемся той же самой формой, что и для метода POST и программой query. Для этого изменим значение атрибутов ACTION и METHOD в теге FORM. <FORM action="http://iceman.cnit.nsu.ru/cgi-bin/query" METHOD=GET>
После инициации формы сервер установит следующие значения для
переменных окружения и аргументов командной строки:
argc = 0. argv is =
Как мы видим, выходной поток от формы появился в значении переменной QUERY_STRING. Результат работы query полностью совпадает с результатом работы post-query. Приложение 1 к гл.4 Конструкции языка HTML для построения форм<FORM атрибуты>...</FORM> использование: предназначен для получения информации от клиента и определяет начало и конец формы. атрибуты:
Важно: Формы не могут быть вложенными! Для реализации формы используются следующие теги. <INPUT> использование: предназначен для создания различных по своей функциональности полей ввода. атрибуты:
<TEXTAREA атрибуты>...</TEXTAREA> использование: предназначен для определения области ввода текста. Размер поля определяется атрибутами. атрибуты:
NAME - значение этого атрибута определяет идентификатор
поля. Возвращается при инициации формы.
<SELECT атрибуты>
использование: предназначен для определения области выбора из нескольких значений (меню). Атрибуты:
NAME - значение этого атрибута определяет идентификатор
поля. Возвращается при инициации формы. <OPTION атрибуты> значение использование: используется только с <SELECT> для определения пунктов меню. атрибуты:
SELECTED - определяет значение по умолчанию
Примечание: в [ ] даны необязательные атрибуты
Copyright © CIT |