Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Технология доступа к базам данных на стороне сервера с использованием механизма CGI



В соответствии с идеологией CGI-интерфейсов, вся функциональность размещается на сервере приложений. Ее реализует один или несколько CGI-скриптов, которые получают от Web-сервера запрос пользователя. Результатом выполнения скрипта является HTML-документ, содержащий информацию из базы данных. Этот документ передается Web-серверу, а затем отправляется в клиентский обозреватель по протоколу HTTP. Дополнительно, в результате выполнения скрипта возможно изменение информации в базе данных.

Для реализации взаимодействия " клиент-сервер" важно, какой метод HTTP запроса использует клиентская часть при обращении к WWW серверу. В общем случае, запрос - это сообщение, посылаемое клиентом серверу. Первая строка HTTP запроса включает в себя метод, который должен быть применен к запрашиваемому ресурсу, идентификатор ресурса (URI - Uniform Resource Identifier), и используемую версию HTTP-протокола. Применительно к CGI, клиентская часть использует методы запроса POST и GET. Метод POST применяется для запроса серверу, чтобы тот принял информацию, включенную в запрос, как относящуюся к ресурсу, указанному идентификатором ресурса. Метод GET используется для получения любой информации, идентифицированной идентификатором ресурса в HTTP запросе.

Согласно спецификации, CGI определяет 4 информационных потока:

Переменные окружения;

Стандартный выходной поток;

Стандартный входной поток;

Командная строка.

Переменные окружения

Ниже приводится значение некоторых переменных, объявленных в стандарте CGI:

CONTENT_LENGTH - значение этой переменной соответствует длине стандартного входного потока в символах;

QUERY_STRING - значение этой переменной соответствует строке символов следующей за знаком "? " в URL соответствующему данному запросу. Эта информация не декодируется сервером.

2. Стандартный вывод

CGI - модуль выводит информацию в стандартный выходной поток. Этот вывод может представлять собой или документ, сгенерированный cgi-модулем, или инструкцию серверу, где получить необходимый документ. Обычно cgi-модуль производит свой вывод. Преимущество такого подхода в том, что cgi-модуль не должен формировать полный HTTP заголовок на каждый запрос.

Вывод cgi-модуля должен начинаться с заголовка содержащего определенные строки и завершаться двумя символами CR (0x10). Любые строки не являющиеся директивами сервера, посылаются непосредственно клиенту. На данный момент, CGI спецификация определяет три директивы сервера:

Content-type

MIME или тип возвращаемого документа. Например:

Content-type: text/html < CR> < CR>

сообщает серверу, что следующие за этим сообщением данные - есть документ в формате HTML;

Location

указывает серверу, что возвращается не сам документ, а ссылка на него. Если аргументом является URL, то сервер передаст указание клиенту на перенаправление запроса. Если аргумент представляет собой виртуальный путь, сервер вернет клиенту заданный этим путем документ, как если бы клиент запрашивал этот документ непосредственно.

Status

задает серверу HTTP/1.0 строку-статус, которая будет послана клиенту в формате: nnn xxxxx

где: nnn - 3-х цифровой код статуса

ххххх - строка причины

Например: HTTP/1.0 200 OK

Server: NCSA/1.0a6

Content-type: text/plain

< динамически генерируемый текст сообщения3. Стандартный входной поток

В случае метода запроса POST данные передаются как содержимое HTTP запроса и будут посланы в стандартный входной поток. Данные передаются cgi-модулю в следующей форме:

name=value& name1=value1&...& nameN=valueN

где 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.

Например

http: //host/cgi-bin/script? name1=value1& name2=value2

В этом случае переменная окружения QUERY_STRING принимает значение

name1=value1& name2=value2

4. Аргументы командной строки

СGI-модуль в командной строке от сервера получает:

остаток URL после имени cgi-модуля в качестве первого параметра (первый параметр будет пуст, если присутствовало только имя cgi-модуля);

список ключевых слов в качестве остатка командной строки для скрипта поиска, или чередующиеся имена полей формы с добавленным знаком равенства и соответствующих значений переменных.

Ключевые слова, имена и значения полей формы передаются декодированными (из HTTP-URL формата кодирования) и перекодированными в соответствии с правилами кодирования Bourne shell [12] так, что cgi-модуль в командной строке получит информацию без необходимости осуществлять дополнительные преобразования (рассматривается реализация на Unix-платформе).

Исходя из разницы методов запросов GET и POST, можно определить последовательность действий для обработки входных данных cgi-модуля для разных типов запросов.

