Технология CGI приложения

Работа Интернета по технологии "клиент-сервер". Методы запросов браузера. Структура заголовков ответа сервера. Данные о каталоге запуска сценария, установленных в нем переменных и заданных дескрипторах файлов. Переменные окружения и их значение.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.12.2013
Размер файла 38,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

  • Введение
  • 1. Общий шлюзовой интерфейс
    • 1.1 Запросы браузера
      • 1.1.1 Методы запросов
    • 1.2 Ответы сервера
  • 2. CGI-окружение
    • 2.1 Файловые дескрипторы
    • 2.2 Переменные окружения
  • 3. HTM-формы
    • 3.1 Подтверждение и посылка формы
  • 4. Отладка CGI-приложений
    • 4.1 Техника создания кода на Perl
  • Заключение
  • Литература
  • Приложение
  • Введение
  • World Wide Web - глобальная компьютерная сеть, на сегодняшний день содержит миллионы сайтов, на которых размещена всевозможная информация. Люди получают доступ к этой информации посредством использования технологии Internet. Для навигации в WWW используются специальные программы - web-браузеры, которые существенно облегчают путешествие по бескрайним просторам WWW. Вся информация в web-браузере отображается в виде web-страниц, которые являются основным элементом сайтов WWW.
  • Даже красиво оформленный сайт может быть неуспешным, если будет состоять из статических ресурсов, таких как текст, графика. Динамические ресурсы, в свою очередь, позволяют изменять информацию от запроса к запросу в зависимости от ряда условий, включая изменяющийся источник данных (например, база данных), пользователя, посылающего запрос, или введенные пользователем данные. Технологией, обеспечивающей динамическое содержимое, является CGI.
  • Сложно перечислить все, что можно сделать при помощи CGI. Если вы хотите обеспечить поиск по своему сайту, то CGI-приложение - именно то, что нужно для обработки информации. Если пользователь заполняет форму на Web-сервере, то данные обрабатываются CGI-приложением. Если делает заказ в электронном магазине, то CGI-приложение подтверждает действительность его кредитной карты и регистрирует операцию.
  • Цель данного курсового проекта - написать руководства по технологии CGI.
  • Для достижения данной цели в работе решаются следующие задачи:
  • - описание технологии клиент-сервер;
  • - руководство технологии CGI;
  • - написание CGI-приложений.
  • В качестве языков программирования для реализации цели проекта выбраны языки HTML и Perl. Данный выбор обусловлен массовым применением языка HTML. А также для программирования CGI-скриптов язык Perl, потому что он способствует быстрой разработке, так как это интерпретируемый язык, исходный код не надо компилировать перед запуском, доступен на многих платформах с минимальными изменениями, содержит очень мощные функции для обработки строк со встроенной в язык поддержкой поиска и замены по регулярным выражениям.
  • Практическая значимость работы. Полученные результаты, материал курсовой работы можно использовать как основу для изучения CGI-технологии и создания на данной базе CGI-сценариев.
  • 1. Общий шлюзовой интерфейс
  • CGI - Common Gateway Interface является стандартом интерфейса (связи) внешней прикладной программы с информационным сервером типа HTTP, web-сервер.
  • Обычно гипертекстовые документы, извлекаемые из WWW серверов, содержат статические данные. С помощью CGI можно создавать CGI-программы, называемые шлюзами, которые во взаимодействии с такими прикладными системами, как система управления базой данных, электронная таблица, деловая графика и др., смогут выдать на экран пользователя динамическую информацию.
  • Программа-шлюз запускается WWW сервером в реальном масштабе времени. WWW сервер обеспечивает передачу запроса пользователя шлюзу, а она в свою очередь, используя средства прикладной системы, возвращает результат обработки запроса на экран пользователя. Программа-шлюз может быть закодирована на языках C/C++, Fortran, Perl, TCL, Unix Schell, Visual Basic, Apple Script. Как выполнимый модуль, она обычно записывается в поддиректорий с именем cgi-bin WWW сервера.
  • Интернет вообще и WWW в частности работает по технологии "клиент-сервер", то есть все программное обеспечение разделяется на клиентскую и на серверную части. Также между ними разделены и функциональные обязанности. Важным для понимания моментом является то, что клиент не знает и не обязан знать принципы работы и реализацию внутренних алгоритмов сервера, а сервер не вмешивается в дела клиента. Для взаимодействия этих частей разработан специальный протокол (в частном случае - протокол HTTP), и все взаимодействие между клиентом и сервером осуществляется исключительно в рамках данного протокола. Вашему web-браузеру все равно, какое программное обеспечение стоит на сервере, какая там операционная система, где физически лежат запрашиваемые документы на сервере (и лежат ли вообще, ведь они могут и генерироваться на лету специальными программами). Сервер тоже не вмешивается в дела вашего web-браузера, серверу абсолютно все равно, что сделает клиент с переданной информацией, как он ее будет отображать, сохранит на диске или проигнорирует - серверу до этого дела нет. Взаимодействие клиента и сервера происходит по принципу "запрос-ответ". Клиент посылает запрос, сервер обрабатывает его и посылает ответ.
  • 1.1 Запросы браузера
  • Каждое HTTP-взаимодействие начинается с запроса от клиента (обычно web-браузера). Пользователь либо вводит URL, либо переходит по гиперссылке, либо выбирает закладку; браузер же отображает соответствующий документ. Чтобы сделать это, он должен послать HTTP-запрос.
  • Браузер создает сетевое соединение, используя имя узла и номер порта (по умолчанию 80). Тип (http) сообщает браузеру, что используется протокол HTTP, поэтому после установления соединения он посылает HTTP-запросы. Первая строка HTTP-запроса называется строкой статуса и включает полный виртуальный путь и строку запроса (если она существует). Строка статуса содержит метод запроса, URL запрашиваемого ресурса и версию протокола. Метод запроса чувствителен к регистру и должен быть набран заглавными буквами. Существует несколько методов запроса, разрешенных в HTTP, хотя не все из них доступны для каждого ресурса на Web-сервере.
  • 1.1.1 Методы запросов
  • Метод GET
  • Метод GET, применяется для запроса конкретного ресурса. Также с помощью GET, может быть инициирован некий процесс, при этом, в тело ответа, включается информация о ходе выполнения инициированного запросом действия.
  • Параметры для выполнения запроса, передаются в URI запрашиваемого ресурса, после символа "?". Запрос в таком случае выглядит примерно так: GET /some/resource?param1=val1&param2=val2 HTTP/1.1.
  • Как установлено в стандарте HTTP, запросы методом GET, являются идемпотентными, то есть, повторная отправка одного и того же запроса, методом GET, должна приводить к одному и тому же результату, в случае, если сам ресурс, в промежутках между запросами, изменен не был, что позволяет кэшировать результаты, выдаваемые на запрос методом GET.
  • Кроме вышесказанного, существуют еще два вида метода GET, это:

