|
бы имело
смысл об этом говорить.
Вернемся к нашему предыдущему примеру. Теперь пользователь может указать свой
часовой пояс сценарию, например, так:
http://www.somehost.com/script.cgi?time=+5
Сценарий с именем script.cgi, после того как он запустится и получит эту строку
параметров, должен ее проанализировать (например, создать переменную time и
присвоить ей значение +5, т. е. 5 часов вперед) и дальше работать как ему нужно.
Обращаю ваше внимание на то, что принято параметры сценариев указывать именно
в виде переменная=значение.
А если нужно передать несколько параметров (например, не только часовой пояс,
но
и имя пользователя)? Сделаем это следующим образом:
http://www.somehost.com/script.cgi?time=+5&name=Vasya
Опять же, принято разделять параметры с помощью символа &. Будем в дальнейшем
придерживаться этого соглашения, поскольку именно таким образом поступают брау-
зеры при обработке форм. (Видели когда-нибудь на странице несколько полей ввода
и переключателей, а под ними кнопку "Отправить"? Это и есть форма, с ее помощью
можно автоматизировать процесс передачи данных сценарию). Ну и, разумеется,
сце-
нарий опять же должен адекватно среагировать на эти параметры: провести разбор
строки, создать переменные и т. д. Обращаю ваше внимание на то, что все эти
дейст-
вия придется программировать вручную, если мы хотим воспользоваться языком Си.
Так вот, такой способ посылки параметров сценарию (когда данные помещаются в
командную строку URL) называется методом GET. Фактически, даже если не переда-
ется никаких параметров (например, при загрузке статической страницы), все
равно
применяется метод GET. Все? Нет, не все. Существует еще один распространенный
способ (не менее распространенный) — метод POST, но давайте прежде рассмотрим,
на каком языке "общаются" браузер и сервер.
Заголовки и метод GET
Задумаемся на минуту, что же происходит, когда мы набираем в браузере строку
somestring и нажимаем . Браузер посылает серверу запрос somestring?
Нет, конечно. Все немного сложнее. Он анализирует строку, выделяет из нее имя
сер-
вера и порт (а также имя протокола, но нам это сейчас не интересно),
устанавливает
соединение с Web-сервером по адресу сервер:порт и посылает ему что-то типа сле-
дующего:
GET somestring HTTP/1.0\n
Глава 2. Интерфейс CGI 31
...другая информация...
\n\n
Здесь \n означает символ перевода строки, а \n\n — два обязательных символа но-
вой строки, которые являются маркером окончания запроса (точнее, окончания
заго-
ловков запроса). Пока мы не пошлем этот маркер, сервер не будет обрабатывать
наш
запрос.
Как видим, после GET-строки могут следовать и другие строки с информацией, раз-
деленные символом перевода строки. Их обычно формирует браузер. Такие строки
называются заголовками (headers), и их может быть сколько угодно. Протокол HTTP
как раз и задает правила формирования и интерпретации этих заголовков.
Вот мы и начинаем знакомство с протоколом HTTP. Как видите, он представляет со-
бой ни что иное, как просто набор заголовков, которыми обмениваются сервер и
браузер, и еще пару соглашений насчет метода POST, которые мы вскоре рассмотрим.
Не все заголовки обрабатываются сервером — некоторые просто пересылаются за-
пускаемому сценарию с помощью переменных окружения. Переменные окружения
представляют собой именованные значения параметров, которые операционная сис-
тема (точнее, процесс-родитель) передает запущенной программе. Программа может
с помощью специальных функций (их мы рассмотрим в следующей главе на приме-
рах) получить значение любой установленной переменной окружения, указав ее имя.
Именно так и должен поступать CGI-сценарий, когда захочет узнать значение того
или иного заголовка запроса. К сожалению, набор передаваемых сценарию заголов-
ков ограничен стандартами, и некоторые заголовки нельзя получить из сценария
ни-
каким способом (ему просто недоступна соответствующая переменная окружения).
Такие случаи мы будем оговаривать особо.
Если быть до конца честным, то все-таки системный администратор может на-
строить сервер так, чтобы он посылал сценарию и те заголовки, которые по
стандарту не передаются. Однако это выходит далеко за рамки Web-
программирования, поэтому мы
|
|