Aktualizace: lepší variantou je Delphi MVC
Nedávno jsem narazil na Express, jednoduchý REST framework pro Delphi jako rozšíření webbroker. Knihovna se skládá z pouhých tří souborů, ale výsledek je celkem flexibilní.
Pokud máte webbroker aplikaci, tak jen pro výchozí akci přidáte přesměrování volání.
implementation
uses
Express;
procedure TWebModule2.WebModule2DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
App.Call(Request, Response); <-----------
end;
Zbytek se definuje pomocí atributů třídy a zpracovává se díky RTTI (což mimochodem automaticky znamená unicode verze). Vezmu rozšířený příklad z dokumentace
type
TContent = record
Name: String;
SurName: String;
end;
TContent2 = record
data: array of TContent;
end;
TResult = record
Success: Boolean;
end;
[Location('api/test')] // this optional
TTest = class(TProvider)
public
[GET] [DEFAULT] // default attribute is optional.
function Multiply(A, B: Integer): Integer;
[GET]
function TestSimpleRecord:TContent;
[GET]
function TestRecord:TContent2;
[DELETE] [DEFAULT]
function Del(Id: Integer): TResult;
[POST] [DEFAULT]
function Insert(Id: Integer; Content: TContent): TResult; // Content is optional
[PUT] [DEFAULT]
function Update(Id: Integer; Content: TContent): TResult; // Content is Optional
end;
A pak už jen implementace některých zajímavých metod, výsledek volání framework automaticky mapuje na JSON.
function TTest.Multiply(A, B: Integer): Integer;
begin
Result := A * B;
end;
function TTest.TestSimpleRecord: TContent;
begin
Result.Name := 'John';
Result.SurName := 'Hove';
end;
function TTest.TestRecord: TContent2;
begin
SetLength(Result.data, 2);
Result.data[0].Name := 'AAAAA';
Result.data[0].SurName := 'BBBBB';
Result.data[1].Name := 'CCCCC';
Result.data[1].SurName := 'DDDDDDDD';
end;
………..
initialization
TClassManager.Register(TTest);
To je vše.
Volání je pak např. http://adresa/api/test/Multiply/10/20 nebo http://adresa/api/test/TestRecord, což vrátí v našem případě
{"data":[{"Name":"AAAAA","SurName":"BBBBB"},{"Name":"CCCCC","SurName":"DDDDDDDD"}]}
Samozřejmě knihovna má větší možnosti viz domovská stránka, mně se nejvíce líbí ta jednoduchost.