· условный GET, содержащий заголовки If-Modified-Since, If-Match, If-Range и им подобные;

· частичный GET, содержащий заголовок Range с указанием байтового диапазона данных, которые web-сервер должен отдать. Данный вид запроса используется для закачки и организации многопоточных закачек.

Порядок работы с этими подвидами запроса GET, стандартами определен отдельно.

Метод HEAD

Данный метод, аналогичен методу GET, с той лишь разницей, что сервер не отправляет тело ответа. Метод HEAD, как правило, используется для получения метаданных ресурса, проверки URL (есть ли указанный ресурс на самом деле) и для выяснения факта изменения ресурса с момента последнего обращения к нему

Метод POST

Метод POST, используется для передачи пользовательских данных на сервер, указанному ресурсу. Примером может послужить HTML форма с указанным атрибутом Method="POST", для отправки комментария к статье. После заполнения необходимых полей формы, пользователь жмет кнопку "Отправить" и данные, методом POST, передаются серверному сценарию, который в свою очередь выводит их на странице комментариев. Таким же образом, с помощью метода POST, можно передавать файлы.

В отличии от GET, метод POST, не является идемпотентным, то есть неоднократное повторение запроса POST, может выдавать разные результаты. В нашем случае, будет появляться новая копия комментария при каждом запросе.

Если в результате запроса методом POST, возвращается код 200 (Ok) или 204 (No Content), в тело ответа web-сервера, добавляется сообщение о результате выполнения запроса. Например, если был создан ресурс, сервер вернет 201 (Created), указав при этом URI созданного ресурса в заголовке Location.

Ответы сервера, на выполнение метода POST, не кэшируются.

Метод PUT

Используется для загрузки данных запроса на указанный URI. Главное различие методов PUT и POST в том, что при методе POST, предполагается, что по указанному URI, будет производиться обработка, передаваемых клиентом данных, а при методе PUT, клиент подразумевает, что загружаемые данные уже соответствуют ресурсу, расположенному по данному URI.

Метод PATCH

Работает аналогично методу PUT, но применяется только к определенному фрагменту ресурса.

Метод DELETE

Удаляет ресурс, расположенный по заданному URI.

1.2 Ответы сервера

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

2. CGI-окружение

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

Когда запускается CGI-сценарий, его текущим каталогом обычно считается каталог, в котором он расположен на web-сервере; это рекомендовано стандартом CGI, хотя и не поддерживается всеми серверами (в частности, Microsoft IIS). CGI-сценарии обычно выполняются с ограниченными правами. В системах Unix CGI-сценарии выполняются с теми же правами, что и web-сервер, владельцем которого, обычно является специальный пользователь nobody, web или www. В других операционных системах, возможно, придется настроить web-сервер, установив те же права, что и у CGI-сценария. В любом случае, CGI-сценарий не должен иметь права на чтение и запись во все области файловой системы.

2.1 Файловые дескрипторы

Обычно во всех сценариях на Perl предопределены три стандартных файловых дескриптора: STDIN, STDOUT и STDERR. CGI-сценарии на исключение. Но в CGI-сценариях эти файловые значения имеют несколько иной смысл.

STDIN

Когда сервер получает HTTP-запрос CGI-сценария, он читает HTTP-заголовки и передает тело сообщения CGI-сценарию на STDIN. Поскольку заголовки уже удалены, STDIN будет пуст для запросов GET, не имеющих тела и содержащих закодированные данные из форм для запросов POST. Учтите, что в них нет метки конца файла, так что если вы попытаетесь прочитать больше данных, чем есть на самом деле, CGI-сценарий повиснет, ожидая дополнительных данных со STDIN, которые никогда не придут (разумеется, когда время ожидания будет исчерпано, web-сервер или браузер разорвет соединение и завершит работу данного CGI-сценария, но это трата системных ресурсов). Поэтому вы не должны пытаться читать запросы GET со STDIN. Для запросов POST всегда надо смотреть на заголовок Content_Length и считывать именно столько байт, сколько в нем указано.

STDOUT

