CGI на Lazarus с использованием fcl-web
Lazarus 0.9.30 FPC 2.4.2 fcl-web (ставила только weblaz.lpk rev.15359)грузим отсюда http://code.google.com/p/qxpascal/downloads/list свежую библиотеку
ставим пакет
прим. по умолчанию этот проект включен в Лазаря, но его необходимо скомпилировать
Файл - Создать - Приложение CGI
Actions
предположим, наше приложение должно реагировать на следующие действия:
create
read
update
delete
(CRUD)
URL для обращения к определенному действию будет выглядеть так:
http://127.0.0.1/mycgi.exe/user?action=delete
Топаем в свойства нашего Web Modul'я, в строке ActionVar пишем action, жмем на кнопку рядом с надписью "0 items".
Добавляем новые элементы и определяем их имена. Если хотите, чтобы это действие выполнялось по умолчанию, можно поставить свойство Default=true.
Переходим к событиям. Мы должны определить onRequest.
// url - http://10.48.0.27:8081/cgi/simpl.exe/user?action=create
procedure TFPWebModule1.TFPWebActions0Request(Sender: TObject;
ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
var
RespStr: TStringList;
begin
// create
RespStr := TStringList.Create;
try
RespStr.Add(' Вы реально хотите создать ?');
// отправим обычный текст
AResponse.ContentType := 'text/plain; charset=UTF-8';
AResponse.Content := RespStr.Text;
Handled := true;
finally
RespStr.Free;
end;
end;
В самих исходниках fcl-web'а есть файл webutil.pp в этом файле делается
полный разбор всевозможных параметра запроса (Request)
вызывается эта процедура тоже просто
DumpRequest(ARequest,S); // Analyze request.
в ответ предоставляя табличку с переменными GET, POST, данными из заголовка и прочая
пример лежит в \Lazarus\components\fpweb\demo\echo\echo.lpr
этим кодом и воспользуемся, чтобы сделать тестовый вывод.
uses webutil; // включаем модуль
создаем новый экшн "dump", пишем DumpRequest(ARequest,S);
Что не получилось?
Не получилась передача данных через поток. (((
Показалось странным.
unit fphttp;
THTTPContentProducer = Class(TComponent)
вот такой кусок кода
procedure THTTPContentProducer.DoHandleRequest(ARequest: TRequest;
AResponse: TResponse; Var Handled : Boolean);
Var
M : TMemoryStream;
begin
FResponse:=AResponse;
M:=TMemoryStream.Create;
DoGetContent(ARequest,M,Handled);
AResponse.ContentStream:=M;
end;
строки M.Free я ни где не нашла. ( либо в private/public M надо было объявлять... загадка
To-Do. Работа с сессиями. Пример есть. Потестировать.
Итого. Вполне работоспособно, быстро.
Lazarus 0.9.30 FPC 2.4.2 fcl-web (ставила только weblaz.lpk rev.15359)грузим отсюда http://code.google.com/p/qxpascal/downloads/list свежую библиотеку
ставим пакет
прим. по умолчанию этот проект включен в Лазаря, но его необходимо скомпилировать
Файл - Создать - Приложение CGI
Actions
предположим, наше приложение должно реагировать на следующие действия:
create
read
update
delete
(CRUD)
URL для обращения к определенному действию будет выглядеть так:
http://127.0.0.1/mycgi.exe/user?action=delete
Топаем в свойства нашего Web Modul'я, в строке ActionVar пишем action, жмем на кнопку рядом с надписью "0 items".
Добавляем новые элементы и определяем их имена. Если хотите, чтобы это действие выполнялось по умолчанию, можно поставить свойство Default=true.
Переходим к событиям. Мы должны определить onRequest.
// url - http://10.48.0.27:8081/cgi/simpl.exe/user?action=create
procedure TFPWebModule1.TFPWebActions0Request(Sender: TObject;
ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
var
RespStr: TStringList;
begin
// create
RespStr := TStringList.Create;
try
RespStr.Add(' Вы реально хотите создать ?');
// отправим обычный текст
AResponse.ContentType := 'text/plain; charset=UTF-8';
AResponse.Content := RespStr.Text;
Handled := true;
finally
RespStr.Free;
end;
end;
В самих исходниках fcl-web'а есть файл webutil.pp в этом файле делается
полный разбор всевозможных параметра запроса (Request)
вызывается эта процедура тоже просто
DumpRequest(ARequest,S); // Analyze request.
в ответ предоставляя табличку с переменными GET, POST, данными из заголовка и прочая
пример лежит в \Lazarus\components\fpweb\demo\echo\echo.lpr
этим кодом и воспользуемся, чтобы сделать тестовый вывод.
uses webutil; // включаем модуль
создаем новый экшн "dump", пишем DumpRequest(ARequest,S);
Что не получилось?
Не получилась передача данных через поток. (((
Показалось странным.
unit fphttp;
THTTPContentProducer = Class(TComponent)
вот такой кусок кода
procedure THTTPContentProducer.DoHandleRequest(ARequest: TRequest;
AResponse: TResponse; Var Handled : Boolean);
Var
M : TMemoryStream;
begin
FResponse:=AResponse;
M:=TMemoryStream.Create;
DoGetContent(ARequest,M,Handled);
AResponse.ContentStream:=M;
end;
строки M.Free я ни где не нашла. ( либо в private/public M надо было объявлять... загадка
To-Do. Работа с сессиями. Пример есть. Потестировать.
Итого. Вполне работоспособно, быстро.