DELPHI FAQ: Передача параметров


Передача параметров
Previous  Home  Next


Передача параметров
Методы GET и POST 
Существует по крайней мере два метода передачи параметров CGI-программе.  
<form method=GET action="program.exe"> 
<form method=POST action="program.exe"> 
Чтобы определить, каким именно методом CGI-программе переданы параметры, достаточно в вашей программе проверить переменную среды REQUEST_METHOD.  
 
Ниже привдена функция, с помощью которой можно получить значение переменной среды окружения:  
 
function getvar(varname:string):string
{$IFDEF LINUX} 
 begin 
  result:=getenv(PChar(varname)); 
 end
{$ELSE} 
 var 
  buffer:array[0..1024of char; 
  size:integer; 
 begin 
  size:=GetEnvironmentVariable(PChar(varname),buffer,sizeof(buffer)); 
  if size=0 then getvar:='' else getvar:=String(buffer); 
 end
{$ENDIF} 
 
Автор предпочитает работать не с массивами, а со строками, поэтому результат функции преобразовывается в строку...  
 
Теперь посмотрим, как определить значение переменной среды под DOS в .BAT файле:  
 
@ECHO OFF 
ECHO content-type: text/html 
ECHO. 
ECHO ^<HTML^>^<HEAD^>^<TITLE^>^</TITLE^>^</HEAD^>^<BODY^> 
ECHO REQUEST_METHOD=%REQUEST_METHOD% 
ECHO ^</BODY^>^</HTML^> 
 
Обратите внимание, что специальные символы, используемые в DOS (такие, как "<", ">", "&",...), необходимо предварять знаком "^".  
 
Таким образом, если мы обратимся к функции в виде GetVar('REQUEST_METHOD'), то получим в виде строки метод, которым были переданы параметры: 'GET' или 'POST'.  
 
Согласно Спецификации CGI, параметры могут быть прочитаны:  
·Из переменной окружения QUERY_STRING для метода GET  
·Из стандартного ввода (STDIN) с помощью процедуры ReadLn для метода POST  
 
Метод POST используется в тех случаях, когда необходимо передать большое количество параметров или большой объем данных. При использовании же метода GET для хранения всех передаваемых параметров используется переменная среды окружения, а она, как вы понимаете, не резиновая, так что ее максимального размера в некоторых случаях может не хватить...  
 

Метод GET и переменная QUERY_STRING 
Переменная среды окружения QUERY_STRING содержит список имен и значений параметров, переданных из формы... Но сначала рассмотри код HTML:  
 
<form method="GET" action="program.exe"> 
<input type=text name="toto" value="titi"> 
<input type=submit value="GO"> 
</form> 
 
Кликнув на "GO" (здесь кликать не надо, это просто пример!), вы запускаете на сервере программу "program.exe" передавая серверу запрос в виде:
http://www.ваш_сервер/cgi-bin/program.exe?toto=titi

Вы видите, что сразу за именем программы следует знак вопроса и передаваемый в программу параметр. В переменную QUERY_STRING как раз и будет помещено все, что находится после символа "?". Заметим, что точно так же можно задать параметры и в обычной ссылке:
<a href="http://www.ваш_сервер/cgi-bin/program.exe?toto=titi">...</a>

И последнее уточнение: если запрос содержит несколько параметров, то они отделяются друг от друга амперсандом &. Кроме того, некоторые символы в значениях параметров (например, "&") должны быть представлены в шестнадцатеричной форме %hh, где "hh" - шестнадцатеричный код символа в таблице ANSI. Например, символ амперсанда "&" должен быть представлен в виде "%26".

Представьте, что вам требуется на сайте yahoo.com найти результаты поиска по ключевым словам cgi и delphi, для чего в окне поиска вы вводите "cgi + delphi".
Тогда в результате вашего запроса будет сгенерирован следующий URL:
http://search.yahoo.com/bin/search?p=cgi+%2B+delphi
Тем самым, вы обратитесь к программе "search" и зададите значение параметра "p" равным "cgi + delphi", при этом символ "+" будет автоматически заменен браузером на "%2B", а пробелы - на "+".

Метод POST
Для получения данных, переданных по методу POST, необходимо читать данные из "устройства стандартного ввода" STDIN. Размер данных, переданных по этому методу, помещается сервером в переменную окружения CONTENT_LENGTH.
Посмотрим, как это выглядит в Delphi:

// Получение переданных параметров

  if
 getvar('REQUEST_METHOD'
)='POST'
 then
 begin

   parmstring:=getvar('CONTENT_LENGTH'
);
   if
 parmstring<>''
 then
 begin
    size:=strtoint(parmstring);
    setlength(parmstring,size);
    for
 i:=1 to size do read(parmstring[i]);
   end
;
  end
 else
   parmstring:=getvar('QUERY_STRING'
); 

В заключение я предлагаю вашему вниманию маленькую CGI-программу, которая просто выводит то, что происходит на сервере:

program log;

{$apptype console}


// прикручивание к Linux попробуйте сделать сами :)


uses

  windows, sysutils;

var

 i:integer;
 s:string
;
 p:pchar;

 flog:textfile;

begin

 assignfile(flog,'c:\temp\log.txt'
);
 rewrite(flog);

 WriteLn('Content-Type: text/html'
);
 WriteLn(''
);

 WriteLn('<html><head><title>Dump CGI</title></head><body>'
);
 WriteLn('<h1>Dump CGI:</h1>'
);
 WriteLn('<a href=#Parms>Параметры программы</a><br>'
);
 WriteLn('<a href=#Query>Параметры CGI</a><br>'
);
 WriteLn('<a href=#Env>Переменные окружения</a><br>'
);
 WriteLn('<a href=#Info>Дополнительная информация о CGI</a><br>'
);
 WriteLn('<hr>'
);

 WriteLn('<a name=Parms><h2>ParamCount='
,IntToStr(ParamCount),'</h2><ul>');
 WriteLn(fLog,'ParamCount='
,IntToStr(ParamCount));

  for
 i:=0 to ParamCount do begin
   WriteLn('<li>'
,ParamStr(i));
   WriteLn(fLog,'-'
,ParamStr(i));
  end
;

 // Стандартный Ввод

 WriteLn(fLog,'Input :'
);
 WriteLn('<h2>StdInput:</h2><ul>'
);
 if
 Not Eof(Input) then begin
  Read
(Input,s);
  WriteLn('<li>'
,s);
  WriteLn(fLog,s);
 end
;

 Writeln(fLog,'QUERY_STRING='
,ParmString);

 WriteLn('<a name=Env><h2>Переменные окружения:</h2><ul>'
);
 p:=GetEnvironmentStrings;
 while
 StrLen(p)<>0 do begin
  WriteLn('<li>'
,p);
  WriteLn(fLog,':'
,p);
  p:=strend(p);
  inc(p);
 end
;
 WriteLn('</ul><hr>'
);

 WriteLn('<a name=Info><a href="http://www.multimania.com/tothpaul">'
);
 WriteLn('Дополнительная информация о CGI</a>'
);
 WriteLn('</body></html>'
);

end
.

Примечание:
Кроме стандартного вывода информация параллельно выводится еще и в лог-файл.






DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100