
- •Типи веб - додатків
- •Розділ 20 Розробка інтернет-додатків
- •Рядок переданих параметрів
- •Методи передачі та отримання рядки параметрів
- •Зчитування рядка параметрів методом get
- •Зчитування рядка параметрів методом post
- •Отримання додаткової інформації
- •Компонент tWebModule
- •Параметр Request
- •Параметр Response
- •Події компонента tWebModule
- •Завдання дій, оброблювальних запити клієнта
Зчитування рядка параметрів методом post
При використанні методу POST рядок параметрів зчитується зі стандартного потоку введення. При цьому слід виконувати зчитування саме такої кількості символів, яке міститься в переданої рядку - спроба вважати більше символів, ніж є, призведе до «зависання» програми. Якщо ж рахувати не всі символи, то частина інформації буде втрачена. Для реалізації процедури зчитування даних з стандартного потоку введення найпростіше використовувати стандартну процедуру read мови Pascal. Кількість символів, які потрібно вважати, передається через змінну оточення CONTENT_LENGTH. Таким чином, при використанні методу POST фрагмент програми, що виконує зчитування рядка параметрів, виявляється складніше, так як вимагає двох процедур: звернення до змінної оточення і зчитування даних з стандартного потоку введення:
varbuff: PChar:
ContentLength.i: Integer:
Stl: String:
C: Char:
begin/ / Виділяємо пам'ять під рядок PChar для зчитування / / даних з змінної оточення CONTENT_LENGTH GetMemCbuff, 50):
/ / Прочитуємо дані із змінної / / оточення CON TEN T_L Е NGTH GetEnvironmentVariablet'CONTENT_LENGTH '. Buff.50);
/ / Перетворимо рядок в число ContentLength: = StrToInt (StrPas (buff)):
/ / Звільняємо виділену пам'ять FreeMem (buff):
/ / Прочитуємо ContentLength зі стандартного потоку введення Stl: - ":
for i:-l to ContentLength do begin Read (C):
Stl: = Stl + C: end;
end:
Отримання додаткової інформації
При розробці CGI-сценаріїв можна використовувати і ряд інших змінних оточення, через які веб-сервер передає додаткову інформацію про користувача, запустити сценарій. Ряд змінних оточення, які містять найбільш важливу інформацію, наведено в табл. 20.1.Перед отриманням рядки параметрів звичайно треба перевірити, який метод передачі інформації використаний. Це забезпечить правильність зчитування передається інформації в будь-якому випадку.
Таблиця 20.1. Основні змінні оточення |
|
Назва |
Опис |
REQUEST_METHOD |
Метод передачі інформації (GET або POST)
|
SERVER_NAME |
IP-адрес або ім'я сервера |
SERVER_PORT |
Номер порту, який використовується при зверненні до сервера |
SERVER_PROTOCOL |
Назва і версія протоколу, за яким був переданий запит |
PATHJNFO |
Рядок параметрів, розташована в запиті після імені сценарію, але до даних запиту |
REMOTE_ADDR |
IP-адреса вузла, з якого був посланий запит |
REMOTE_HOST |
Доменне ім'я вузла, з якого надійшов запит |
Проілюструємо це на прикладі. Об'єднаємо наведені вище фрагменти програм таким чином, щоб забезпечити коректне отримання даних будь-яким методом. В якості результату роботи сценарію виведемо ім'я використовуваного метода і отриманий рядок параметрів:
program console;
{SAPPTYPE CONSOLE}
{$E CGI}
uses
SysUtils.Windows;
var
buff: PChar;
ContentLength.i: Integer;
Stl,St2: String:
C: Char;
begin GetMem(buff.50);
GetEnvironmentVariablet'REQUEST_METHOD'.buff.50):
Stl:-StrPas(buff);
FreeMem(buff): i:=Length(Stl): while i>0 do begin
Stl[i]:=UpCase(Stl[i]):
dec(i)
end;
if Stl='GET' then begin GetMem(buff,200);
GetEnvironmentVari’able( 'QUERY_STRING' .buff ,200);
St2:=StrPas(buff):
FreeMem(buff): end:
if St1='POST' then begin GetMem(buff,50):
GetEnvironmentVariable('CONTENT_LENGTH'.buff,50);
St2:=StrPas(buff);
FreeMem(buff);
Content Length : =St гТо I nt ( St 2 ) :
St2: = ";
for i:=1 to ContentLength do begin Read(C):
St2:=St2+C:
end:
end:
Stl:=‘Method '+Stl:
Stl:='<H2 ALIGN=CENTER>’+Stl+'</H2>':
St2:='Query string: '+St2:
St2:='<H2 ALIGN=CENTER>'+St2+'</H2>'; writeln('Content-Type: text/html'): writeln;
writeln('<HTML>'): writeln('<HEAD>'):
writeln( '<TITLE>npnMep СС1-приложениж/Т1ТЕЕ>’ ) : writeln('</HEAD>'): writeln('<B0DY>');
writeln('<H2 ALIGN=CENTER>Hel1 о. World!</H2>');
writeln(Stl) :
writeln(St2) ;
writeln('</B0DY>'):
writeln('</HTML>');
end.
Для перевірки працездатності наведеної програми створимо HTML-документ, що містить дві форми, що розрізняються лише способом передачі інформації. Щоб не ускладнювати приклад, розмістимо на формі тільки два елементи управління - кнопку SUBMIT і поле введення. Текст HTML-документа в цьому випадку буде виглядати приблизно так:
<HTML>
<HEAD>
<TITLE> Пример CGI-приложения </TITLE>
</HEAD>
<B0DY>
<H2> Метод GET </H2>
<F0RM METHOD="GET" ACTION="/scripts/console.cgi">
<1NPUT TYPE=''TEXT" NAME=''Editl" VALUE="Test"><BR><BR>
<1NPUT TYPE=''SUBMIT">
</F0RM>
<BR><BR>
<H2> Метод POST </H2>
<F0RM METH0D="P0ST" ACTION="/scripts/console.cgi">
<1NPUT TYPE="TEXT" NAME="Editl" VALUE="Test"><BR><BR>
<1NPUT TYPE="SUBMIT">
</F0RM>
</B0DY>
</HTML>
Нагадаємо, що даний документ повинен називатися default.htm і розташовуватися в каталозі Wwwroot, а відкомпільований файл CGI-сценарію - в каталозі Scripts.Якщо тепер запустити веб-браузер і набрати в адресному рядку ім'я вашого комп'ютера (localhost або 127.0.0.1), то у вікні браузера відобразиться документ. При натисканні на кнопці SUBMIT, що відноситься до форми, що використовує метод GET, у вікні браузера відобразиться документ, а при натисканні на кнопці, що відноситься до форми, що використовує метод POST – документ.
Зверніть увагу, що в другому випадку (при використанні методу POST), в полі введення було введено кириличний текст. В отриманій рядку параметрів всі символи кирилиці закодовані три символьними послідовностями.
Розглянутий приклад дозволяє лише отримати рядок параметрів в CGI-сценарії. Як правило, цього недостатньо. Отриманий рядок необхідно декодувати і потім обробити дані користувача. Така задача досить проста і може бути вирішена без використання яких-небудь спеціальних засобів.
Розробка веб-додатків спеціальними засобами Delphi
Отже, в попередніх розділах цього розділу нами були розглянуті основні питання розробки CGI-додатків, включаючи:
□ передачу інформації від клієнта CGI-сценарієм;
□ особливості отримання цієї інформації в CGI-додатку в залежності від використовуваного методу передачі;
□ формування сценарію відповіді, що посилається клієнтові.
При розгляді цих питань був приведений ряд простих прикладів створення CGI-додатків на мові Object Pascal. В принципі, на базі цієї інформації можна виконати розробку CGI-сценарію для будь-якої операційної системи на будь-якій мові програмування. Це пов'язано з тим, що способи передачі та отримання даних користувача скрізь абсолютно однакові. Однак використання спеціалізованих засобів дозволяє в значній мірі спростити розробку веб-додатків, особливо в тих випадках, коли здійснюється розробка додатків для роботи з базами даних.