Лек_05_CGI.ppt
- Количество слайдов: 34
Примеры скриптов shell (UNIX) 1. #! /bin/sh echo Content-type: text/plain echo Результат выполнения # End of script 1
2. #! /bin/bash echo Content-type: text/plain echo $REQUEST_METHOD echo $QUERY_STRING echo $CONTENT_TYPE echo $CONTENT_LENGTH # end of script 2
На Си printf (“Content-type: text/htmlnn”); printf (“<HTML><head><title>”); printf (“Заголовок страницы</title>n”); printf (“<body>n”); printf (“Текст ответа 1”): printf (“Текст ответа 2”): printf (“Текст ответа 3”): printf (“</body></html>n”); 3
Вначале необходимо включить библиотеку # include <stdlib. h> Она содержит функции для разбора строки параметров, поступивших от формы скрипту. 4
Способ 1. int *L_s; int cnl; L_s = getenv (“CONTENT_LENGTH”); • Получение длины входного потока в символическом виде. sscanf (L_s, “%d”, &cnl); • Конвертирование длины в число. Функция sscanf () требует, чтобы её аргументами были указатели, а не имена. 5
char str [1024]; fgets (str, cnl, stdin); Получение входных данных из входного потока и занесение их в буфер str. 6
Способ 2 int cl; int atoi (const char *str_val); • Функция atoi() преобразует строку, указанную аргументом, в число целого формата. cl = atoi (getenv(“CONTENT_LENGTH”)); char QBuf[1024]; for (i=0; i < cl; i++) { QBuf[i] = (char) fgetc (stdin); } • Посимвольное считывание данных 7
• Можно сделать и так: char *p. R_M; p. R_M = getenv (“REQUEST_METHOD”); if (strcmp(p. R_M, “GET”)) {……………. . } • Далее идет обработка: “&” – для разделения пар; “=” – для выделения имен полей формы и их значений. 8
Delphi I. Непосредственно 1. Открыть как в Паскале потоки ввода/вывода: Reset (Input); Rewrite (Output); 9
2. Чтение и запись стандартными процедурами ввода/вывода Read (), Readln () Write (), Writeln () File. Read (), File. Write () • Кроме того, необходимо не забыть про Assign. File (F, S); • Назначить имени файла S дескриптор файла F. 10
3. Для получения значений переменных окружения надо применить функцию API Windows Get. Enviroment. Variable (PChar(Name), Buffer, Size. Of(Buffer)); • Здесь Name – имя переменной окружения, Buffer – буфер для значения переменной. 11
Эта функция возвращает: - число записанных символов в буфер, не включая терминальный нулевой символ; - если имя переменной не найдено, то возвращается ноль; - если размер буфера мал, то она возвращает необходимый размер для её сохранения. 12
Например I : = Get. Enviroment. Variable (‘QUERY_STRING’, nil, 0); • Первоначально мы не знаем, сколько байтов находятся в переменной QUERY_STRING. Get. Mem (P, I + 3); • Забираем память для переменной QUERY_STRING с запасом (выравниваем на 4 байта). P – указатель на область памяти. 13
I : = Get. Enviroment. Variable (‘QUERY_STRING’, P, I); • Здесь в качестве размера буфера указывается значение I. • Данные из QUERY_STRING заносятся в буфер по адресу P. 14
II. Через объекты 1. Выбрать в главном меню Delphi File -> New -> в коллекции шаблонов шаблон Web. Server. Application. 2. Из нескольких типов серверов выбрать тип сервера CGI Stand-alone executable для создания exe модулей. 15
3. В Инспекторе объектов выбрать компоненту TWeb. Module и вызвать редактор свойства Action. Добавить в список одну его операцию Action. В Инспекторе объектов тут же появится её свойства. 4. Заменить значения свойств: Path. Info на test, а Default на True. 16
5. Перейти в Инспектор объектов на страницу Events и дважды щелкнуть кнопкой мыши в поле объекта on. Action. 6. В появившейся заготовке метода набрать текст скрипта, то есть процедуру TWeb. Module 1. 7. Откомпилировать и поместить скрипт в каталог, где для Веб-сервера должны находиться скрипты. 17
В заготовке будет процедура TWeb. Module 1 Web. Action. Item 1 Action ( Sender: Tobject; Request: TWeb. Request; Response: TWeb. Response; var Handler: Boolean); На уровне разработки программ интерфейс с данными не зависит от типа приложения (стандартный CGI или Windows CGI) и является закрытым для разработчика. 18
• В заготовке процедуры можно ввести, в качестве примера, такой тест: var Str_Data: TString. List; Str 1: string; • Переменная Str_Data для приема данных, а Str 1 – для вспомогательных целей при выводе. begin Str_Data : = TString. List. Create; • Создаем объект Str_Data типа TString. List, в которой будут все данные формы. 19
В переменной Str_Data все строки будут иметь вид: Name = Value где Name – имя поля; Value – значение поля. Для проверки методов передачи данных надо проверить значения mt. GET, mt. POST, mt. HEAD, используя свойства Method. Type объекта Request. 20
if Request. Method. Type = mt. POST then Request. Extract. Content. Fields (Str_Data) else if Request. Method. Type = mt. GET then Request. Extract. Query. Fields (Str_Data) else { Str_Data. Free; Exit; • Если ни один из двух методов не подошел, то мы очищаем память от этого объекта } 21
• Для извлечения значений полей надо применять свойства Str_Data. Values[‘Name’] = ‘Значение’ Здесь Str_Data. Values[‘Name’] выделяет значение поля или кнопки по имени поля Name, ‘Значение’ – с чем надо сравнивать. 22
Для помещения данных при формировании ответа применяется переменные объекта Response. • Для вида ответа: Response. Content. Type : = ‘text/html’; (или text/plain). Для самого ответа свойство Content, которое будет содержать полный текст выходного документа. Здесь можно использовать вспомогательные документы и переменные. 23
Response. Content : = “<html><head><title>” + ”Это CGI скрипт на Delphi” + “</title></head>” + <body> Текст ответа” + Str 1 + “Еще текст </body></html>”; • В конце модуля должна быть очистка памяти от мусора Str_Data. Free; 24
Настройка Apache-сервера 1. 3. 3 I. Инсталляция сервера - стандартная II. Файлы конфигурации (в каталоге conf) 1. Файл srm. conf а) ищется переменная Script. Alias: #Script. Alias /cgi-bin/ "d: /Apache/cgi-bin" где d: /Apache/cgi-bin – физический каталог, определяется при инсталляции. 25
Необходимо: - проверить соответствие реального каталога с тем, что написан в данной строке ; - убрать комментарий с этой строки. 26
б) ищется переменная Add. Handler: #Add. Handler cgi-script. cgi где. cgi – указывает, какие расширения считаются скриптами - добавить. exe, можно писать: . cgi. exe или. cgi, . exe - раcкомментировать данную строку. 27
2. Файл httpd. conf Ищется переменная Server. Name: #Server. Name new. host. name Необходимо: - раскомментировать строку; - установить DNS-имя вашей машины в сети или localhost. Например, Server. Name http: //localhost 28
Для Web-сервера Apache версии 1. 3. 6. и выше все настройки находятся в одном файле - httpd. conf. 29
Работа с Web-сервером: - запустить Web-сервер Apache; - в строке браузера «location» набрать http: //localhost/; - если в окне браузера появляется информация о сервере, следовательно, Web-сервер Apache работает. 30
- если компьютер подключен к Internet- сети и при отладке Ваших CGI- скриптов запрашивает Internet, то необходимо отключить прокси-сервер для Вашего браузера. Для этого в браузере IE необходимо пройти цепочку команд: - Настройка; - Свойства обозревателя; - Подключения; - Кнопка «Настройка сети» ; 31
- Включить кнопку «Использовать прокси - сервер» ; Нажать кнопку «Дополнительно» ; В поле «Не использовать прокси-сервер для адресов, начинающихся с» ввести « 127. 0. 0. 1; localhost» 32
В браузере Firefox надо проделать следующую цепочку операций: -Инструменты; -Настройка; -Закладка «Основные» ; -Кнопка «Пареметры соединения» ; -Флажок «Настройка прокси вручную» ; - В поле «Не использовать прокси для» проставить те же адреса, что и для IE. 33
В браузере Opera надо проделать следующую цепочку операций: - Инструменты; - Настройка; - Дополнительно; - Сеть; - Прокси-серверы; - Включить флажок «Не использовать прокси для» ; - В поле проставить те же адреса, что и для IE. 34
Лек_05_CGI.ppt