CGI-сценарии на Perl возвращают web-серверу вывод, печатая его в STDOUT. Туда можно записывать некоторые HTTP-заголовки и содержимое ответа, если оно есть. Perl обычно буферизует вывод в STDOUT и посылает его web-серверу по кускам. Web-сервер может ждать получения всего вывода от сценария, и только потом послать его клиенту. Например, iPlanet (в прошлом Netscape) Enterprise Server буферизует вывод, а Apache (начиная с версии 1.3) - нет. интернет браузер файл дескриптор

STDERR

CGI не определяет, как web-сервер будет посылать вывод в STDERR, и серверы реализуют это по-разному, но они почти всегда выдают ответ 500 Internal Server Error (500 - внутренняя ошибка сервера). Некоторые web-серверы, в том числе Apache, добавляют вывод, поступающий на STDERR, в журнал регистрации ошибок сервера, в котором кроме того регистрируются и другие ошибки, например неудавшаяся авторизация и запросы к документам, отсутствующим на сервере. Это очень полезно для отладки ошибок в CGI-сценариях. Другие серверы, например серверы от iPlanet, не делают различий между выводом на STDOUT и STDERR; они считают и то и другое выводом сценария и передают клиенту. Однако вывод данных в STDERR обычно вызывает ошибку сервера, поскольку Perl не буферизует STDERR, поэтому данные, отправленные в STDERR, часто поступают на сервер раньше данных, печатаемых в STDOUT. Web-сервер сообщит об ошибке, так как он ожидает, что вывод начнется с верных заголовков, а не с сообщения об ошибке. В iPlanet в журнал регистрации будет записано только сообщение об ошибке сервера, а не полное содержимое STDERR.

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

Вот список переменных окружения и их значения:

Переменные окружения, которые не зависят от типа запроса:

SERVER_SOFTWARE - показывает название и версию http-сервера в формате: название/версия.

SERVER_NAME - показывает доменное имя сервера.

SERVER_ADDR - показывает IP сервера.

SERVER_ADMIN - e-mail администратора web-сервера.

GATEWAY_INTERFACE - версия CGI на момент компиляции httpd демона в формате: CGI/версия

DATE_GMT - текущие дата и время во временной зоне GMT.

DATE_LOCAL - текущие дата и время во временной зоне сервера.

DOCUMENT_ROOT - путь к главному каталогу web-сервера.

Переменные окружения, которые зависят от типа запроса:

SERVER_PROTOCOL - протокол, по которому был получен запрос.

SERVER_PORT - порт, на который был получен запрос.

REQUEST_METHOD - тип запроса: POST,GET и т.д.. При GET запрос идет в переменную QUERY_STRING а при POST подается на STDIN скрипта.

REQUEST_URI - страница, отправившая запрос.

SCRIPT_NAME - URL скрипта без имени сервера.

SCRIPT_FILENAME - полное имя файла скрипта на диске.

QUERY_STRING - информация, содержащаяся в командной строке вызова скрипта (после ? в URL) Это строка запроса при методе GET. Запрос из формы кодируется браузером, поскольку не все символы разрешены в URL, некоторые имеют специальное назначение. Теперь о методе urlencode: все пробелы заменяются в URL на знак '+', а все специальные и непечатные символы на последовательность %hh,где hh-шестнадцатиричный код символа, разделитель полей формы знак '&',так что при обработке форм надо произвести декодирование.

CONTENT_TYPE - MIME-тип данных, передаваемых скрипту.

CONTENT_LENGTH - длина передаваемых данных. При методе запроса POST необходимо считать со стандартного входа STDIN CONTENT_LENGTH байт, а потом производить их обработку. Обычно методом POST пользуются для передачи форм, содержащих потенциально большие области ввода текста TEXTAREA. При этом методе нет никаких ограничений, а при методе GET существуют ограничения на длину URL .

Переменные окружения, содержащие информацию о пользователе:

REMOTE_ADDR - IP пользователя.

REMOTE_PORT - порт, открытый на машине пользователя, браузером.

Переменные окружения, содержащие дополнительные параметры заголовка запроса:

Имя такой переменной формируется из "HTTP_"+имя заголовка. Причем все символы "-" (тире) в имени заголовка заменяются на символы "_" (подчеркивание). Примеры:

HTTP_ACCEPT - список MIME-типов, которые клиент может обработать.

HTTP_USER_AGENT - в частном случае - браузер, который использует пользователь.

HTTP_REFERER - URL страницы, с которой пришел на текущую страницу пользователь.

3. HTML-формы

FORM тэг определяет форму для заполнения в HTML документе. В одном документе может быть определено несколько форм для заполнения, но вложенные FORM операторы не разрешены. Формат оператора FORM выглядит следующим образом:

<FORM ACTION="url" METHOD="POST">...</FORM>

Его атрибуты следующие:

ACTION

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

METHOD

HTTP/1.0 метод, используемый для посылки содержания заполненной формы на сервер. Этот метод зависит от того, как работает конкретный сервер запросов. Настоятельно рекомендуется использование метода POST. Возможные варианты следующие:

§ GET - это метод по умолчанию, который приводит к добавлению содержимого заполненной формы к URL, как и в нормальном запросе.

§ POST при использовании этого метода содержимое заполненной формы пересылается не как часть URL, а как содержимое тела запроса.

ENCTYPE

задает тип кодирования содержимого заполненной формы. Этот атрибут действует только когда используется метод POST и даже в этом случае имеет только одно возможное значение (которое является значением по умолчанию)- application/x-www-form-urlencoded.

