Cgi программирование вывода в клиентскую среду


Содержание

CGI-интерфейс

Разработка CGI-программ

Самым простым и исторически самым первым способом создания динамических ресурсов для сети Интернет является использование интерфейса CGI.

CGI-интерфейс

Common Gateway Interface (CGI) является стандартом интерфейса внешней прикладной программы с Web сервером. Их взаимодействие иллюстрируется рис.4.1.

Рис. 4.1. Распределение функций между уровнями с использованием интерфейса CGI

Клиентская часть приложения представляет собой HTML-документ, в котором реализован интерфейс с пользователем. Реализуется в основном посредством форм, хотя могут использоваться и другие элементы, в том числе скрипты и апплеты.

Серверная часть состоит из исполняемого модуля, решающего основные задачи обработки данных, поступающих от клиентской части, формирования ответа в формате HTML, и т.д. Такой модуль называется cgi-модулем или расширением сервера.

Сам интерфейс CGI представляет собой правила взаимодействия сервера с внешним по отношению к нему модулем (cgi-модулем). Он определяет 4 информационных потока (рис. 4.2):

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

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

Рис. 4.2. CGI-интерфейс.

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

Этих переменных достаточно много, они содержат различные данные, в частности:

SERVER_SOFTWARE — содержит информацию о Web-сервере (название/версия);

GATEWAY_INERFACE — содержит информацию о версии CGI(CGI/версия);

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

CONTENT_TYPE — эта переменная специфицирована для запросов содержащих дополнительную информацию, таких как HTTP POST и PUT, и содержит тип данных этой информации;

REQUEST_METHOD — метод запроса, который был использован «POST»,»GET»,»HEAD» и т.д.;

PATH_INFO — значение переменной содержит полученный от клиента виртуальный путь до cgi-модуля;

PATH_TRANSLATED-значение переменной содержит физический путь до cgi-модуля, преобразованный из значения PATH_INFO;

QUERY_STRING — значение этой переменной соответствует строке символов следующей за знаком «?» в URL соответствующему данному запросу;

HTTP_USER_AGENT — название программы просмотра, которую использует клиент при посылке запроса.

Аргументы командной строки. Кроме переменных окружения запускаемой программе передается список параметров, помещаемых в командную строку при запуске. СGI-модуль в командной строке от сервера получает:

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

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

Стандартный входной поток. Состав данных, направляемых сервером во входной поток СGI-модуля, зависит от использованного клиентом метода запроса.

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

где name — имя переменной,

value — значение переменной,

N — количество переменных

При этом устанавливаются значения переменных окружения CONTENT_LENGTH и CONTENT_TYPE.

Таким образом, если в результате использования формы с аргументом тега FORM — METHOD=»POST» сформирована строка данных firm=МММ&price=100023, то сервер установит значение CONTENT_LENGTH равным 21 и CONTENT_TYPE в application/x-www-form-urlencoded, а в стандартный поток ввода посылается блок данных.

В случае запроса метода GET, строка данных передается как часть URL. Например,

В этом случае переменная окружения QUERY_STRING принимает значение name1=value1&name2=value2, а во входной поток ничего не посылается.

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

Вывод cgi-модуля должен начинаться с заголовка содержащего определенные строки и завершаться двумя символами CR («\n», код 0x10). Эти стоки воспринимаются как директивы серверу. Строки, не являющиеся директивами сервера, посылаются непосредственно клиенту. CGI спецификация определяет три директивы сервера:

Content-type — MIME или тип возвращаемого документа;

Location — указывает серверу, что возвращается не сам документ, а ссылка на него;

*Status — задает серверу HTTP/1.0 строку-статус, в которой кодируется различная информация (например, об успешном завершении операции).

При отправке клиенту HTML-документа директива имеет вид Content-Type:text/html\n\n.

Если будет передан URL, то директива может выглядеть, например, так Location: http://host/file.htm, и сервер вернет клиенту заданный этим путем документ, как если бы клиент запрашивал этот документ непосредственно.

Обычно CGI–программы размещаются в каталоге со стандартным именем (чаще всего cgi-bin). В этом случае для идентификации достаточно имени файла (без расширения). Ссылка на этот ресурс может выглядеть, например, так: http://www.orp.com/cgi-bin/myscript. Иногда сервер не содержит специального каталога. В этом случае файлы программ могут располагаться в произвольном месте, путь к которому включен в URL. Но при этом необходимо указывать и расширение файла: http://www.orp.com/mucat/myscript.exe. Для некоторых серверов (например, IIS 7) может потребоваться задавать разрешение на выполнение с указанием имени программы.

Использоваться такие ссылки могут в любом атрибуте, допускающем URL (href, src). При этом после самого адреса могут размещаться данные, которые будут переданы серверу вместе с URL. Данные начинаются с символов, следующих за знаком «?», например,
вызов CGI

В этом случае серверу будет отправлена строка /mycgi/cd2.exe?date. Сервер передает эту строку CGI-программе через переменные окружения (в PATH_INFO будет URL, а в QUERY_STRING – строка «date»).

После принятия и расшифровки запроса выполняется динамическое формирование cgi-модулем HTML-документа, например, таблицы выборки из базы данных.

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

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

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

У CGI имеется несколько разновидностей, в частности, WinCGI, для которого данные запроса и ответа передаются не через входной поток, а через запись в файлы. Параметры запроса записываются сервером в файл, запускается программа, читает и обрабатывает запрос, записывает ответ в файл (HTML), который сервер направляет клиенту.