I. Для метода GET

Получить значение переменной QUERY_STRING;

Декодировать имена и их значения (учитывая, что все пробелы при декодировании сервером были заменены символом " +" и все символы с десятичным кодом больше 128 преобразованы в символ " %" и следующим за ним шестнадцатеричным кодом символа.);

Сформировать структуру соответствия " имя - значение" для дальнейшего использования в cgi-модуле.

II. Для метода POST

Получить из стандартного входного потока CONTENT_LENGTH символов;

Декодировать имена и их значения (учитывая, что все пробелы при декодировании сервером были заменены символом " +" и все символы с десятичным кодом больше 128 преобразованы в символ " %" и следующим за ним шестнадцатеричным кодом символа.);

Сформировать структуру соответствия " имя-значение" для дальнейшего использования в cgi-модуле.

После формирования структуры " имя-значение" можно приступить к решению задач, ради которых, собственно, создавался cgi-модуль. Следующим важным моментом является динамическое формирование cgi-модулем HTML-документа (оформление результата работы модуля). Например, таблицы выборки из базы данных.

Для этого cgi-модуль должен выдать в стандартный выходной поток заголовок, состоящий из строки:

Content-type: text/html и пустой строки (двух символов CR).

После этого заголовка можно выдавать любой текст в формате HTML.

Как уже говорилось ранее, CGI-скрипт играет роль посредника между Web-сервером и другими видами серверов, в частности с сервером баз данных. В качестве языка CGI-скриптов часто выступает язык Perl [11] (Practical Extraction and Report Language)- интерпретируемый язык, приспособленный для обработки произвольных текстовых файлов, извлечения из них необходимой информации и выдачи сообщений. Здесь будет освящен вопрос доступа к базе данных Oracle из языка perl.

Это возможно благодаря наличию в свободно-доступной библиотеке Perl-модулей (доступна на http: //www.perl.com/CPAN/) пакетов для работы с базами данных: DBI и DBD-Oracle. DBI представляет собой абстрагированный от конкретного SQL-сервера интерфейс-надстройку над интерфейсом DBD-xxxx, который закреплен за конкретным SQL-сервером.

Ниже приводятся описание некоторых функций из пакета DBI:

$dbh = DBI-> connect('dbi: Oracle: '.'db_alias', 'db_user', 'db_pwd', {RaiseError => 1});

$dbh-> {RaiseError} = 1; # do this, or check every call for errors

- установка соединения с базой данных Oracle

$cursor = $dbh-> prepare(" SELECT Fie1d, Field2 FROM Table1 ORDER BY Field2" );

$cursor-> execute;

while (@row = $cursor-> fetchrow_array) {

print " $row[0], $row[1] \n";

}

- выполнение запроса к базе данных (значения полей Field1, Filed2 помещаются в массив @row)

my($Field1, $Field2, $Field3);

$cursor = $dbh-> prepare(" SELECT Field1, Field2, Field3 FROM Table1" );

$cursor-> bind_columns(undef, \($Field1, $Field2, $Field3));

$cursor-> execute;

while $cursor-> fetch) {

print " $Field1, $Field2, $Field3 \n";

}

- выполнение запроса к базе данных (значения полей Field1, Field2, Field3 помещаются в переменные $Field1, $Field2, $Field3)

$rc = $cursor-> finish;

$rc = $dbh-> disconnect;

- закрытие курсора и отсоединение от базы данных.

Рассмотрим реализацию, базирующуюся на Web-сервере Apache для Unix-систем. Для того чтобы Web-сервер мог выполнять CGI-скрипты, написанные на языке perl, файл с perl-программой должен иметь атрибут ⌠ исполняемый■. Если файлы с программой расположены в каталоге, отличном от каталога, прописанного в директиве ScriptAlias (обычно cgi-bin) файла конфигурации Web-сервера srm.conf, то дополнительно необходимо создать строку, вида

AddHandler cgi-script.cgi

в файле srm.conf (предполагается, что файлы будут иметь расширение.cgi). После внесения любых изменений в файлы конфигурации Web-сервера, его необходимо перезапустить командой

$ Apache_HOME/sbin/apachectl restart

где Apache_HOME √ каталог, где расположен Web-сервер.

Первой строкой perl-программы должна быть строка, вида

#! /usr/local/bin/perl

задающая путь до интерпретатора языка perl в системе.


Поделиться:



Последнее изменение этой страницы: 2019-10-03; Просмотров: 223; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.031 с.)
Главная | Случайная страница | Обратная связь