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;
text_com// Вивід 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);
// Подальша обробка даних:
. . .
}