|
аправляет всем сервер, который "изо-
бражает из себя" клавиатуру.)
Следует заметить очень важную деталь: то, что был использован метод POST,
вовсе не означает, что не был применен также и метод GET. Иными словами,
метод POST подразумевает также возможность передачи данных через URL-
строку. Эти данные будут, как обычно, помещены в переменную окружения
QUERY_STRING.
Но как же узнать, сколько именно данных переслал пользователь методом POST? До
каких пор нам читать входной поток? Для этого служит переменная окружения
CONTENT_LENGTH, в которой хранится строка с десятичным представлением числа
переданных байтов данных (разумеется, перед использованием ее надо перевести в
обычное число).
Модифицируем предыдущий пример так, чтобы он принимал POST-данные, а также
выводил и GET-информацию, если она задана:
Листинг 3.3. Получение данных POST
#include
#include
void main(void) {
// извлекаем значения переменных окружения
char *RemoteAddr = getenv("REMOTE_ADDR");
char *ContentLength = getenv("CONTENT_LENGTH");
char *QueryString = getenv("QUERY_STRING");
// вычисляем длину данных — переводим строку в число
int NumBytes = atoi(ContentLength);
// выделяем в свободной памяти буфер нужного размера
char *Data = (char *)malloc(NumBytes + 1);
// читаем данные из стандартного потока ввода
fread(Data, 1, NumBytes, stdin);
// добавляем нулевой код в конец строки
// (в Си нулевой код сигнализирует о конце строки)
Data[NumBytes] = 0;
Часть I. Основы Web-программирования 52
// выводим заголовок
printf("Content-type: text/html\n\n");
// выводим документ
printf("");
printf("Здравствуйте. Мы знаем о вас все!");
printf("Ваш IP-адрес: %s ",RemoteAddr);
printf("Количество байтов данных: %d ",NumBytes);
printf("Вот параметры, которые Вы указали: %s ",Data);
printf("А вот то, что мы получили через URL: %s",
QueryString);
printf("");
}
Странслируем этот сценарий и запишем то, что получилось, под именем script.cgi
в каталог, видимый извне как /cgi-bin/. Откроем в браузере следующий HTML-
файл с формой:
Листинг 3.4. POST-форма
Теперь, если набрать в полях ввода какой-нибудь текст и нажать кнопку, получим
HTML-страницу, сгенерированную сценарием, например, следующего содержания:
Здравствуйте. Мы знаем о вас все!
Ваш IP-адрес: 136.234.54.2
Количество байтов данных: 23
Вот параметры, которые Вы указали: name1=Vasya&name2=Petya
А вот то, что мы получили через URL: param=value
Как можно заметить, обработка метода POST устроена сложнее, чем GET. Тем не ме-
нее, метод POST используется чаще, особенно если нужно передавать большие объе-
мы данных или "закачивать" файл на сервер (эта возможность также поддерживается
протоколом HTTP и HTML).
Глава 3. CGI изнутри 53
Расшифровка URL-кодированных данных
Если бы в предыдущем примере мы ввели параметры, содержащие, например, буквы
кириллицы, то сценарию они бы поступили не в "нормальном" виде, а в URL-
закодированном. Пожалуй, ни один сценарий не обходится без функции расшифровки
URL-кодированных данных. И это совсем не удивительно. Радует только то, что та-
кую функцию нужно написать один раз, а дальше можно пользоваться ей по мере
необходимости.
Как уже упоминалось, кодирование заключается в том, что некоторые неалфавитно-
цифровые символы (в том числе и "русские" буквы, которые тоже считаются неалфа-
витными) прео
|
|