Поиск по этому блогу

среда, 22 июня 2011 г.

CGI на Lazarus с использованием fcl-web

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. Работа с сессиями. Пример есть. Потестировать.

Итого. Вполне работоспособно, быстро.