Программа AREF
До сих пор в наших примерах мы использовали программы CGI только для обработки данных из полей форм, указывая адрес URL загрузочного файла программы в параметре ACTION оператора <FORM>. Однако есть и другая возможность вызова программ CGI: вы можете указать их адрес в параметре HREF оператора ссылки <A>. В этом случае вы можете передать программе CGI параметры, указав их после имени файла загрузочного модуля через разделительный символ “?”. Программа получит строку параметров методом GET и сможет извлечь ее из переменной среды с именем QUERY_STRING.
Пример документа HTML, в котором демонстрируется вызов программы CGI указанным выше способом, приведен в листинге 7.7.
Листинг 7.7. Файл chap7\aref\aref.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Ссылки на документы HTML</TITLE>
</HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="http://frolov/frolov-cgi/aref.exe?page1">Домашняя страница</A><BR>
<A HREF="http://frolov/frolov-cgi/aref.exe?page2">Книги</A><BR>
<A HREF="http://frolov/frolov-cgi/aref.exe?page3">Статьи</A><BR>
</BODY>
</HTML>
В этом документе есть три ссылки на программу CGI с именем aref.exe, причем каждый раз ей передаются разные параметры. Внешне документ выглядит так, как это показано на рис. 7.8.

Рис. 7.8. Документ HTML с ссылками на программу CGI
Программа CGI принимает параметр и в зависимости от его значения отображает один из документов HTML. Например, при выборе третьей строки в окне навигатора отображается документ, показанный на рис. 7.9.

Рис. 7.9. Документ, который отображается программой CGI при выборе строки “Статьи”
Исходный текст программы AREF достаточно прост и приведен в листинге 7.8.
Листинг 7.8. Файл chap7\aref\aref.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(int argc, char *argv[])
{
char * szQueryString;
szQueryString = getenv("QUERY_STRING");
if(!strcmp(szQueryString, "page1"))
printf("Location: home.htm\n\n");
else if(!strcmp(szQueryString, "page2"))
printf("Location: books.htm\n\n");
else if(!strcmp(szQueryString, "page3"))
printf("Location: capital.htm\n\n");
else
printf("Location: error.htm\n\n");
}
Программа получает значение переменной среды QUERY_STRING, пользуясь для этого функцией getenv. Далее она сравнивает значение параметра со строками “page1”, “page2” и “page3”. При совпадении программа возвращает навигатору адрес URL соответствующего документа HTML, формируя заголовок HTTP специального вида:
Location: <Адрес URL документа HTML или графического изображения>\n\n
Когда навигатор получает от сервера WWW такой заголовок, он отображает в своем окне документ или файл графического изображения, адрес URL которого указан в заголовке.
Таким образом, программа CGI может анализировать параметры, поступающие от навигатора через ссылку или поля формы, а затем не только динамически формировать документ HTML для отображения в окне навигатора, но и возвращать ссылки на уже существующие документы в виде их адресов URL.
Эта возможность может пригодиться вам для организации ссылок на документы HTML через списки, создаваемые оператором <SELECT>, расположенном в форме. Программа CGI может определить, какая строка была выбрана в списке в момент посылки заполненной формы серверу WWW, и в зависимости от этого либо возвратить ссылку на тот или иной существующий документ HTML, либо сформировать новый документ HTML динамически.