CGI приложение может быть разработано на любом языке, допускающим создание 32-разрядных приложений (например, C++, Delfi, PHP и др.). В этой работе рассматривается пример разработки CGI приложения на Visual C++.
Когда приложение начинает работу, ему уже доступны следующие, созданные сервером переменные окружения:
- REQUEST_METHOD - указывает на используемый метод передачи данных из формы (задается параметром METHOD тэга <FORM>):
- QUERY_STRING - при использовании метода GET содержит переданные из формы данные в виде пар "имя=значение&имя=значение& . . ." с использованием URL-кодировки.
- CONTENT_LENGTH - при использовании метода POST задает объем передаваемых данных (в байтах). Сами данные передаются через стандартный входной поток (для C++ это stdin ).
Если сравнить два метода передачи данных - GET и POST, то можно отметить следующее:
- Метод GET несколько проще в использовании, но содержит ограничения на объем передаваемых данных. Может быть рекомендован для передачи данных относительно небольшого объема;
- Метод POST ограничений на объем передаваемых данных не имеет.
Для доступа к переменным окружения в C++ имеется функция getenv("имя переменной окружения"), которая возвращает значение указанной переменной окружения.
CGI-приложение должно создавать динамическую Web-страницу в виде стандартного выходного потока (для C++ это stdout ). Первой строкой выводимых данных должен быть заголовок HTTP-протокола, который задает тип возвращаемых браузеру данных в следующем формате:
- Content-type:text/plain - обычные текстовые данные;
- Content-type:text/html - данные в виде HTML-документа.
Кроме того для правильного распознания текста на кириллице в HTTP-заголовке указывается тип кодировки: charset=windows-1251.
Чтобы заголовок HTTP-протокола был распознан браузером, он должен обязательно отделяться от HTML-документа пустой строкой.
Ниже приведен фрагмент программы на VisualC++ ("z_visual.cpp"), который реализует следующие действия:
- формирует заголовок HTTP-протокола;
- динамически формирует HTML-документ, который передается Web-сервером браузеру для реализации в виде Web-страницы;
- определяет метод передачи данных и выводит его название на экран;
- для метода GET переписывает данные формы из переменной окружения QUERY_STRING" в szQueryString.
- для метода POST определяет и выводит на экран объем переданных данных и переписывает эти данные из входного потока stdin в szQueryString.
- выводит на экран принятые данные.
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void main(void){
char *szQueryString;
char *szMethod;
int size;
// Вывод HTTP-заголовка:
printf("Content-type:text/html;charset=windows-1251\n\n");
// Динамическое формирование Web-страницы:
printf("<H1 style=\"text-align:center;font:italic bold 12mm;color:#E000E0\">");
printf("CGI-приложение работает!</H1><BR>");
szMethod=getenv("REQUEST_METHOD");
printf("<P style=\"text-align:center; font-size:7mm; color:#0000f0\"> Метод: %s",
szMethod);
// Анализ метода передачи данных:
if (!strcmp(getenv("REQUEST_METHOD"),"GET"))
//Метод GET:
szQueryString=getenv("QUERY_STRING");
else {
//Метод POST:
size=atoi(getenv("CONTENT_lENGTH"));
szString=(char*)malloc(size*sizeof(char));
fread(szString,size,1,stdin);
szString[size]='\0';
printf("<P>Объем переданных параметров: %d",size);
}
printf("<P>Параметры, переданные из формы: %s",szQueryString);
// Дальнейшая обработка данных:
. . .
}