Внутри FORM оператора может находиться все, что угодно, кроме другого оператора FORM. Согласно спецификации, для задания интерфейсных элементов внутри оператора FORM используются тэги INPUT,SELECT, и TEXTAREA.

Тэг INPUT

Тэг INPUT используется для задания простого элемента ввода внутри FORM. Это одиночный тэг, его ничего не окружает и он не имеет закрывающего тэга - т.е. он используется подобно тэгу IMG.

Атрибуты для тэга INPUT следующие:

TYPE

должен быть один из:

· "hidden": пользователю не предлагается поля для ввода, но содержимое тэга передается при подтверждении и посылке формы. Это значение может быть использовано для передачи информации состояния при взаимодействии клиента и сервера.

· "image": картинка, по которой вы можете сделать щелчок мышью или другим указывающим устройством, что приводит к немедленному подтверждению и отсылке формы. Координаты выбранной точки измеряются в точках от верхнего левого угла и возвращаются (наряду с другими компонентами формы) точно так же, как для элемента Image.

· "text" поле ввода текста, значение по умолчанию

· "password" (поле ввода пароля; вводимые символы представляются как звездочки)

· "checkbox" (кнопка, принимающая положения on (включено) и off (выключено))

· "radio" (кнопка, принимающая положения on и off; причем остальные кнопки с тем же параметром NAME ведут себя по принципу "одна из многих")

· "submit" (кнопка, действие которой сводится к отсылке содержимого заполненной формы на сервер запросов)

· "reset" (кнопка, которая устанавливает во всех интерфейсных элементах значения по умолчанию)

NAME

символическое имя (оно не показывается) для этого поля ввода. Это поле должно присутствовать для всех полей ввода кроме "submit" и "reset", т.к. оно используется в строке запроса при идентификации поля ввода при посылке ее на сервер после подтверждения формы.

VALUE

для полей ввода текста или пароля, может быть использовано для задания начального содержания поля. Для checkbox или radio button, VALUE задает значение кнопки, когда она находится в отмеченном состоянии (неотмеченные кнопки опускаются при посылке запроса); значение по умолчанию для checkbox или radio button - "on". Для типов "submit" и "reset", VALUE может быть использовано для задания надписи на этих кнопках.

CHECKED (значение не требуется)

указывает, что данная кнопка типа checkbox или radio button отмечена по умолчанию; это поле работает только для кнопок типа checkbox и radio button.

SIZE

физический размер поля ввода в символах; это поле действует только для элементов ввода текста или пароля. Если не присутствует явно, выставляется 20. Многострочные поля ввода текста могут быть заданы с помощью SIZE=ширина, высота; например SIZE=60,12. Заметим, что SIZE атрибут не должен использоваться для задания многострочных полей ввода, т.к. можно воспользоваться тэгом TEXTAREA.

MAXLENGTH

максимальное количество введенных символов, которые будут приниматься для ввода, верно только для полей ввода текста и пароля (и только в однострочных элементах). По умолчанию - неограниченно. Подразумевается, что поля ввода должны прокручиваться.

Тэг SELECT

Внутри <FORM> ... </FORM>, может присутствовать любое количество тэгов SELECT, свободно перемешанных с другими HTML элементами (включая INPUT и TEXTAREA элементы) и текстом (но не дополнительных элементов FORM). Тэг SELECT во многих графических клиентах представляется как меню или список.

В отличие от INPUT, SELECT имеет открывающий и закрывающий тэги. Внутри оператора SELECT разрешена только последовательность тэгов OPTION, за каждым из которых следует некоторое количество простого текста (без HTML выражений), например:

<SELECT NAME="a-menu">

<OPTION> First option.

<OPTION> Second option.

</SELECT>

Атрибуты оператора SELECT следующие:

NAME

символическое имя для этого SELECT элемента. Это поле должно присутствовать, т.к. оно используется при посылке запроса (аналогично оператору INPUT).

SIZE

если SIZE равен 1 или если этот атрибут опущен, по умолчанию SELECT будет представлен как меню опций Motif. Если SIZE = 2 или более, SELECT будет представлен как окно выбора; значение SIZE тогда будет определять, сколько элементов списка будут видны.

MULTIPLE

если присутствует (нет значения), задает, что SELECT должен позволять множественный выбор из списка. Наличие MULTIPLE принуждает SELECT быть представленным как список выбора, вне зависимости от значения SIZE.

Атрибуты OPTION следующие:

· SELECTED задает, что эта опция выбрана по умолчанию. Если SELECT позволяет множественный выбор (с помощью атрибута MULTIPLE), как SELECTED могут быть помечены несколько опций.

Тэг TEXTAREA

Тэг TEXTAREA может быть использован для расположения многострокового поля ввода с необязательным содержимым по умолчанию в форме. Атрибуты тэга TEXTAREA следующие:

· NAME символическое имя поля ввода.

· ROWS число строк в поле ввода(высота).

· COLS число столбцов в поле ввода (ширина).

TEXTAREA имеет полосы прокрутки, так что может быть введено любое количество текста. Элемент TEXTAREA требует и открывающий и закрывающий тэги. TEXTAREA без содержания по умолчанию выглядит примерно так:

<TEXTAREA NAME="foo" ROWS=4 COLS=40></TEXTAREA>

TEXTAREA с содержанием по умолчанию выглядит так:

<TEXTAREA NAME="foo" ROWS=4 COLS=40> Default contents go here. </TEXTAREA>

Содержание по умолчанию должно быть строгим ASCII текстом. Символы перевода строки воспринимаются (так что в примере выше до и после текста "Default contents go here." будет пустая строка).

3.1 Подтверждение и посылка формы

Для метода GET

Когда нажимается кнопка submit, содержимое формы будет добавлено к URL в следующей форме:

action?name=value&name=value&name=value

(здесь "action" - URL, заданное атрибутом ACTION в тэге FORM, или URL текущего документа, если атрибут ACTION не был задан).

Нестандартные символы в примерах "name" или "value" будут опущены, при этом имеются в виду также "=" and "&". Это означает, что включения "=", которые разделяют имена и значения (names и values), и включения "&", которые разделяют пары name/value, не опускаются.

Для полей ввода текста и пароля, значением будет то, что введет пользователь. Если пользователь оставит это поле пустым, значение value также будет пустым, но в строке запроса будет присутствовать фрагмент "name=".

Для кнопок типа checkbox и radio button, значение value определяется атрибутом VALUE в том случае, когда кнопка отмечена. Неотмеченные кнопки при составлении строки запроса игнорируются целиком. Несколько кнопок типа checkbox могут иметь один атрибут NAME (и различные VALUE), если это необходимо. Кнопки типа radio button предназначены для того, чтобы вести себя по принципу "одна из всех" и должны иметь одинаковый атрибут NAME и различные атрибуты VALUE.

Для метода POST

Содержимое формы кодируется точно как для метода GET (см. выше), но вместо добавления содержимого формы к URL, заданной атрибутом формы ACTION, в качестве запроса, содержимое посылается блоком данных как часть операции POST. Если присутствует атрибут ACTION, то значение URL, которое там находится, определяет, куда послать этот блок данных. Этот метод особенно рекомендуется при посылке больших блоков данных.

4. Отладка CGI-приложений

В этой главе я собираюсь раскрыть ключевые моменты программирования сценариев CGI. Хотя для того, чтобы, полностью понять общешлюзовой интерфейс и достичь мастерства при работе с ним требуется некоторое время, сам протокол довольно прост. Любой человек, у которого есть некоторые основные навыки программирования, и который знаком с Веб, может быстро научиться программированию довольно сложных приложений CGI.

4.1 Техника создания кода на PERL

Начнем с традиционной вводной задачи программирования. Напишем программу, которая отобразит "Hello, World!" на web-браузере. Прежде, чем написать эту программу, необходимо понять, какую информацию web-браузер ожидает получить от программ CGI.

В языке Perl, программа " Hello,World!" показана в листинге 1.

Листинг 1. Hello, World! в Perl.

#!/usr/local/bin/perl

# Hello.cgi - Моя первая программа CGI

print "Content-Type: text/html\n\n";

print "<html> <head>\n";

print "<title>Hello, World!</title>";

print "</head>\n";

print "<body>\n";

print "<h1>Hello, World!</h1>\n";

print "</body> </html>\n";

Сохраните эту программу как hello.cgi, и установите ее в соответствующем месте. Для большинства серверов нужный каталог называется cgi-bin. Теперь, вызовите программу из вашего браузера Web. Для большинства, это означает открыть следующий универсальный указатель ресурса (URL):

http://hostname/directoryname/hello.cgi

Hostname - имя веб-сервера, и directoryname - каталог, в который помещен hello.cgi (вероятно cgi-bin).

Следует отметить несколько моментов относительно hello.cgi.

Во-первых, обратите внимание на то, что содержание первого оператора печати (Content-Type: text/html) не появляется на браузере. Можно отослать любую информацию назад на браузер (страницу HTML, графику или звук), но сначала, нужно сообщить браузеру какого вида данные ему посылаются. Эта строка сообщает браузеру какой вид информации ожидать - в данном случае, страницу HTML.

Во-вторых, программа называется hello.cgi. Не всегда нужно использовать расширение.cgi с именем программы CGI. Хотя исходный код для многих языков также использует расширение.cgi, оно не используется для обозначения типа языка, а является для сервера способом идентификации файла как исполняемого файла, а не графического файла, файла HTML или текстового файла. Серверы часто конфигурируются так, чтобы только попытаться выполнить те файлы, которые имеют это расширение, отображая содержание всех других.

В общем, hello.cgi состоит из двух основных частей:

* Он сообщает браузеру какую информацию ожидать (Content-Type: text/html) ;

* Он сообщает браузеру, что отобразить (Hello, World!).

С выводом информации могут возникнуть проблемы. В данный момент существует множество web-браузеров: они различаются версиями, платформами. Следовательно, поддерживают и некоторые разные тэги. Но вспомним, что при запросе сервер получает информацию о браузере из переменной окружения HTTP_USER_AGENT. Поэтому стоит в CGI-сценариях исследовать данные о браузере, если заведомо известно, что будете использовать тэги, которые поддерживаются не всеми браузерами. Приложение А.

Поняв, как работает CGI-сценарий, перейдем к важной теме - обработке форм. На какой бы сайт не зашел пользователь, всюду присутствуют формы, которые предлагается заполнить. В этом деле можно положиться только на CGI, так как Java и JavaScript, выполняющиеся на страничке у клиента, не имеют доступа к серверу, на котором находится сайт.