Языком написания CGI-программ может быть любой, однако при использовании языков с транслятором интерпретирующего типа (Perl, PHP, VBAScript и др.) сервер должен содержать соответствующий интерпретатор (обычно в виде подключаемого модуля). При использовании языка с транслятором компилирующего типа (Pascal, C++, C#, Java), исполняемый модуль должен создаваться в консольном режиме.

Создать на языке C# программу, выводящую клиенту приветствие в ответ на запрос.

7 Приложения CGI

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

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

Серверы, которые ведут диалог с удаленным пользователем или выполняют обработку данных пользователя, мы будем называть активными.

Наиболее известный способ создания активных серверов WWW заключается в использовании так называемых приложений CGI. В отечественной литературе, посвященной серверам WWW, часто встречается транслитерация “CGI-скрипты”, которая произошла от оригинального термина CGI Scripts.

Что кроется за аббревиатурой CGI?

CGI — это стандартный шлюзовой интерфейс (Common Gateway Interface) для запуска внешних программ под управлением сервера WWW. Соответственно, приложениями CGI называются программы, которые, пользуясь этим интерфейсом, получают через протокол HTTP информацию от удаленного пользователя, обрабатывают ее, и возвращают результат обработки обратно в виде ссылки на уже существующий документ HTML или другой объект (например, графическое изображение) или в виде документа HTML, созданного динамически.

Передача информации от удаленного пользователя приложению CGI обычно выполняется следующим образом.

В документе HTML, который создается для ввода информации, предназначенной для обработки, размещается форма ввода. Эта форма состоит из необходимых органов управления: полей редактирования текстовой информации, переключателей, списков и так далее. Больше всего форма ввода похожа на привычные вам диалоговые панели операционной системы Microsoft Windows. Каждому органу управления присваивается произвольное имя. Кроме того, в этой форме должна быть кнопка, которую следует нажать после заполнения формы.

Когда пользователь заполняет форму и нажимает указанную кнопку, данные передаются приложению CGI, путь к которому задается в заголовке формы. Это приложение получает через протокол HTTP данные из полей формы в виде пар значений “имя поля/значение”.

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

Все описанные процедуры мы рассмотрим в этой главе более подробно. Кроме того, мы приведем исходные тексты различных приложений CGI. Заметим, что возможны и другие сценарии работы с программами CGI.


Так как приложение CGI является ни чем иным, как программой, вы должны оттранслировать ее для той операционной системы, под управлением которой работает ваш сервер WWW. В некоторых случаях вы можете найти более удобным создавать программы CGI с использованием специально предназначенных для этого интерпретаторов, таких как Perl, или языка пакетных заданий. Например, вы можете создать программу CGI для сервера Microsoft Information Server как обычный пакетный файл *.bat. В нашей книге мы сконцентрируемся на использовании для создания программ CGI мобильного языка программирования C. Транслятор этого языка вы можете найти в любой операционной системе.

Создание форм

Чаще всего программы CGI применяются для обработки данных, введенных удаленными пользователями при помощи форм. Поэтому изучение программ CGI мы начнем с создания форм.

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

Описание формы

Для того чтобы сделать форму в документе HTML, вы должны воспользоваться оператором , завершающим описание формы. Между операторами находятся описания органов управления в виде операторов ,

и с соответствующими параметрами.

Вот пример определения простейшей формы:

Здесь органы управления размещаются в таблице, состоящей из одного столбца и трех строк. В верхних двух строках мы разместили поля для ввода и редактирования текста, в последней строке — кнопку с названием Send. Внешний вид формы при ее просмотре в навигаторе показан на рис. 7.1.

Рис. 7.1. Простейшая форма для ввода двух текстовых строк

Перечислим допустимые параметры оператора

Форма выглядит так, как это показано на рис. 7.3.

Рис. 7.3. Форма для запуска программы CGI просмотра значений переменных среды

Обратите внимание, что после имени программы CGI через разделительный символ “?” указана строка параметров param1, которая может быть получена и проанализирована программой CGI.

Исходный текст программы CGI приведен в листинге 7.3.

Листинг 7.3. Файл chap7\viewenv\test.bat

В первой строке программа выводит в стандартный поток вывода STDOUT строку заголовка HTTP. Эта строка описывает тип передаваемых данных как text/plain, то есть обычный текст без оформления с использованием операторов HTML.

Вторая строка выводит в стандартный поток вывода пустую строку, которая отделяет заголовок HTTP от передаваемых данных.

Третья строка выводит путь к загрузочному файлу программы CGI и параметры, полученные ей при запуске.

И, наконец, в последней строке вызывается команда SET, которая выводит в поток STDOUT значения всех переменных среды, определенных в системе перед запуском программы.

Результат работы нашей программы CGI показан на рис. 7.4.

Рис. 7.4. Результат работы программы CGI, отображающей значения переменных среды

Ниже мы привели полный листинг, полученный при работе нашей программы CGI:

В этом листинге отображаются переменные среды, определенные специально для программы CGI сервером Microsoft Internet Information Server, а также переменные среды, стандартные для операционной системы Microsoft Windows NT.

Рассмотрим по отдельности назначение переменных среды. Заметим, что набор переменных, создаваемых при запуске программы CGI, зависит от конкретной реализации сервера WWW.

Технология WWW допускает защиту страниц HTML, когда доступ к отдельным страницам предоставляется только для отдельных пользователей при предъявлении пароля. При этом используется так называемая система аутентификации, или проверки подлинности идентификатора пользователя.

Переменная среды AUTH_TYPE содержит тип идентификации, который применяется сервером. Например, для сервера WWW типа Microsoft Information Server при включении аутентификации в этой переменной будет храниться строка “NTLM”.

В этой переменной находится версия интерфейса CGI, с которой работает данный сервер. В нашем случае интерфейс имеет версию 1.1.

В этой переменной перечислены типы данных MIME, которые могут быть приняты навигатором от сервера WWW. Из приведенного выше листинга видно, что сервер Microsoft Internet Information Server может передать навигатору Microsoft Internet Explorer (который был использован для работы с программой CGI) графические изображения (image) в формате gif, jpeg, pjpeg, x-xbitmap. Подробно эти типы данных описаны в спецификации протокола MIME, рассмотрение которой выходит за рамки нашей книги.

В переменную HTTP_REFER записывается адрес URL документа HTML, который инициировал работу программы CGI. В нашем случае этот документ был записан на локальном диске компьютера в каталоге C:\!websrv\Sample\Chap7\viewenv.

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

Разрешение видеоадаптера, установленное в компьютере пользователя.

Допустимое количество цветов в системе пользователя.

Операционная система, под управлением которой работает навигатор.

Тип центрального процессора в компьютере удаленного пользователя.

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

Имя узла, на котором работает сервер WWW.

Метод кодирования, который может быть использован навигатором для формирования ответа серверу WWW.

Информация авторизации от навигатора. Используется навигатором для собственной аутентификации в сервере WWW.

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

Специальные команды серверу WWW.

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

Тип данных, присланных навигатором.

Путь к виртуальному каталогу, в котором находится программа CGI.

Как правило, при настройке сервера WWW администратор выделяет один или несколько каталогов для хранения расширений сервера в виде программ CGI или ISAPI. Для файлов, записанных в такие каталоги, устанавливается доступ на запуск.

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

Физический путь к программе CGI.

Строка параметров, указанная в форме после адреса URL программы CGI после разделительного символа “?”.

Адрес IP узла, на котором работает навигатор удаленного пользователя.

Доменное имя узла, на котором работает навигатор удаленного пользователя. Если эта информация недоступна (например, для узла не определен доменный адрес), вместо доменного имени указывается адрес IP, как в переменной REMOTE_ADDR.

Имя пользователя, которое используется навигатором для аутентификации. Используется только в том случае, если сервер WWW способен работать с аутентификацией и программа CGI отмечена как защищенная.

Метод доступа, который используется для передачи данных от навигатора серверу WWW. В своих примерах мы используем методы доступа GET и POST, хотя протокол HTTP допускает применение и других методов доступа, например, PUT и HEAD.

В эту переменную записывается путь к виртуальному каталогу и имя программы CGI. Анализируя эту переменную, программа CGI может определить путь к своему загрузочному файлу.

Доменное имя сервера WWW или адрес IP сервера WWW, если доменное имя недоступно или не определено.

Имя и версия протокола, который применяется для выполнения запроса к программе CGI.

Номер порта, на котором навигатор посылает запросы серверу WWW.

Название и версия программного обеспечения сервера WWW. Версия следует после названия и отделяется от последнего символом “/”.

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

Примеры программ CGI

В этом разделе мы приведем примеры несложных программ CGI, демонстрирующих динамическое создание документов HTML и обработку данных, введенных при помощи форм.

Илон Маск рекомендует:  Что такое код swf_shapefillbitmaptile

Программа CGIHELLO

Программа CGIHELLO представляет собой простейшую программу CGI, которая запускается при помощи кнопки в форме, возвращая навигатору документ HTML, созданный динамически.

Эта программа хороша для проверки возможности запуска программ CGI на вашем сервере WWW или на сервере вашего поставщика услуг Internet. Так как она очень проста, существует немного причин, по которым она могла бы не работать. Это неправильная настройка прав доступа к виртуальному каталогу, содержащему загрузочный модуль программы CGI, а также неправильная ссылка на этот каталог в параметре ACTION оператора


В этом документе определена форма, содержащая единственную кнопку, созданную оператором и имеющую тип SUBMIT.

Глава 5
Основы Серверного JavaScript

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

В главе имеются следующие разделы:

Серверный JavaScript имеет то же ядро языка, что и клиентский JavaScript, с которым Вы, возможно, уже знакомы. Задачи, выполняемые Вами при запуске JavaScript на сервере, несколько отличаются от задач, выполняемых при работе JavaScript на клиенте. Разные окружения и задачи обращаются к различным объектам.

Что Делать и Где

Клиентская среда (браузер) является передним краем работы приложения. В этой среде, к примеру, Вы отображаете HTML-страницы в окне и обслуживаете истории сессий HTML-страниц, отображаемых в браузере в течение сессии. Объекты этой среды, следовательно, обязаны иметь возможность манипулировать страницами, окнами и историей.

По контрасту, в серверной среде Вы работаете с ресурсами сервера. Например, Вы можете установить соединение с реляционной базой данных, распределить информацию между пользователями приложения или манипулировать файловой системой сервера. Объекты этой среды обязаны иметь возможность манипулировать реляционной БД и файловой системой сервера.

Кроме того, HTML-страница не отображается на сервере. Она запрашивается на сервере для отображения на клиенте. Запрошенная страница может содержать клиентский JavaScript. Если запрошенная страница является частью приложения JavaScript, сервер может генерировать эту страницу «на лету».

При разработке приложения JavaScript помните о разнице между клиентской и серверной платформами. Различия показаны в следующей таблице.

Таблица 5.1 Сравнение Клиента и Сервера

Серверы обычно (хотя и не всегда) являются высокопроизводительными рабочими станциями с быстрыми процессорами и возможностью хранения больших объемов информации.

Клиенты часто (хотя и не всегда) являются настольными системами с маломощными процессорами и относительно небольшим объемом хранимых данных.

Серверы могут быть перегружены при одновременном доступе тысяч клиентов.

Клиенты часто — машины одного пользователя, поэтому можно передать часть нагрузки процессинга клиенту.

Предварительная обработка данных на клиенте также может уменьшить требования к пропускной способности сети, если клиентское приложение может компоновать данные.

Обычно имеются разные пути распределения приложения между сервером и клиентом. Некоторые задачи могут выполняться только на клиенте или только на сервере; другие могут выполняться на любом из них. Хотя нет какого-то определённого способа определить, что и где делать, Вы может следовать следующим общим правилам:

Основное правило — использовать клиентский процессинг (тэг SCRIPT ) для следующих задач:

  • Проверка ввода пользователя; то есть проверка верности введённых в форму значений
  • Запрос подтверждения пользователя и отображение диалоговых окон или информационных боксов
  • Выполнение агрегатных расчётов (таких как суммирование или вычисление среднего числа) или иной процессинг данных, запрошенных на сервере
  • «Обусловливание» (условная обработка) HTML
  • Выполнение других функций, не требующих информации с сервера

Использовать серверный процессинг (тэг SERVER ) для следующих задач:

  • Обслуживание серий клиентских запросов
  • Работа с данными, распределёнными по нескольким клиентам или приложениям
  • Доступ к БД или файлам на сервере
  • Вызов внешних библиотек на сервере
  • Динамическая специализация Java-аплетов; например, визуализация данных через использование Java-аплета

Служба JavaScript Session Management Service предоставляет объекты для сохранения информации, а клиентский JavaScript преходящ. Клиентские объекты существуют, пока пользователь имеет доступ к странице. Серверы могут объединять информацию от многих клиентов и многих приложений и могут сохранять большие объёмы данных в базе данных. Важно помнить обо всех этих характеристиках при распределении функциональности между клиентом и сервером.

Обзор Процессов Времени Прогона (Выполнения)

После того как Вы установили и стартовали приложение JavaScript, пользователь может получить к нему доступ.
Базовые процедуры таковы:

  1. Пользователь выполняет доступ к приложению по его URL в web-браузере, таком как Netscape Communicator. Браузер отправляет клиентский запрос страницы приложения на сервер.
  2. Если это запрос к странице с URL приложения, машина выполнения JavaScript, запущенная на сервере, находит информацию в web-файле, соответствующем этому URL. О деталях этого процесса и о том, что происходит на этом и на последующих двух этапах, см. в разделе «Процессинг Времени Прогона на Сервере».
  3. Машина времени выполнения конструирует HTML-страницу для отправки клиенту. Она выполняет байт-коды, ассоциированные с тэгами SERVER , из исходного кода HTML, создавая HTML-страницу на основе этих байт-кодов и иного HTML, имеющегося в оригинале. О том, как влиять на процесс конструирования страницы, см. в разделе «Конструирование HTML-Страницы».
  4. Машина выполнения высылает новую HTML-страницу (которая может содержать операторы клиентского JavaScript) клиенту.
  5. Машина выполнения JavaScript внутри web-браузера интерпретирует любые операторы клиентского JavaScript, форматирует вывод HTML и выводит результат пользователю.

Рисунок 5.1 иллюстрирует это процесс.

Рисунок 5.1 Процессинг запроса JavaScript-страницы

Конечно, пользователь обязан иметь Netscape Navigator (или иной браузер с возможностью выполнения JavaScript), чтобы клиент мог интерпретировать операторы клиентского JavaScript. Аналогично, если Вы создаёте страницу, содержащую серверный JavaScript, он должен быть установлен на Netscape-сервере, чтобы нормально функционировать.

Например, предположим, клиент запрашивает страницу с таким исходным кодом:

Add a New Customer

Note: All fields are required for the new customer

Серверные веб-приложения

Для расширения возможностей клиент-серверного взаимодействия в рамках протокола HTTP помимо создания на клиентской стороне расширений стандартных возможностей, предоставляемых языками разметки и браузерами, можно также разрабатывать на стороне веб-сервера приложения, плагины и сценарии, расширяющие возможности самого веб-сервера.

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

Сценарий ( скрипт, script ) — программа , которая автоматизирует некоторую задачу, которую пользователь выполняет вручную, используя интерфейсы программы.

Стандарт CGI

Круг задач, решаемых Web-сервером, ограничен. В основном он сводится к поддержке НТТР-взаимодействия и доставке клиенту Web-документов. Любые «нестандартные» действия реализуются с помощью специальной программы, которая взаимодействует с веб-сервером и клиентом. Это взаимодействие подчиняется определенным правилам.

Основной набор таких правил — стандарт CGI (Common Gateway Interface — интерфейс общего шлюза), который определяет порядок запуска программы на компьютере-сервере, способы передачи программе параметров и доставки результатов ее выполнения клиенту. Программа , написанная по правилам CGI , называется CGI -сценарием ( script CGI ), хотя это не означает, что на сервере не может выполняться двоичный файл .

Благодаря этому интерфейсу для разработки приложений можно использовать любой язык программирования , который располагает средствами взаимодействия со стандартными устройствами ввода/вывода. Такими возможностями обладают также сценарии для встроенных командных интерпретаторов операционных систем.

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

  1. Запуск программы.
  2. Инициализация и чтение выходных данных.
  3. Обработка данных.
  4. Вывод результатов выполнения.
  5. Завершение программы.

Различия между CGI -сценарием и консольным приложением касаются первого, второго и четвертого этапов выполнения.

Каждый раз, когда веб-сервер получает запрос от клиента, он анализирует содержимое запроса и возвращает соответствующий ответ:

  • Если запрос содержит указание на файл, находящийся на жестком диске, то сервер возвращает в составе ответа этот файл ;
  • Если запрос содержит указание на программу и необходимые для нее аргументы, то сервер исполняет программу и результат ее работы возвращает клиенту.
  • каким образом информация о сервере и запросе клиента передается программе в форме аргументов и переменныхокружения ;
  • каким образом программа может передавать назад дополнительную информацию о результатах (например о типе данных) в форме заголовков ответа сервера.

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

Значением атрибута action дескриптора


Если сценарий вызывается из формы, ему передаются те данные, которые пользователь ввел с помощью интерактивных элементов, отображаемых на веб-странице — передача информации CGI -сценарию осуществляется в два этапа: сначала браузер передает данные веб-серверу, затем веб- сервер передает их сценарию.

В большинстве случаев кроме кнопки Submit форма содержит другие интерактивные элементы, каждый из которых имеет имя ( атрибут NAME ) и значение ( атрибут VALUE , либо последовательность символов, введенная пользователем). Из имен элементов и их значений формируется строка параметров, которая имеет следующий формат.

Каждый параметр представляет собой имя управляющего элемента и его значение , разделенные знаком равенства, а несколько таких пар объединяют строку с помощью символа » & «. Если в состав имени или значения входит символ » & » или » = «, то подобные символы кодируются последовательность знака процента » % «, за которым следуют две шестнадцатеричные цифры, определяющие код символа . Так, например, последовательностью » %21 » кодируется восклицательный знак » !». Как правило, при передаче параметров трехсимвольными последовательностями заменяются все знаки, кроме латинских букв, цифр и символа пробела (последний заменяется знаком » + «).

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

Python 3. Программирование в Python – CGI

Что такое CGI?

Common Gateway Interface или CGI является стандартом для внешних шлюзовых программ для взаимодействия с информационными серверами, такими как HTTP-серверы.

Веб-браузер

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

  • Ваш браузер связывается с веб-сервером HTTP и запрашивает URL-адрес, то есть имя файла.
  • Веб-сервер анализирует URL-адрес и ищет имя файла. Если он обнаружит, что файл отправляет его обратно в браузер, в противном случае отправляется сообщение об ошибке, указывающее, что вы запросили неправильный файл.
  • Веб-браузер получает ответ от веб-сервера и отображает либо полученный файл, либо сообщение об ошибке.

Тем не менее, можно настроить HTTP-сервер так, чтобы всякий раз, когда запрашивается файл в определенном каталоге, этот файл не отправляется обратно; вместо этого он выполняется как программа, и все эти выходы программы отправляются обратно для отображения вашего браузера. Эта функция называется интерфейсом общего шлюза или CGI, а программы называются скриптами CGI. Эти CGI-программы могут быть Python Script, PERL Script, Shell Script, C или C ++ программой и т. д.

Архитектурная схема CGI

Поддержка и настройка веб-сервера

Прежде чем приступать к программированию CGI, убедитесь, что ваш веб-сервер поддерживает CGI, и он настроен для обработки программ CGI. Все программы CGI, которые будут выполняться HTTP-сервером, хранятся в предварительно сконфигурированной директории. Этот каталог называется CGI Directory, и по соглашению он называется как/var/www/cgi-bin. По соглашению, файлы CGI имеют расширение как. cgi, но вы также можете сохранить свои файлы с расширением python .py.

По умолчанию сервер Linux настроен на запуск только скриптов в каталоге cgi-bin в/var/www. Если вы хотите указать любой другой каталог для запуска ваших CGI-скриптов, прокомментируйте следующие строки в файле httpd.conf:

Здесь мы предполагаем, что у вас есть веб-сервер и он работает успешно, и вы можете запускать любую другую программу CGI, такую ​​как Perl или Shell, и т. д.

Первая программа CGI

Вот простая ссылка, которая связана с CGI-скриптом hello.py . Этот файл хранится в каталоге/var/www/cgi-bin и имеет следующий контент. Перед запуском программы CGI убедитесь, что у вас есть режим изменения файла, используя команду chmod 755 hello.py в UNIX, чтобы сделать исполняемый файл.

Если вы нажмете hello.py, то это даст следующий результат:

Привет, Мир! Это моя первая программа CGI

Этот скрипт hello.py: это простой скрипт Python, который записывает свой вывод в файл STDOUT, т. е. на экран. Существует одна важная и дополнительная функция, которая является первой строкой для печати. Content-type: text/html\r\n\r\n . Эта строка отправляется обратно в браузер и указывает тип содержимого, отображаемый на экране браузера.

К настоящему времени вы, должно быть, поняли базовую концепцию CGI, и вы можете написать много сложных программ CGI, используя Python. Этот скрипт может взаимодействовать с любой другой внешней системой также для обмена информацией, такой как РСУБД.

Заголовок HTTP

Строка Content-type: text/html\r\n\r\n является частью HTTP-заголовка, который отправляется в браузер для понимания содержимого. Весь HTTP-заголовок будет выглядеть следующим образом:

Существует несколько других важных HTTP-заголовков, которые вы часто будете использовать в своем программировании CGI.

Серверы Клиенты
Заголовок и описание
1 Content-type:

Строка MIME, определяющая формат возвращаемого файла. Пример Content-type: text/html

2 СExpires: Date

Дата, когда информация становится недействительной. Он используется браузером, чтобы решить, когда страница нуждается в обновлении. Действительная строка даты находится в формате 01 января 1998 года 12:00:00 GMT.

3 Location: URL

URL-адрес, который возвращается вместо запрашиваемого URL-адреса. Вы можете использовать это поле для перенаправления запроса в любой файл.

4 Last-modified: Date

Дата последней модификации ресурса.

5 Content-length: N

Длина в байтах возвращаемых данных. Браузер использует это значение для сообщения о предполагаемом времени загрузки файла.

6 Set-Cookie: String

Установка cookie, проходящий через строку

Переменные среды CGI

Все программы CGI имеют доступ к следующим переменным среды. Эти переменные играют важную роль при написании любой программы CGI.

Имя переменной и описание
1 CONTENT_TYPE

Тип данных содержимого. Используется, когда клиент отправляет прикрепленный контент на сервер. Например, загрузка файла.

2 CONTENT_LENGTH

Длина информации запроса. Он доступен только для запросов POST.

3 HTTP_COOKIE

Возвращает набор файлов cookie в виде пары ключ и значение.

4 HTTP_USER_AGENT

Поле заголовка запроса пользователя-агента содержит информацию о пользовательском агенте, инициирующем запрос. Это имя веб-браузера.

5 PATH_INFO

Путь к скрипту CGI.

6 QUERY_STRING

URL-кодированная информация, которая отправляется с запросом метода GET.

7 REMOTE_ADDR

IP-адрес удаленного хоста, делающего запрос. Это полезно для ведения журнала или для аутентификации.

8 REMOTE_HOST

Полноценное имя хоста, делающего запрос. Если эта информация недоступна, REMOTE_ADDR можно использовать для получения IR-адреса.

9 REQUEST_METHOD

Метод, используемый для выполнения запроса. Наиболее распространенными методами являются GET и POST.

10 SCRIPT_FILENAME

Полный путь к скрипту CGI.

11 SCRIPT_NAME

Имя скрипта CGI.

12 SERVER_NAME

Имя хоста сервера или IP-адрес

13 SERVER_SOFTWARE

Имя и версия программного обеспечения, на котором запущен сервер.

Вот небольшая программа CGI для перечисления всех переменных CGI. Нажмите эту ссылку, чтобы увидеть результат Get Environment

Методы GET и POST

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

Передача информации с использованием метода GET

Метод GET отправляет закодированную пользовательскую информацию, добавленную к запросу страницы. Страница и закодированная информация разделяются символом ? следующим образом:

Метод GET является методом по умолчанию для передачи информации от браузера к веб-серверу и создает длинную строку, которая отображается в поле «Location» вашего браузера. Никогда не используйте метод GET, если у вас есть пароль или другая конфиденциальная информация для передачи на сервер. Метод GET имеет ограничение по размеру: в строке запроса может быть отправлено только 1024 символа. Метод GET отправляет информацию с использованием заголовка QUERY_STRING и будет доступен в вашей программе CGI через переменную окружения QUERY_STRING.

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

В фактическом выводе вышеуказанной формы, вы вводите Имя и Фамилию, а затем нажмите кнопку «Отправить», чтобы увидеть результат.

Передача информации с использованием метода POST

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

Ниже приведен такой же скрипт hello_get.py, который обрабатывает GET, а также метод POST.

Возьмем опять тот же пример, что и выше, который передает два значения, используя кнопку HTML FORM и кнопку отправки. Для обработки этого ввода мы используем тот же скрипт CGI hello_get.py.

Вот фактический вывод вышеуказанной формы. Введите первое и последнее имя и нажмите кнопку «Отправить», чтобы увидеть результат.

Передача контрольных данных в программу CGI


Флажки используются, когда требуется выбрать более одного параметра.

Вот пример кода HTML для формы с двумя флажками:

Ниже приведен флажок checkbox.cgi для обработки ввода, заданного веб-браузером, для кнопки флажка.

Передача данных с помощью кнопки радио в программу CGI

Кнопки «Радио» используются, когда требуется выбрать только один параметр.

Вот пример кода HTML для формы с двумя переключателями:

Ниже приведен сценарий radioobutton.py для обработки ввода, заданного веб-браузером для переключателя:

Передача данных текстовой области в программу CGI

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

Вот пример кода HTML для формы с полем TEXTAREA:

Ниже приведен скрипт textarea.cgi для обработки ввода, заданного веб-браузером:

Передача данных Drop Down Box в программу CGI

Drop Down Box используется, когда у нас есть много доступных опций, но будет выбран только один или два.

Вот пример кода HTML для формы с одним выпадающим списком:

Ниже приведен сценарий dropdown.py для обработки ввода, заданного веб-браузером.

Протокол HTTP: это протокол без учета состояния. Для коммерческого веб-сайта необходимо поддерживать информацию о сеансе между различными страницами. Например, одна регистрация пользователя заканчивается после завершения многих страниц. Как сохранить информацию о сеансе пользователя на всех веб-страницах?

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

Как это работает?

Ваш сервер отправляет некоторые данные в браузер посетителя в виде файла cookie. Браузер может принять cookie. Если это так, оно хранится как простая текстовая запись на жестком диске посетителя. Теперь, когда посетитель прибывает на другую страницу вашего сайта, cookie доступен для извлечения. После получения ваш сервер знает/запоминает, что было сохранено.

Файлы cookie представляют собой запись текстовых данных из 5 полей переменной длины:

  • Expires – дата истечения срока действия файла cookie. Если это пустое, cookie истечет, когда посетитель покинет браузер.
  • Domain – доменное имя вашего сайта.
  • Path – путь к каталогу или веб-странице, которая устанавливает cookie. Это может быть пустым, если вы хотите получить файл cookie из любого каталога или страницы.
  • Secure – если это поле содержит слово «secure», то файл cookie может быть получен только с защищенного сервера. Если это поле пустое, таких ограничений не существует.
  • Name=Value – Cookies устанавливаются и извлекаются в виде пар ключей и значений.

Очень легко отправлять файлы cookie в браузер. Эти файлы cookie отправляются вместе с заголовком HTTP до заголовка Content-type. Предполагая, что вы хотите установить UserID и Password как файлы cookie. Настройка файлов cookie выполняется следующим образом:

В этом примере вы должны понимать, как устанавливать файлы cookie. Мы используем HTTP-заголовок Set-Cookie для установки файлов cookie.

Не обязательно устанавливать атрибуты cookie, такие как Expires, Domain и Path. Примечательно, что файлы cookie устанавливаются перед отправкой магической строки «Content-type: text/html\r\n\r\n.

Очень легко получить все установленные файлы cookie. Файлы cookie хранятся в переменной среды CGI HTTP_COOKIE, и они будут иметь следующую форму:

Ниже приведен пример извлечения файлов cookie.

Это дает следующий результат для файлов cookie, установленных вышеуказанным скриптом:

Пример загрузки файлов

Чтобы загрузить файл, форма HTML должна иметь атрибут enctype, установленный для multipart/form-data. Тег ввода с типом файла создает кнопку «Обзор».

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

Вот сценарий save_file.py для обработки загрузки файлов:

Если вы запустите вышеупомянутый скрипт в Unix/Linux, вам нужно позаботиться о замене разделителя файлов следующим образом, в противном случае на вашей машине windows выше Open() оператор должен работать нормально.

Как вызвать диалоговое окно «Загрузка файла»?

Иногда желательно, чтобы вы предоставили возможность, когда пользователь может щелкнуть ссылку, и она отобразит диалоговое окно «Загрузка файла» пользователю вместо отображения фактического содержимого. Это очень просто и может быть достигнуто через HTTP-заголовок. Этот HTTP-заголовок отличается от заголовка, упомянутого в предыдущем разделе.

Например, если вы хотите сделать файл FileName загружаемым из данной ссылки, то его синтаксис выглядит следующим образом:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Спортивные секции и клубы
в Санкт-Петербурге

Новости спортивных секций

Завершение строительства многофункционального спортивного комплекса для лиц с ограниченными возможностями в Приморском районе оценивается в 1 млрд 551 млн рублей.

19 сентября 2015 года в «TAURAS-FITNESS», одном из самых больших и современных физкультурно-оздоровительных центров Санкт-Петербурга, состоится День открытых дверей детских секционных направлений!

5–6 сентября 2015 года в Санкт-Петербурге на территории нового конгрессно-выставочного комплекса «ЭКСПОФОРУМ» в павильоне F и прилегающей уличной территории пройдет X Общественная акция «Выбираю спорт!» – ежегодное спортивное выставочное мероприятие для детей и их родителей, молодёжи и всех тех, кто любит спорт и активный отдых.

Крытые катки на улице Маршала Новикова и Ириновском проспекте, строящиеся с прошлой весны, сдадут на год позже — в конце 2020-го. Чиновники объявили повторный конкурс на выбору нового подрядчика взамен старого.

В Санкт-Петербурге, в «Центре плавания» (ул. Хлопина, 10), с 25 по 27 апреля пройдет чемпионат России по синхронному плаванию.

23-25 апреля в Центре художественной гимнастики «Жемчужина» (Петровский пр., 16) пройдут Всероссийские соревнования «Жемчужины Санкт-Петербурга».

Турнир будет проходить ежедневно с 10 до 18 часов.

Cgi программирование вывода в клиентскую среду

CGI (от англ. Common Gateway Interface — «общий интерфейс шлюза») — стандарт интерфейса, используемого для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия «скрипт» (сценарий) или «CGI-программа».

Поскольку гипертекст статичен по своей природе, веб-страница не может непосредственно взаимодействовать с пользователем. До появления JavaScript , не было иной возможности отреагировать на действия пользователя, кроме как передать введенные им данные на веб-сервер для дальнейшей обработки. В случае CGI эта обработка осуществляется с помощью внешних программ и скриптов, обращение к которым выполняется через стандартизованный (см. RFC 3875: CGI Version 1.1) интерфейс — общий шлюз.

Упрощенная модель, иллюстрирующая работу CGI:

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

Как работает CGI?¶

Обобщенный алгоритм работы через CGI можно представить в следующем виде:

  1. Клиент запрашивает CGI-приложение по его URI.
  2. Веб-сервер принимает запрос и устанавливает переменные окружения, через них приложению передаются данные и служебная информация.
  3. Веб-сервер перенаправляет запросы через стандартный поток ввода (stdin) на вход вызываемой программы.
  4. CGI-приложение выполняет все необходимые операции и формирует результаты в виде HTML.
  5. Сформированный гипертекст возвращается веб-серверу через стандартный поток вывода (stdout). Сообщения об ошибках передаются через stderr.
  6. Веб-сервер передает результаты запроса клиенту.

Области применения CGI¶

Наиболее частая задача, для решения которой применяется CGI — создание интерактивных страниц, содержание которых зависит от действий пользователя. Типичными примерами таких веб-страниц является форма регистрации на сайте или форма для отправки комментария. Другая область применения CGI, остающаяся за кулисами взаимодействия с пользователем, связана со сбором и обработкой информации о клиенте: установка и чтение «печенюшек»-cookies; получение данных о браузере и операционной системе; подсчет количества посещений веб-страницы; мониторинг веб-трафика и т.п.

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

CGI — это не язык программирования! Это простой протокол, позволяющий веб-серверу передавать данные через stdin и читать их из stdout. Поэтому в качестве CGI-обработчика может использоваться любая серверная программа, способная работать со стандартными потоками ввода-вывода.

Что такое общий интерфейс шлюза (CGI)?


CGI — это общий интерфейс шлюза. Как говорится в названии, это «общий» интерфейс шлюза для всего. Это так тривиально и наивно от имени. Я чувствую, что понял это, и я чувствовал это каждый раз, когда сталкивался с этим словом. Но, честно говоря, я этого не сделал. Я все еще смущен.

Я программист PHP с опытом веб-разработки.

пользовательский (клиентский) запрос для страницы — > веб-сервер (- > встроенный PHP интерпретатор) —- > Серверная сторона (PHP) Script — > Сервер MySQL.

Теперь скажите, что мой PHP Script может извлекать результаты из сервера MySQL и сервера MATLAB и некоторого другого сервера.

Итак, теперь PHP Script является CGI? Потому что его интерфейс для веб-сервера и всех других серверов? Я не знаю. Иногда они называют CGI, технологию и другие времена, когда они называют CGI программой или другим сервером.

В чем дело с /cgi-bin/*.cgi ? Что с этим? Я не знаю, что это за каталог cgi-bin на сервере. Я не знаю, почему у них есть расширения *.cgi.

Почему Perl всегда мешает. CGI и Perl (язык). Я также не знаю, что с этими двумя. Почти все время я слушаю эти два в комбинации «CGI и Perl». Эта книга — еще один отличный пример Программирование CGI с Perl. Почему бы не «Программирование CGI с помощью PHP/JSP/ASP»? Я никогда не видел таких вещей.

Программирование CGI в C меня смущает. » в C«?? Шутки в сторону?? Я не знаю, что сказать. Я просто смущен. » в C«?? Это меняет все. Программа должна быть скомпилирована и выполнена. Это полностью меняет взгляд на веб-программирование. Когда я компилирую? Как программа запускается (потому что это будет машинный код, поэтому он должен выполняться как независимый процесс). Как он взаимодействует с веб-сервером? IPC? и взаимодействовать со всеми серверами (в моем примере MATLAB и MySQL) с использованием программирования сокетов? Я потерян!

Люди говорят, что CGI устарел и больше не используется. Это так? Какое последнее обновление?

Однажды я столкнулся с ситуацией, когда я должен был предоставить доступ к HTTP PUT-запросу веб-сервер (Apache HTTPD). Его длинный назад. Итак, насколько я помню, это что я сделал:

Отредактирован файл конфигурации Apache HTTPD, чтобы сообщить веб-серверу пройти все запросы HTTP PUT к некоторым put.php (мне пришлось написать этот PHP скрипт)

Реализовать put.php для обработки запроса (сохранить файл в папку упоминается)

Люди сказали, что я написал CGI Script. Серьезно, я понятия не имел, что они говорили.

  • Я действительно писал CGI Script?

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

EDIT:

Я нашел этот удивительный учебник «Программирование CGI просто!» — Учебное пособие по CGI, в котором объясняются концепции в простейшем возможном пути. После прочтения этой статьи вы можете прочитать Начало работы с CGI Programming в C, чтобы дополнить ваше понимание фактическими образцами кода. Я также добавил эти ссылки в этот учебник к статье в Википедии: http://en.wikipedia.org/wiki/Common_Gateway_Interface

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

user (client) request for page — webserver —[CGI]— Server side Program — MySQL Server.

В большинстве случаев, если не все, веб-серверы могут быть настроены для выполнения программы как «CGI». Это означает, что веб-сервер после получения запроса пересылает данные в определенную программу, устанавливает некоторые переменные среды и сортирует параметры через стандартный ввод и стандартный вывод, чтобы программа могла знать, где и что искать.

Основное преимущество заключается в том, что вы можете запускать любой исполняемый код из Интернета, учитывая, что как веб-сервер, так и программа знают, как работает CGI. Вот почему вы можете писать веб-программы на C или Bash с помощью обычного веб-сервера с поддержкой CGI. Это означает, что большинство программных сред могут легко использовать стандартные входные данные, стандартные выходные данные и переменные среды.

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

Итак, отвечая на ваши вопросы:

В чем дело с /cgi -bin/*.cgi? Что с этим? Я не знаю, для чего этот каталог cgi-bin на сервере. Я не знаю, почему у них есть расширения *.cgi.

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

Почему Perl всегда мешает. CGI и Perl (язык). Я также не знаю, что с этими двумя. Почти все время я слушаю эти два в комбинации «CGI и Perl». Эта книга — еще один отличный пример CGI-программирования с Perl. Почему бы не «Программирование CGI с помощью PHP/JSP/ASP». Я никогда не видел таких вещей.

Поскольку Perl является древним (более старым, чем PHP, JSP и ASP, которые все стали известны, когда CGI был уже старым, Perl существовал, когда CGI был новым) и стал довольно известным, будучи очень хорошим языком для обслуживания динамических веб-страниц через CGI, В настоящее время существуют другие альтернативы для запуска Perl на веб-сервере, главным образом mod_perl.

Программирование CGI на C меня очень смущает. в C?? Шутки в сторону?? Я не знаю, что сказать. Я просто смущен. «В C»? Это меняет все. Программа должна быть скомпилирована и выполнена.Это полностью меняет мой взгляд на веб-программирование.Когда я компилирую? Как программа запускается (потому что это будет машинный код, поэтому он должен выполняться как независимый процесс).Как он взаимодействует с веб-сервером? IPC? и взаимодействует со всеми серверами (в моем примере MATLAB и MySQL) с помощью программирования сокетов? Я потерялся!!

Вы компилируете исполняемый файл один раз, веб-сервер выполняет программу и передает данные в запросе программе и выводит полученный ответ. CGI указывает, что один экземпляр программы будет запущен для каждого запроса. Вот почему CGI сегодня неэффективен и отчасти устарел.

Говорят, что CGI устарел. Его больше не используют. Это так? Каково его последнее обновление?

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

A означает, что веб-сервер получает свои данные из программы (а не, например, файл).

Нет большой сделки. Это просто соглашение.

Я не знаю, для чего этот каталог cgi-bin на сервере. Я не знаю, почему у них есть расширения *.cgi.

Сервер должен знать, что делать с файлом (т.е. рассматривать его как программу для выполнения вместо того, чтобы просто обслуживать). Наличие расширения .html говорит ему использовать тип содержимого text/html. Имея расширение .cgi, он запускает его как программу.

Сохранение исполняемых файлов в отдельном каталоге дает некоторую дополнительную защиту от выполнения неправильных файлов и/или обслуживания программ CGI в качестве необработанных данных в случае неправильной настройки сервера.

Это не так. Perl был просто большим и популярным одновременно с CGI.

Я не использовал Perl CGI годами. Я долгое время использовал mod_perl и в настоящее время имею тенденцию к PSGI/Plack с FastCGI.

Эта книга — еще один отличный пример программирования CGI с Perl Почему бы не «Программирование CGI с помощью PHP/JSP/ASP».

CGI не очень эффективен. Лучшие методы для общения с программами из веб-серверов приходили примерно одновременно с PHP. JSP и ASP — это разные способы общения с программами.

Программирование CGI на C меня очень смущает. в C?? Серьезно??

Это язык программирования, почему бы и нет?

  • Введите код
  • Compile
  • URL доступа
  • Webserver запускает программу

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

Он не должен выполняться как независимый процесс (вы можете писать модули Apache в C), но вся концепция CGI заключается в том, что он запускает внешний процесс.

Как он взаимодействует с веб-сервером? IPC?

STDIN/STDOUT и переменные среды — как определено в спецификации CGI.

и взаимодействовать со всеми серверами (в моем примере MATLAB и MySQL), используя сокет программирование?

Использование любых методов, которые вам нравятся и которые поддерживаются.

Говорят, что CGI обесценивается. Его больше не используют. Это так?

CGI неэффективен, медленен и прост. Он редко используется, когда он используется, потому что он прост. Если производительность не имеет большого значения, то простота стоит много.

Каково его последнее обновление?

CGI — это спецификация интерфейса между веб-сервером (HTTP-сервером) и исполняемой программой определенного типа, которая предназначена для обработки конкретного запроса.

В нем описывается, как определенные свойства этого запроса должны быть переданы в среду этой программы и как программа должна сообщать ответ на сервер и как сервер должен «заполнить» ответ, чтобы сформировать действительный ответ на оригинал HTTP-запрос.

Некоторое время CGI был проектом IETF в Интернете и, как таковой, имел срок годности. Он истек без обновления, поэтому не было стандарта CGI. Теперь это информационный RFC, но, как таковой, общепринятая практика и сама по себе не является стандартом. rfc3875.txt, rfc3875.html

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


Скомпилированные языки, такие как C, обычно использовались, как и языки сценариев, такие как perl, часто используя библиотеки, чтобы облегчить доступ к среде CGI.

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

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

Будь вы написали CGI script, скорее зависит от интерпретации. Это, безусловно, работало над одним, но гораздо проще запускать php в качестве модуля, где интерфейс между script и сервером не является строго интерфейсом CGI.

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

CGI (Common Gateway Interface)

CGI (англ. Common Gateway Interface — «общий интерфейс шлюза») — стандарт интерфейса, используемого для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия «скрипт» (сценарий) или «CGI-программа». Обычно гипертекстовые документы, извлекаемые из www (world w >[1]

Содержание

Главное назначение CGI

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

  • CGI определяет порядок взаимодействия сервера с прикладной программой, в котором сервер выступает инициирующей стороной;
  • CGI определяет механизм реального обмена данными и управляющими командами в этом взаимодействии, что не определено в HTTP.

Такие понятия, как метод доступа, переменные заголовка, MIME, типы данных, заимствованы из HTTP и делают спецификацию прозрачной для тех, кто знаком с самим протоколом.

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

CGI-скрипт — программа, написанная в соответствии со спецификацией Common Gateway Interface. CGI-скрипты могут быть написаны на любом языке программирования (C, C++ (язык программирования), PASCAL, FORTRAN и т.п.) или командном языке ( shell (Операционные Системы), cshell, командный язык MS-DOS, Perl и т.п.). Скрипт может быть написан даже на языке редактора EMAC в системах Unix.

Шлюз — это CGI-скрипт, который используется для обмена данными с другими информационными ресурсами Internet или приложениями-демонами. Обычная CGI-программа запускается сервером HTTP для выполнения некоторой работы, возвращает результаты серверу и завершает свое выполнение. Шлюз выполняется точно также, только, фактически, он инициирует взаимодействие в качестве клиента с третьей программой. Если эта третья программа является сервисом Internet, например, сервер Gopher, то шлюз становится клиентом Gopher, который посылает запрос по порту Gopher, а после получения ответа пересылает его серверу HTTP. [2]

Общий шлюзовый интерфейс CGI

CGI (Common Gateway Interface) — механизм доступа к программам на стороне веб-сервера. Спецификация CGI была разработана для расширения возможностей сервиса www за счет подключения различного внешнего программного обеспечения. При использовании CGI веб-сервер представляет браузеру доступ к исполнимым программам, запускаемым на его (серверной) стороне через стандартные потоки ввода и вывода.

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

Веб-серверы

Веб-сервер — это сетевое приложение, обслуживающее HTTP-запросы от клиентов, обычно веб-браузеров. Веб-сервер принимает запросы и возвращает ответы, обычно вместе с HTML-страницей, изображением, файлом, медиа-потоком или другими данными. Веб-серверы — основа Всемирной паутины. С расширением спектра сетевых сервисов веб-серверы все чаще используются в качестве шлюзов для серверов приложений или сами представляют такие функции (например, Apache Tomcat).

Созданием программного обеспечения веб-серверов занимаются многие разработчики, но наибольшую популярность имеют такие программные продукты, как Apache (Apache Software Foundation), IIS (Microsoft), Google Web Server (GWS, Google Inc.) и nginx.

  • Apache — свободное программное обеспечение, распространяется под совместимой с GPL лицензией. Apache уже многие годы является лидером по распространенности во Всемирной паутине в силу своей надежности, гибкости, масштабируемости и безопасности.
  • IIS (Internet Information Services) — проприетарный набор серверов для нескольких служб Интернета, разработанный Майкрософт и распространяемый с серверными операционными системами семейства Windows. Основным компонентом IIS является веб-сервер, также поддерживаются протоколы FTP, POP3, SMTP, NNTP.
  • Google Web Server (GWS) — разработка компании Google на основе веб-сервера Apache. GWS оптимизирован для выполнения приложений сервиса Google Applications.
  • nginx [engine x]— это HTTP-сервер, совмещенный с кэширующим прокси-сервером. Разработан И. Сысоевым для компании Рамблер. Осенью 2004 года вышел первый публично доступный релиз, сейчас nginx используется на 9-12% веб-серверов. Браузеры
  • Браузер, веб-обозреватель (web-browser) — клиентское приложение для доступа к веб-серверам по протоколу HTTP и просмотра веб-страниц. Как правило браузеры дополнительно поддерживают и ряд других протоколов (например ftp, file, mms, pop3).

Первые HTTP-клиенты были консольными и работали в текстовом режиме, позволяя читать гипертекст и перемещаться по ссылкам. Сейчас консольные браузеры (такие, как lynx, w3m или links) практически не используются рядовыми посетителями веб-сайтов. Тем не менее такие браузеры весьма полезны для веб-разработчиков, так как позволяют «увидеть» веб-страницу «глазами» поискового робота.

Исторически первым браузером в современном понимании (т.е. с графическим интерфейсом и т.д.) была программа NCSA Mosaic, разработанная Марком Андерисеном и Эриком Бина. Mosaic имел довольно ограниченные возможности, но его открытый исходный код стал основой для многих последующих разработок. [3]

Принцип работы CGI

Обобщенный алгоритм работы через CGI можно представить в следующем виде:

  1. Элемент нумерованного списка
  2. Клиент запрашивает CGI-приложение по его URI.
  3. Веб-сервер принимает запрос и устанавливает переменные окружения, через них приложению передаются данные и служебная информация.
  4. Веб-сервер перенаправляет запросы через стандартный поток ввода (stdin) на вход вызываемой программы.
  5. CGI-приложение выполняет все необходимые операции и формирует результаты в виде HTML.
  6. Сформированный гипертекст возвращается веб-серверу через стандартный поток вывода (stdout). Сообщения об ошибках передаются через stderr.
  7. Веб-сервер передает результаты запроса клиенту.

Механизмы обмена данными

  • через переменные окружения;
  • через командную строку;
  • через стандартный ввод;
  • через стандартный вывод.

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

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

Общие переменные окружения

  • SERVER_SOFTWARE — определяет имя и версию сервера.
  • SERVER_NAME — определяет доменное имя сервера.
  • GATEWAY_INTERFACE — определяет версию интерфейса.

Запрос-ориентированные окружения

  • SERVER_PROTOCOL — протокол сервера. Вообще говоря, CGI разрабатывалась не только для применения в www с протоколом HTTP, но и для других протоколов также, но широкое применение получила только в www.
  • SERVER_PORT — определяет порт TCP (Transmission Control Protocol) — протокол управления передачей), по которому осуществляется взаимодействие. По умолчанию для работы по HTTP используется 80 порт, но он может быть и переназначен при конфигурировании сервера.
  • REQUEST_METHOD — определяет метод доступа к информационному ресурсу. Это важнейшая переменная в CGI. Разные методы доступа используют различные механизмы передачи данных. Данная переменная может принимать значения GET, POST, HEAD и т. п.
  • PATH_INFO — передает программе путь, часть спецификации URL, в том виде, в котором она указана в клиенте. Реально это означает, что передается путь (адрес скрипта) в виде, указанном в HTML-документе.
  • PATH_TRANSLATED — то же самое, что и PATH_INFO, но только после подстановки сервером определенных в его конфигурации вставок.
  • SCRIPT_NAME — определяет адрес скрипта так, как он указан клиентом.
  • QUERY_STRING — переменная определяет содержание запроса к скрипту.

Идентификация пользователя и его машины

  • REMOTE_HOST — доменный адрес машины, с которой осуществляется запрос.
  • REMOTE_ADDR — IP-адрес запрашивающей машины.
  • AUTH_TYPE — тип идентификации пользователя. Используется в случае если скрипт защищен от несанкционированного использования.
  • REMOTE_USER — используется для идентификации пользователя.
  • REMOTE_IDENT — данная переменная порождается сервером, если он поддерживает идентификацию пользователя по протоколу RFC-931. Рекомендовано использование этой переменной для первоначального использования скрипта.

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

  • CONTENT_TYPE — определяет MIME-тип данных, передаваемых скрипту. Используя эту переменную можно одним скриптом обрабатывать различные форматы данных.
  • CONTENT_LENGTH — определяет размер данных в байтах, которые передаются скрипту. Данная переменная чрезвычайно важна при обмене данными по методу POST, т. к. нет другого способа определить размер данных, которые надо прочитать со стандартного ввода.

Возможна передача и других переменных окружения. В этом случае перед именем указывается префикс «HTTP_». Отдельный случай представляют переменные, порожденные в заголовке HTML-документа в тагах META. Они передаются в заголовке сообщения и некоторые серверы могут порождать переменные окружения из этих полей заголовка.

Опции командной строки

Командная строка используется только при запросах типа ISIN-DEX . При HTML FORMS или любых других запросах неопределенного типа командная строка не используется. Если сервер определил, что к скрипту обращаются через ISINDEX -документ, то поисковый критерий выделяется из URL и преобразуется в параметры командной строки. При этом знаком разделения параметров является символ «+». Тип запроса определяется по наличию или отсутствию символа «=» в запросе. Если этот символ есть, то запрос не является запросом ISINDEX , если символа нет, то запрос принадлежит к типу ISIN-DEX . Параметры, выделенные из запроса, помещаются в массив параметров командной строки argv. При этом после из выделения происходит преобразование всех шестнадцатеричных символов в их ASCII-коды. Если число параметров превышает ограничения, установленные в командном языке, например в shell, то формирования командной строки не происходит и данные передаются только через QUERY_STRING . Вообще говоря, следует заранее подумать об объеме данных, передаваемом скрипту и выбрать соответствующий метод доступа. Размер переменных окружения тоже ограничен, и если необходимо передавать много данных, то лучше сразу выбрать метод POST, т.е. передачу данных через стандартный ввод.

Формат стандартного ввода

Стандартный ввод используется при передаче данных в скрипт по методу POST. Объем передаваемых данных задается переменной окружения CONTENT_LENGTH , а тип данных — переменной CONTENT_TYPE . Если из HTML-формы надо передать запрос типа: a=b&b=c, то CONTENT_LENGTH =7, CONTENT_TYPE =application/x-www-form-urlencoded, а первым символом в стандартном вводе будет символ «а». Следует всегда помнить, что конец файла сервером в скрипт не передается, а поэтому завершать чтение следует по числу прочитанных символов. Позже мы разберем примеры скриптов и обсудим особенности их реализации в разных операционных системах.

Формат стандартного вывода

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

Content-type

Указывается в том случае, когда скрипт сам генерирует документ «на лету» и возвращает его клиенту. В этом случае реального документа в файловой системе сервера не остается. При использовании такого сорта скриптов следует учитывать, что не все серверы и клиенты отрабатывают так, как представляется разработчику скрипта. Так, при указании Content-type: text/html, некоторые клиенты не реализуют сканирования полученного текста на предмет наличия в нем встроенной графики. Обычно в Content-type указывают текстовые типы text/plain и text/html.

Location

Используется для переадресации. Иногда переадресация помогает преодолеть ограничения сервера или клиента на обработку встроенной графики или серверной предобработки. В этом случае скрипт создает файл на диске и указывает его адрес в Location. Сервер, таким образом, передает реально существующий файл. В последнее время серверы стали буферизовать возвращаемые клиентам данные, что приводит к решению вопросов, связанных с повторным запуском скриптов для встраивания графики и разгрузки компьютера с сервером HTTP. [4]

Области применения CGI

Наиболее частая задача, для решения которой применяется CGI — создание интерактивных страниц, содержание которых зависит от действий пользователя. Типичными примерами таких веб-страниц являются форма регистрации на сайте или форма для отправки комментария. Другая область применения CGI, остающаяся за кулисами взаимодействия с пользователем, связана со сбором и обработкой информации о клиенте: установка и чтение «cookies»; получение данных о браузере и операционной системе; подсчет количества посещений веб-страницы; мониторинг веб-трафика и т. п.

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

Важно знать, что CGI — это не язык программирования! Это простой протокол, позволяющий веб-серверу передавать данные через stdin и читать их из stdout . Поэтому, в качестве CGI-обработчика может использоваться любая серверная программа, способная работать со стандартными потоками ввода-вывода.

Преимущества CGI

Многие возможности CGI сейчас дублируются такими технологиями, как например DHTML, ActiveX или Java-апплетами. Основными преимуществами использования серверных скриптов является то, что вы можете быть уверены, что все клиенты (за редким исключением, как правило связанным с блокировкой доступа к определенным ресурсам на уровне файрвола) смогут работать с серверным приложением. Клиентские-же программы могут быть просто отключены в браузере, или вовсе не поддерживаться.

Недостатки CGI

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

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

Cgi программирование вывода в клиентскую среду

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

CGI – (Common Gateway Interface) – Общий Шлюзовый Интерфейс. Как не трудно догадаться интерфейс этот служит шлюзом между сервером (здесь я подразумеваю программу — сервер) и какой-либо внешней программой написанной для ОС на которой этот самый сервер запущен. Таким образом CGI отвечает за то, каким именно образом данные будут переданы от программы-сервера к CGI-программе и обратно. Интерфейс не накладывает никаких ограничений на то, на чем должна быть написана CGI-программа, это может быть как обычный исполнимый файл, так и любой другой файл – главное, чтобы сервер смог его запустить (в среде windows это например может быть файл с расширением, привязанным к какой-либо программе).

С момента когда Вы вызвали (например нажали кнопку формы, к которой привязан вызов CGI-программы) CGI-программу до получения вами результата в окно браузера происходит следующее:

— Вэб-клиент (например браузер) создает подключение к серверу, указанному в URL;

— Вэб-клиент посылает запрос серверу, запрос этот обычно делается с помощью двух методов GET или POST;

— Данные из запроса клиента (например значения полей формы) передаются сервером, используя CGI-интерфейс, CGI-программе, указанной в URL;

— CGI-программа обрабатывает данные клиента, полученные от сервера и генерирует на основе этой обработки ответ клиенту, который она передает по все тому же CGI-интерфейсу серверу, а он в свою очередь передает его уже непосредственно клиенту;

— Сервер разрывает соединение с клиентом.

В стандартной спецификации CGI принято, что сервер может обмениваться с программой следующими способами:

— Переменные окружения – они могут быть установлены сервером при запуске программы;

— Стандартный поток ввода (STDIN) – с его помощью сервер может передать данные программе;

— Стандартный поток вывода (STDOUT) – программа может писать в него свой вывод, передающийся серверу;

— Командная строка – в ней сервер может передать некоторые параметры программе.

Стандартные потоки ввода/вывода весьма удобны и широко используются на UNIX-системах, чего не скажешь о windows, поэтому существует спецификация CGI, разработанная специально для windows-систем так и называемая «Windows CGI». Но, естественно, и стандартные потоки ввода/вывода так же можно использовать в windows CGI программировании. Здесь я не буду затрагивать стандарт «Windows CGI», и на это существует по крайней мере две причины – первая, и самая главная – на данный момент не все http-сервера под windows поддерживают эту спецификацию (в частности мой любимый Apache 1.3.19). Вторую причину вы можете наблюдать набрав в любой поисковой системе строчку «Windows CGI». Отмечу относительно этого интерфейса лишь общие детали – все данные от сервера к клиенту передаются посредством обычного для windows *.ini файла, имя которого передается программе в командной строке. При этом все данные в файле уже заботливо разбиты по секциям сервером и вам лишь остается используя функции «GetPrivateProfile*» извлечь их оттуда. Ответ серверу передается опять же посредством файла, имя которого указано в соответствующей записи ini-файла.

Какие же данные могут быть переданы клиентом CGI-программе? – практически любые. В общем случае программе передаются значения полей формы, которые заполняет клиент, но это также могут быть и какие-либо двоичные данные, например файл с картинкой или музыкой. Данные могут быть переданы на сервер двумя различными методами – это метод GET и метод POST. Когда мы создаем форму для заполнения на нашей страничке мы явно указываем каким из приведенных методов мы хотим отправить введенные пользователем данные, делается это в основном тэге формы примерно так:

Илон Маск рекомендует:  Что такое код farheapwalk
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL