C++ Веб-программирование
Что такое CGI?
- Common Gateway Interface (CGI) — это стандарт, который определяет, как происходит обмен информацией между веб-серверами и клиентскими сценариями.
- Спецификация CGI в настоящее время поддерживается NCSA, которая определяет CGI следующим образом:
- Common Gateway Interface (CGI) — это стандарт интерфейса для взаимодействия внешних шлюзовых программ с информационными серверами, такими как HTTP-серверы.
- Текущая версия — CGI/1.1, а CGI/1.2 находится в разработке.
Просмотр веб-страниц
Чтобы лучше понять концепцию CGI, давайте щёлкнем по гиперссылке, просмотрим конкретную веб-страницу или URL и посмотрим, что произойдёт.
- Ваш браузер связывается с веб-сервером HTTP и запрашивает URL, то есть имя файла.
- Веб-сервер анализирует URL и ищет имя файла. Если запрошенный файл найден, веб-сервер отправляет файл обратно в браузер; в противном случае он отправляет сообщение об ошибке, указывающее, что вы запросили неправильный файл.
- Веб-браузер получает ответ от веб-сервера и отображает файл или сообщение об ошибке на основе полученного ответа.
Однако в HTTP-сервере, построенном таким образом, при каждом запросе файла из каталога HTTP-сервер не отправляет сам файл обратно, а выполняет его как программу и отправляет вывод, полученный в результате этого выполнения, обратно в браузер для отображения.
Общий интерфейс шлюза (CGI) — это стандартный протокол, который позволяет приложениям (называемым CGI-программами или CGI-скриптами) взаимодействовать с веб-серверами и клиентами. Такие CGI-программы можно писать на Python, PERL, Shell, C или C++ и т. д.
Схема архитектуры CGI
Следующая схема демонстрирует архитектуру CGI:
Настройка веб-сервера
Прежде чем приступить к программированию CGI, убедитесь, что ваш веб-сервер поддерживает CGI и настроен для обработки CGI-программ. Все CGI-программы, выполняемые HTTP-сервером, должны быть помещены в предварительно настроенный каталог. Этот каталог называется каталогом CGI и по соглашению имеет имя /var/www/cgi-bin. Хотя CGI-файлы являются исполняемыми файлами C++, по соглашению их расширение —.cgi。
По умолчанию веб-сервер Apache настроен на выполнение CGI-программ в /var/www/cgi-bin. Если вы хотите указать другой каталог для выполнения CGI-скриптов, можно изменить следующий раздел в файле httpd.conf:
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
Здесь мы предполагаем, что веб-сервер настроен и успешно работает, и вы можете запускать любую CGI-программу, например Perl или Shell, и т. д.
Первая CGI-программа
Пожалуйста, посмотрите на следующую программу на C++:
Пример
Скомпилируйте приведённый выше код, назовите исполняемый файл cplusplus.cgi и сохраните этот файл в каталоге /var/www/cgi-bin. Перед запуском CGI-программы, пожалуйста, используйтеchmod 755 cplusplus.cgiИспользуйте команду UNIX, чтобы изменить режим файла и убедиться, что файл исполняемый. Откройте исполняемый файл, и вы увидите следующий вывод:
Привет, мир! Это моя первая CGI-программа
Приведённая выше программа на C++ — это простая программа, которая записывает свой вывод в файл STDOUT, то есть отображает его на экране. Здесь стоит отметить, что первая строка выводаContent-type:text/html\r\n\r\nотправляется обратно в браузер и определяет тип содержимого, которое будет отображаться в окне браузера. Вы должны понимать основные концепции CGI, чтобы в дальнейшем использовать Python для написания более сложных CGI-программ. CGI-программы на C++ могут взаимодействовать с любой другой внешней системой (например, с СУБД).
Информация HTTP-заголовка
строкаContent-type:text/html\r\n\r\nЭто часть информации HTTP-заголовка, которая отправляется в браузер, чтобы он лучше понимал содержимое страницы. Информация HTTP-заголовка имеет следующий формат:
HTTP 字段名称: 字段内容 例如 Content-type: text/html\r\n\r\n
Существуют также некоторые другие важные HTTP-заголовки, которые часто используются в вашем CGI-программировании.
| Информация заголовка | Описание |
|---|---|
| Content-type: | MIME-строка, определяет формат возвращаемого файла. Например, Content-type:text/html. |
| Expires: Дата | Дата, после которой информация становится недействительной. Браузер использует её, чтобы определить, когда страницу нужно обновить. Корректная строка даты должна иметь формат 01 Jan 1998 12:00:00 GMT. |
| Location: URL | Этот URL указывает на URL, который должен быть возвращён, а не на запрошенный URL. Его можно использовать для перенаправления запроса на любой файл. |
| Last-modified: Дата | Дата последнего изменения ресурса. |
| Content-length: N | Длина возвращаемых данных в байтах. Браузер использует это значение, чтобы показать примерное время загрузки файла. |
| Set-Cookie: Строка | С помощьюстрокиустановить cookie. |
Переменные среды CGI
Все CGI-программы могут получать доступ к следующим переменным среды. Эти переменные играют очень важную роль при написании CGI-программ.
| Имя переменной | Описание |
|---|---|
| CONTENT_TYPE | Тип данных содержимого. Используется, когда клиент отправляет дополнительное содержимое на сервер. Например, такие функции, как загрузка файлов. |
| CONTENT_LENGTH | Длина информации запроса. Доступна только для POST-запросов. |
| HTTP_COOKIE | Возвращает установленные cookies в виде пар ключ и значение. |
| HTTP_USER_AGENT | Поле заголовка запроса user agent передает информацию о запросе пользователя, включая имя браузера, версию и другую дополнительную информацию, зависящую от платформы. |
| PATH_INFO | Путь к CGI-скрипту. |
| QUERY_STRING | URL-кодированная информация при отправке запроса методом GET, содержащая параметры после вопросительного знака в URL. |
| REMOTE_ADDR | IP-адрес удаленного хоста, выполняющего запрос. Это очень полезно для логирования и аутентификации. |
| REMOTE_HOST | Полное доменное имя хоста, выполняющего запрос. Если эта информация недоступна, для получения IP-адреса можно использовать REMOTE_ADDR. |
| REQUEST_METHOD | Метод, используемый для выполнения запроса. Наиболее распространенные методы — GET и POST. |
| SCRIPT_FILENAME | Полный путь к CGI-скрипту. |
| SCRIPT_NAME | Имя CGI-скрипта. |
| SERVER_NAME | Имя хоста или IP-адрес сервера. |
| SERVER_SOFTWARE | Название и версия программного обеспечения, работающего на сервере. |
Следующая CGI-программа перечисляет все переменные CGI.
Пример
Библиотека CGI для C++
В реальных примерах вам нужно выполнять множество операций через CGI-программу. Вот библиотека CGI, написанная специально для программ на C++, которую можно получить сftp://ftp.gnu.org/gnu/cgicc/Скачайте эту библиотеку CGI и установите библиотеку в соответствии со следующими шагами:

$ tar xzf cgicc-X.X.X.tar.gz $ cd cgicc-X.X.X/ $ ./configure --prefix=/usr $ make $ make install
Примечание:Библиотеки libcgicc.so и libcgicc.a будут установлены в каталог /usr/lib; выполните команду копирования:
$ sudo cp /usr/lib/libcgicc.* /usr/lib64/Чтобы CGI-программы могли автоматически находить динамически подключаемую библиотеку libcgicc.so.
Вы можете щёлкнутьДокументация по библиотеке C++ CGI, чтобы обратиться к соответствующей документации библиотеки.
Методы GET и POST
Возможно, вы сталкивались с ситуациями, когда необходимо передать некоторую информацию из браузера на веб-сервер, а затем в CGI-программу. Обычно браузер использует два метода для передачи этой информации на веб-сервер: GET и POST.
Передача информации с помощью метода GET
Метод GET добавляет закодированную пользовательскую информацию к запросу страницы. Страница и закодированная информация разделяются символом ?, как показано ниже:
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
Метод GET является методом по умолчанию для передачи информации из браузера на веб-сервер. Он создает длинную строку в адресной строке браузера. Когда вы передаете пароли или другую конфиденциальную информацию на сервер, не используйте метод GET. Метод GET имеет ограничение по размеру: максимально допускается 1024 символа в строке запроса.
При использовании метода GET информация передается с помощью HTTP-заголовка QUERY_STRING, доступ к которому в CGI-программах можно получить через переменную среды QUERY_STRING.
Вы можете передавать информацию, добавляя к URL простые объединенные пары ключ-значение, или используя метод GET тега HTML <FORM>.
Простой пример URL: метод Get
Ниже приведен простой URL, который передает два значения в программу cpp_get.cgi с использованием метода GET.
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
Следующий пример создаетcpp_get.cgiCGI-программа используется для обработки ввода из веб-браузера. Используя библиотеку C++ CGI, можно легко получить доступ к переданной информации:
Пример
Теперь скомпилируйте вышеприведённую программу следующим образом:
$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc
Сгенерируйте cpp_get.cgi, поместите его в каталог CGI и попробуйте получить к нему доступ по следующей ссылке:
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
Это даёт следующий результат:
名:ZARA 姓:ALI
Простой пример формы: метод GET
Ниже приведён простой пример, который использует HTML-форму и кнопку отправки для передачи двух значений. Мы будем использовать тот же CGI-скрипт cpp_get.cgi для обработки ввода.
Ниже приведён фактический вывод вышеуказанной формы. Пожалуйста, введите ваше имя и фамилию, затем нажмите кнопку отправки, чтобы увидеть результат.
Передача информации с помощью метода POST
Более надёжный метод передачи информации в CGI-программы — это метод POST. Этот метод упаковывает информацию так же, как метод GET, за исключением того, что вместо передачи информации в виде текстовой строки после ? в URL он передаёт её как отдельное сообщение. Сообщение передаётся CGI-скрипту как стандартный ввод.
Мы также используем программу cpp_get.cgi для обработки метода POST. Давайте воспользуемся тем же примером, передавая два значения с помощью HTML-формы и кнопки отправки, за исключением того, что на этот раз мы используем метод POST вместо метода GET, как показано ниже:
Передача данных флажков в CGI-программы
Когда нужно выбрать несколько вариантов, мы используем флажки.
Следующий пример HTML-кода — это форма с двумя флажками:
Следующая программа на C++ создает сценарий cpp_checkbox.cgi, который обрабатывает ввод, передаваемый веб-браузером через флажки.
Пример
Передача данных радиокнопок в CGI-программы
Когда нужно выбрать только один вариант, мы используем радиокнопки.
Следующий пример HTML-кода представляет собой форму с двумя радиокнопками:
Следующая программа на C++ генерирует скрипт cpp_radiobutton.cgi, который обрабатывает ввод, отправленный веб-браузером через радиокнопки.
Пример
Передача данных из Textarea в CGI-программы
Когда многострочный текст нужно передать в CGI-программу, мы используем элемент TEXTAREA.
Следующий пример HTML-кода представляет собой форму с полем TEXTAREA:
Следующая программа на C++ генерирует скрипт cpp_textarea.cgi, который обрабатывает входные данные, переданные веб-браузером через textarea.
Пример
Передача данных выпадающего списка в CGI-программы
Когда доступно несколько вариантов, но выбрать можно только один или два, мы используем выпадающий список.
Следующий пример HTML-кода представляет собой форму с выпадающим списком:
Следующая программа на C++ создаёт скрипт cpp_dropdown.cgi, который обрабатывает ввод, переданный веб-браузером через выпадающий список.
Пример
Использование куки в CGI
Протокол HTTP — это протокол без сохранения состояния. Но коммерческому веб-сайту необходимо поддерживать информацию о сеансе между разными страницами. Например, пользователь завершает регистрацию, выполнив шаги на нескольких страницах. Однако как можно поддерживать информацию о сеансе пользователя на всех веб-страницах?
Во многих случаях использование куки — наиболее эффективный способ запоминать и отслеживать информацию о предпочтениях пользователя, покупках, комиссиях и другую информацию, необходимую для улучшения взаимодействия с посетителем или ведения статистики сайта.
Как это работает
Сервер отправляет некоторые данные в браузер посетителя в виде куки. Если браузер принимает куки, они сохраняются на жёстком диске посетителя как запись в виде обычного текста. Теперь, когда посетитель заходит на другую страницу веб-сайта, куки извлекаются. Как только куки найдены, сервер знает, что было сохранено.
Куки — это запись данных в виде обычного текста с 5 полями переменной длины:
- Expires :Срок действия куки. Если это поле оставить пустым, срок действия куки истечёт, когда посетитель закроет браузер.
- Domain :Доменное имя веб-сайта.
- Path :Путь к каталогу или странице, где устанавливается куки. Если вы хотите извлекать куки из любого каталога или страницы, это поле можно оставить пустым.
- Secure :Если это поле содержит слово "secure", куки можно извлечь только через защищённый сервер. Если это поле оставить пустым, это ограничение не действует.
- Name=Value :Куки устанавливаются и извлекаются в виде пар ключ-значение.
Установка куки
Отправка куки в браузер очень проста. Эти куки отправляются вместе с HTTP-заголовками, перед полем Content-type. Предположим, вы хотите установить UserID и Password в качестве куки. Шаги по установке куки следующие:
Пример
Из этого примера мы узнали, как устанавливать куки. Мы используемSet-CookieHTTP-заголовки для установки куки.
Здесь некоторые атрибуты для установки куки являются необязательными, такие как Expires, Domain и Path. Стоит отметить, что куки находятся в отправляемой строке"Content-type:text/html\r\n\r\nЭто было установлено ранее.
Скомпилируйте вышеприведённую программу, чтобы сгенерировать setcookies.cgi, и попробуйте использовать следующую ссылку для установки куки. Она установит четыре куки на вашем компьютере:
/cgi-bin/setcookies.cgi
Получение куки
Получение всех установленных куки очень просто. Куки хранятся в переменной окружения CGI HTTP_COOKIE, а их формат следующий:
key1=value1;key2=value2;key3=value3....
Следующий пример демонстрирует, как получить куки.
Пример
Теперь скомпилируйте приведённую выше программу, чтобы сгенерировать getcookies.cgi, и попробуйте использовать следующую ссылку, чтобы получить все доступные cookie-файлы на вашем компьютере:
/cgi-bin/getcookies.cgi
Это создаёт список, показывающий четыре cookie-файла, установленные в предыдущем разделе, а также все остальные cookie-файлы на вашем компьютере:
UserID XYZ Password XYZ123 Domain www.w3cschool.cc Path /perl
Пример загрузки файла
Чтобы загрузить файл, HTML-форма должна установить атрибут enctype в значениеmultipart/form-data. Тег input с типом file создаёт кнопку «Обзор».
Результат этого кода — следующая форма:
Примечание:В приведённом выше примере намеренно отключено сохранение загруженного файла на нашем сервере. Вы можете попробовать приведённый выше код на своём сервере.
Ниже приведён скрипт для обработки загрузки файлов.cpp_uploadfile.cpp:
Пример
Приведенный выше пример используетcoutдля записи содержимого в поток, но вы можете открыть файловый поток и сохранить содержимое загруженного файла в определенном файле в целевом расположении.
Другие расширения