Итак, браузер требует у сервера определенный URL (это может быть как простой документ, так и сгенерированный CGI), в этом документе может содержаться форма. Отображая такой документ, браузер также выводит элементы формы (кнопки, поля ввода, поля ввода пароля, переключатели, радио-кнопки, списки, текстовые области, скрытые поля). Со всем этим взаимодействует пользователь. После того, как он заполнил форму, нажимает кнопку Submit которая говорит, что форму надо отправить на сервер. Браузер собирает все имена и значения элементов формы, кодирует их методом urldecode (Приложение B), и, в зависимости от указанного в тэге FORM метода, вызывает GET или POST с указанным URL, передавая ему данные. На сервере CGI-скрипту это попадает (в зависимости от метода) либо в переменную QUERY_STRING либо на STDIN.

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

if($ENV{'REQUEST_METHOD'} eq 'GET'){#Анализируем метод,GET

или POST

$query=$ENV{'QUERY_STRING'};

}

elsif($ENV{'REQUEST_METHOD'} eq 'POST'){

sysread(STDIN,$query,$ENV{'CONTENT_LENGTH'});

}

Вот, запрос считан в переменную $query. Теперь пришло самое время ее обработать. Известно, что поля разделены символом '&', тогда используем его в качестве разделителя функции split:

@formfields=split(/&/,$query);

Разделили, теперь организуем цикл foreach по полученым полям @formfields:

foreach(@formfields){

if(/^Name=(.*)/){$name=urldecode($1);}

if(/^Age=(.*)/){$age=urldecode($1);}

Здесь выражение в регулярном выражении в круглых скобках (.*) после знака '=', запоминается в скалярную переменную $1,которая затем и декодируется функцией urldecode. На этом заканчивается шаблонная часть скрипта и начинается содержательная, которая зависит от ваших требований.

На что еще следует обратить внимание, так это на работу с файловой системой Web-узла. Perl обеспечивает довольно разнообразный инструментарий для такой работы. Условно его можно разбить на четыре части:

· работа с файлами;

· работа с каталогами;

· работа с каналами (конвейеры);

· работа с сетевыми ресурсами через сокеты.

Рассмотрим две из них.

Файлы

Для работы с файлами в Perl применяют несколько встроенных функций. Открывают файл функцией open. При этом для указания действий с записями файла используют префиксы:

open IN,"<test.txt";

# открыть файл на чтение

open IN,">test.txt";

# открыть файл на запись

open IN,"+<test.txt";

# открыть файл на чтение и запись

open IN,""test.txt";

# открыть файл на модификацию (добавление)

Закрывают файл при помощи функции close:

close IN;

Для чтения записей из файла используют либо чтение потоком - <file>, либо функцию read:

while(<IN>)

{

print $_;

}

read STDIN, $query, $ENV{CONTENT_LENGTH};

В первом случае данные построчно считываются из файла IN и распечатываются в поток стандартного вывода. Во втором случае из потока стандартного ввода, который тоже является файлом, считывается функцией read $ENV{CONTENT_LENGTH} байтов. Для обработки потока стандартного ввода CGI-скрипта подходит только второй способ, так как сервер не закрывает потока ввода, что приводит к бесконечному ожиданию ввода и разрыву соединения по timeout.

Каталоги
Для работы с каталогами используют ряд встроенных функций: opendir, readdir, closedir. Первая открывает дескриптор файла каталога, вторая позволяет читать записи из файла каталога, третья закрывает дескриптор файла каталога:

opendir DIR,"/usr/user";

while($_=readdir(DIR))

{

next if -d;

print $_;

}

closedir DIR;

В данном примере распечатываются названия файлов из каталога "/usr/users". При этом имена каталогов не распечатываются. Такое поведение скрипта определяется модификатором if в операторе next.

Когда Web-сервер получает URL от вашего браузера, он вызывает указанную CGI-программу и передает в нее в качестве аргументов пары имя=значение. Программа затем делает то, что должна делать, и (как правило) возвращает HTML-код серверу, который, в свою очередь, загружает его в браузер для представления пользователю.

При получении данных в программу из формы вам не обязательно декодировать их собственноручно. В комплект поставки языка Perl входит модуль с именем CGI.pm, который предназначен для облегчения написания CGI-программ. Главное предназначение этого модуля - чтение и декодирование данных. В модуле есть и другие полезные функции, но сейчас нас интересует только функция чтения и декодирования данных. Для того чтобы декодировать данные, переданные вашей программе, вы должны так импортировать модуль CGI.pm:

CGI qw (:standard);

$query = new CGI;

После этого все данные копируются в кэш с именем param, который связан с объектом запроса с помощью переменной с именем $query. Таким образом, если пользователь передал данные формы, содержащие поле с именем last_name, значение этого поля можно сделать доступным через переменную с именем $last_name. Выполняется это следующим образом:

last_name = $query->param('last_name');

Рассмотрим это выражение по частям:

1. last_name - это имя переменной, которой я хочу передать значения из поля формы.

2. $query - имя объекта, который я создал в этой программе.

3. Оператор -> используется для доступа к кэшу param объекта query.

4. Выражение в скобках 'last_name' используется для доступа к элементу кэша с ключом last_name.

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

Наконец, вам следует знать, что CGI-программы могут работать с любым HTML-документом, а не только с формой. Например, вы могли бы написать такой HTML-код:

Click <a href="http://www.SOMEWHERE.org/cgi-bin/fortune.cgi">here</a> to receive your fortune.

Зцесь fortune.cgi - программа, которая просто вызывает программу fortune (в UNIX-системах). В данном случае в CGI-программу не вводятся никакие аргументы. Другой вариант: HTML-документ мог бы содержать две ссылки для пользователя - одну для получения предсказания судьбы, вторую для выяснения текущей даты. Обе ссылки могли бы указывать на одну и ту же программу - в одном случае с аргументом fortune, поставленным в URL после вопросительного знака, а в другом случае - с аргументом date. Эти HTML-ссылки выглядели бы так:

<а href="http://www.SOMEWHERE.org/agi-bin/fortune_or_date?fortune"> <ahref="http://www.SOMEWHERE.org/cgi-bin/fortune_or_date?date">

CGI-программа (в данном случае fortune_or_date) определила бы, какой из двух возможных аргументов получен, и вьшолнила бы соответственно программу fortune или программу date.

Есть два способа использования модуля CGI: это объектно-ориентированный стиль и как набор функций. При использовании объектно-ориентированного стиля, вы создаете один или несколько объектов, а потом используете их методы для формирования HTML-страницы.

В приложении С представлен небольшой CGI-сценарий, описывающий работу гостевой книги. Пользователю предоставляется форма для заполнения. После чего данные передаются на исполнение CGI-скрипту, а пользователю выводится страница с сообщением об успешном результате. Данные записываются в файл. При повторном открытии скрипта в браузере представлена предыдущая запись и форма для заполнения.

Заключение

Достигнута цель - написание руководства по технологии CGI.

В ходе выполнения работы успешно решены поставленные задачи:

- описание технологии клиент-сервер;

- руководство технологии CGI.

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

В результате выполнения проекта освоены навыки создания приложений типа клиент-сервер на языках программирования HTML и Perl.

Литература

1. Кристиансен Т., Торкингтон Н. Perl: библиотека программиста - Пер. с англ. Е. Матвеев - СПб: Питер, 2001. - 736 с.: ил.

2. Холзнер С. Perl: специальный справочник - Пер. с англ. А. Бердников - СПб: Питер, 2001. - 496 с.: ил.

3. Гулич С., Гундаварам Ш., Бирзнекс Г. CGI программирование на Perl. - Пер. с англ. Т. Морозова - СПб: Символ-Плюс, 2001. - 480 с., ил.

4. Eugene Eric Kim. CGI Developer's Guide - Sams.net Publishing,2009 - 428с., ил.

Приложение

if(defined ($ENV{'HTTP_USER_AGENT'})){

$browser=$ENV{'HTTP_USER_AGENT'};

($vers)=($browser=~/\/(\d+\.\d+)/

Приложение В

Приложение C

#!/usr/bin/perl

#cgipmgbook.cgi

###############

$datafile="cgipmgbook.dat";

###############

use CGI; #Используем CGI.pm

$query=new CGI;

$time = (localtime);

print "Content-Type: text/html\n\n";

if(!$query->param('UserName')){

print "<HTML>\n";

print "<HEAD>";

print "<TITLE>Добро пожаловать в мою гостевую книгу</TITLE>";

print "</HEAD>\n";

print "<BODY>\n";

print "<CENTER>";

print "<H1>Добро пожаловать в мою гостевую книгу</H1>";

print "</CENTER>\n";

print "<HR>\n";

open(F,"$datafile");

while(!eof(F)){

$savedquery=new CGI(F);

$username=$savedquery->param('UserName');

$email=$savedquery->param('Email');

$message=$savedquery->param('Message');

print "$username\n";

print "<A href=\"mailto:$email\">$email</A>\n";

print "$time" ;

print "$message\n";

print "<HR>\n";

}

close(F);

print "<HR>\n";

print "<CENTER>";

print "<H2>Добавить свою запись</H2>";

print "</CENTER>\n";

print "<HR>\n";

print "<FORM>\n";

print "<TABLE align=center>\n";

print "<TR>";

print "<TD>Имя:</TD>";

print "<TD><INPUT name=\"UserName\"></TD>";

print "</TR>\n";

print "<TR>";

print "<TD>E-mail:</TD>";

print "<TD><INPUT name=\"Email\"></TD>";

print "</TR>\n";

print "<TR>";

print "<TD colspan=2>Сообщение:</TD>";

print "</TR>\n";

print "<TR>";

print "<TD colspan=2>";

print "<TEXTAREA name=\"Message\" rows=5 cols=35></TEXTAREA>";

print "</TD>";

print "</TR>\n";

print "<TR>";

print "<TD colspan=2>";

print "<INPUT type=\"submit\" name=\"subm\" value=\"Ok\">";

print "</TD>";

print "</TR>\n";

print "</TABLE>\n";

print "</FORM>\n";

print "</BODY></HTML>\n";

}

else{

open(F,""$datafile");

$query->save(F);

close(F);

print "<HTML>\n";

print "<HEAD>";

print "<TITLE>Ваша запись добавлена</TITLE>";

print "</HEAD>\n";

print "<BODY>\n";

print "<CENTER>";

print "<H1>Ваша запись добавлена</H1>";

print "</CENTER>\n";

print "<HR>\n";

print "</BODY></HTML>\n";

}

Размещено на Allbest.ru

...

Подобные документы

  • Преимущества и недостатки использования двух типов базовых архитектур Клиент-сервер и Интернет/Интранет, их компоненты и экономическая целесообразность. Информационные взаимосвязи компонентов WEB-узла, взаимодействие браузера, сервера и сценария CGI.

    реферат [324,4 K], добавлен 22.06.2011

  • Устройство веб-приложений, преимущества их построения. Характеристика технологий веб-программирования, используемых на стороне сервера и на стороне клиента. Формирование и обработка запросов, создание интерактивного и независимого от браузера интерфейса.

    контрольная работа [76,4 K], добавлен 08.07.2014

  • Анализ архитектуры информационной системы, в структуру которой входят системы файл-сервер и клиент-сервер. Сравнение языков запросов SQL и QBE. Принципы разработки приложений архитектуры клиент-сервер при помощи структурированного языка запросов SQL.

    курсовая работа [88,9 K], добавлен 11.04.2010

  • Разработка клиент-серверного приложения, позволяющего взаимодействовать друг с другом с использованием доступа к базам данных. Проектирование связи сервера с базой данных с помощью технологии ODBC. Разработка интерфейса программы, ее тестирование.

    курсовая работа [352,0 K], добавлен 24.08.2016

  • Классификации баз данных и СУБД. Технология модели "клиент-сервер". Особенности языка структурированных запросов SQL. Структура и назначение операторов определения, манипулирования и управления данными. Разработка реляционной БД, создание SQL запросов.

    курсовая работа [1,4 M], добавлен 17.08.2015

  • Основные технологии веб-программирования. Методы отправки данных на сервер с помощью HTML-формы. PHP - Препроцессор Гипертекста. Сохранение данных в базе данных MySQL. Клиент-Сервер и технология CGI. Примеры использования PHP совместно с MySQL.

    лекция [2,9 M], добавлен 27.04.2009

  • Обработка распределенных данных и запросов. Многопотоковые и многосерверные архитектуры. Основные типы параллелелизма при обработке запросов. Структура компонентов поддержки удаленного доступа. Доступ к базам данных в двухзвенных моделях клиент-сервер.

    презентация [123,1 K], добавлен 19.08.2013

  • Файловая и сетевая системы операционной системы Windows. Характеристика модели "клиент-сервер". Функциональные требования и архитектура программы, которая должна обеспечивать передачу файлов от клиента к серверу, сервера к клиенту, обмен сообщениями.

    курсовая работа [1,4 M], добавлен 24.04.2013

  • Основные понятия серверов. Модель клиент-сервер. Классификация стандартных серверов. Недостатки файл-серверной системы. Криптографические методы защиты информации. Серверы удаленного доступа. Методы и средства обеспечения безопасности информации.

    контрольная работа [36,3 K], добавлен 13.12.2010

  • Архитектура "клиент-сервер". Системный анализ базы данных "Газета объявлений", ее инфологическое и физическое проектирование. Программирование на стороне SQL-сервера. Разработка клиентской части в Borland C++ Builder 6.0 и с помощью Web-технологий.

    курсовая работа [1,3 M], добавлен 07.07.2013

  • Модели информационного процесса обработки данных. Классификация баз данных. Сеть архитектуры и технология клиент-сервер. Создание запросов к реляционным базам данных на SQL. Работа с электронными таблицами MS Excel: форматирование данных, вычисления.

    контрольная работа [17,8 K], добавлен 17.01.2010

  • Многоуровневые архитектуры клиент–сервер. Диаграммы классов, реализующих уровни презентации, бизнес–логики и базы данных приложения. Словесное описание процесса выполнения транзакций. Создание, изменение и удаление хранимых процедур, их выполнение.

    курсовая работа [3,4 M], добавлен 23.03.2013

  • Разработка приложений на платформе Win32 для исследования взаимодействия между процессами через отображение файла в память. Модель приложений "клиент - сервер". Описание алгоритма работы программы-клиента и программы-сервера. Результаты работы приложений.

    курсовая работа [869,3 K], добавлен 18.05.2014

  • Основные принципы выбора имени и адреса для сайта. Организационные зоны высшего уровня. Региональные зоны (домены стран). Выбор хостинг-провайдера. Скорость загрузки страниц. Время ответа сервера. Перенос файлов сайта с локального компьютера на сервер.

    реферат [18,3 K], добавлен 23.05.2014

  • Рассмотрение архитектуры "файл-сервер" и двух- и трехуровневых архитектур "клиент-сервер". Модель сервера приложений и свойства "идеальной" системы управления распределенными базами данных. Способы распределения функций обработки логики запроса.

    презентация [60,2 K], добавлен 19.08.2013

  • Функции технологии Ajax разработки Web-приложений: выполнение HTTP-запросов в клиентской части и анализ ответа XML-сервера. Создание данных объекта XMLHttpRequest для разных браузеров. Обработка с помощью сервлета. Функциональность задач в Ajax.

    лабораторная работа [54,8 K], добавлен 06.06.2009

  • Представление данных в памяти компьютера. Обобщенные структуры и модели данных. Методы доступа к информации. Физическая организация системы управления базами данных, структура сервера. Архитектура "клиент-сервер". Создание базы данных с помощью "Денвер".

    курсовая работа [770,3 K], добавлен 17.11.2014

  • Создание клиент-серверного приложения на основе технологии CORBA. Проектирование многоуровневой системы, в которой клиент при помощи банкомата выполняет необходимые операции. Способы реализации серверов в разных каналах для ускорения обработки данных.

    лабораторная работа [1,1 M], добавлен 08.06.2009

  • Характеристика модели клиент-сервер как технологии взаимодействия в информационной сети. Разработка и описание алгоритмов работы приложений на платформе Win32 в среде Microsoft Visual Studio, использующих для межпроцессного взаимодействия сокеты.

    курсовая работа [544,6 K], добавлен 02.06.2014

  • Варианты топологии одноранговой вычислительной сети, принцип работы распределенных пиринговых сетей. Использование в крупных сетях модели "клиент-сервер". Характеристика операционных систем с сетевыми функциями, многопроцессорная обработка информации.

    творческая работа [51,8 K], добавлен 26.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.