delphi自动生成资源的REST CRUD工具
delphi自动生成资源的REST CRUD工具
该工具同样,还可以将资源生成GOOGLE PROTOBUF CRUD。
运行tableTool.exe工具,设置参数,连接数据库。

以“计量单位”资源为例,选择“tunit”数据表,点击“查询”按钮,点击“生成REST CRUD”按钮,点击“保存成文件”按钮,选择中间件源码所在目录,文件名就用自动生成的。

查看生成的rest.tunit.pas
unit rest.tunit;
//代码由代码工厂自动生成
//2022-07-10
{$I def.inc}
interface
uses
{$IFDEF firedac} db.firedac, db.firedacPool, {$ENDIF}
{$IFDEF unidac}db.unidac, db.unidacpool, {$ENDIF}
classes, db,
system.JSON.Serializers, yn.log, system.JSON, SysUtils, json.help;
type
Ttunit = record
[Serialize(1)] unitid: string;
[Serialize(2)] unitname: string;
end;
TtunitArray = record
[Serialize(1)] status: integer;
[Serialize(2)] exception: string;
[Serialize(3)] message: string;
[Serialize(4)] tunits: TArray<Ttunit>;
end;
TRes = record
[Serialize(1)] status: integer;
[Serialize(2)] exception: string;
[Serialize(3)] message: string;
end;
function select(url: string; body: TBytes): string;
function insert(url: string; body: TBytes): string;
function update(url: string; body: TBytes): string;
function delete(url: string; body: TBytes): string;
implementation
function select(url: string; body: TBytes): string;
var
db: tdb;
pool: tdbpool;
arr: TArray<string>;
serial: TJsonSerializer;
rows: TtunitArray;
i, h: integer;
res: TRes;
begin
serial := TJsonSerializer.Create;
try
try
arr := url.Split(['/']);
pool := GetDBPool(arr[4]);
db := pool.Lock;
db.qry.Close;
db.qry.SQL.Clear;
db.qry.SQL.Text := 'select * from tunit';
db.qry.Open;
SetLength(rows.tunits, db.qry.RecordCount);
db.qry.First;
i := 0;
while not db.qry.Eof do
begin
rows.tunits[i].unitid := db.qry.fieldbyname('unitid').asstring;
rows.tunits[i].unitname := db.qry.fieldbyname('unitname').asstring;
rows.status := 1;
rows.message := 'success';
inc(i);
db.qry.Next;
end;
result := serial.Serialize<TtunitArray>(rows);
except
on E: Exception do
begin
res.status := 0;
res.exception := E.message;
result := serial.Serialize<TRes>(res);
end;
end;
finally
pool.Unlock(db);
serial.Free;
end;
end;
function insert(url: string; body: TBytes): string;
var
db: tdb;
pool: tdbpool;
arr: tarray<string>;
serial: TJsonSerializer;
res: TRes;
begin
serial := TJsonSerializer.Create;
try
try
var rows: TtunitArray;
rows := serial.Deserialize<TtunitArray>(TEncoding.UTF8.GetString(body));
arr := url.Split(['/']);
pool := GetDBPool(arr[4]);
db := pool.Lock;
db.startTrans;
for var row: Ttunit in rows.tunits do
begin
db.qry.Close;
db.qry.SQL.Clear;
db.qry.SQL.Text := 'insert into tunit (unitid,unitname) values (:unitid,:unitname)';
db.qry.ParamByName('unitid').AsString := row.unitid;
db.qry.ParamByName('unitname').AsString := row.unitname;
db.qry.ExecSQL;
end;
db.commitTrans;
res.status := 1;
res.message := 'success';
Result := serial.Serialize<TRes>(res);
except
on E: Exception do
begin
db.rollbackTrans;
res.status := 0;
res.exception := E.Message;
Result := serial.Serialize<TRes>(res);
end;
end;
finally
pool.Unlock(db);
serial.Free;
end;
end;
function update(url: string; body: TBytes): string;
var
db: tdb;
pool: tdbpool;
arr: tarray<string>;
serial: TJsonSerializer;
res: TRes;
begin
serial := TJsonSerializer.Create;
try
try
var rows: TtunitArray;
rows := serial.Deserialize<TtunitArray>(TEncoding.UTF8.GetString(body));
arr := url.Split(['/']);
pool := GetDBPool(arr[4]);
db := pool.Lock;
db.startTrans;
for var row: Ttunit in rows.tunits do
begin
db.qry.Close;
db.qry.SQL.Clear;
db.qry.SQL.Text := 'update tunit set unitid=:unitid,unitname=:unitname where unitid=:key0';
db.qry.ParamByName('unitid').AsString := row.unitid;
db.qry.ParamByName('key0').AsString := row.unitid;
db.qry.ParamByName('unitname').AsString := row.unitname;
db.qry.ExecSQL;
end;
db.commitTrans;
res.status := 1;
res.message := 'success';
Result := serial.Serialize<TRes>(res);
except
on E: Exception do
begin
db.rollbackTrans;
res.status := 0;
res.exception := E.Message;
Result := serial.Serialize<TRes>(res);
end;
end;
finally
pool.Unlock(db);
serial.Free;
end;
end;
function delete(url: string; body: TBytes): string;
var
db: tdb;
pool: tdbpool;
arr: tarray<string>;
serial: TJsonSerializer;
res: TRes;
begin
serial := TJsonSerializer.Create;
try
try
arr := url.Split(['/']);
pool := GetDBPool(arr[4]);
db := pool.Lock;
db.qry.Close;
db.qry.SQL.Clear;
db.qry.SQL.Text := 'delete from tunit where unitid=:key0';
db.qry.ParamByName('key0').AsString := arr[5];
db.qry.ExecSQL;
res.status := 1;
res.message := 'success';
Result := serial.Serialize<TRes>(res);
except
on E: Exception do
begin
res.status := 0;
res.exception := E.Message;
Result := serial.Serialize<TRes>(res);
end;
end;
finally
pool.Unlock(db);
serial.Free;
end;
end;
end.
到sock.router.pas增加路由方法。

运行服务端

clientRest客户端uses rest.tunit;
rest.tunit是工具自动生成的。
增加CRUD代码
procedure TForm1.Button1Click(Sender: TObject);
//新增json
begin
var t: rest.tunit.TtunitArray;
SetLength(t.tunits, 1);
t.tunits[0].Unitid := '10';
t.tunits[0].Unitname := '新增';
var res: string := TRest.inJson<rest.tunit.TtunitArray>('/rest/unit/insert/1', t);
var r: TRes := TRest.unmarshal<TRes>(res);
if r.Status = 0 then
ShowMessage('err: ' + r.Exception)
else
ShowMessage('ok');
end;
procedure TForm1.Button3Click(Sender: TObject);
//修改json
begin
var t: rest.tunit.TtunitArray;
SetLength(t.tunits, 1);
t.tunits[0].Unitid := '10';
t.tunits[0].Unitname := '修改';
var res: string := TRest.inJson<rest.tunit.TtunitArray>('/rest/unit/update/1', t);
var r: TRes := TRest.unmarshal<TRes>(res);
if r.Status = 0 then
ShowMessage('err: ' + r.Exception)
else
ShowMessage('ok');
end;
procedure TForm1.Button5Click(Sender: TObject);
//json查询
begin
var t: rest.tunit.TtunitArray := TRest.outJson<rest.tunit.TtunitArray>('/rest/unit/select/1');
if t.Status = 0 then
begin
ShowMessage(t.Exception);
Exit;
end;
FDMemTable1.EmptyDataSet;
FDMemTable1.DisableControls;
for var dw: rest.tunit.Ttunit in t.tunits do
FDMemTable1.AppendRecord([dw.Unitid, dw.Unitname]);
FDMemTable1.First;
FDMemTable1.EnableControls;
end;
procedure TForm1.Button7Click(Sender: TObject);
//删除json
begin
var res: string := TRest.inUrl('/rest/unit/delete/1/10');
var r: TRes := TRest.unmarshal<TRes>(res);
if r.Status = 0 then
ShowMessage('err: ' + r.Exception)
else
ShowMessage('ok');
end;

运行tableTool.exe生成REST接口的在线文档

unit server.Resources.tunit;
//代码由代码工厂自动生成
//2022-07-10
interface
uses
System.SysUtils, WiRL.Core.Registry, WiRL.Core.Attributes, WiRL.Core.MessageBody.Default,
WiRL.http.Accept.MediaType;
type
Ttunit = record
[Serialize(1)] unitid: string;
[Serialize(2)] unitname: string;
end;
TtunitArray = record
[Serialize(1)] status: integer;
[Serialize(2)] exception: string;
[Serialize(3)] message: string;
[Serialize(4)] tunits: TArray<Ttunit>;
end;
TRes = record
[Serialize(1)] status: integer;
[Serialize(2)] exception: string;
[Serialize(3)] message: string;
end;
[Path('tunit')]
TtunitAPI = class
[post, path('/select/{dbid}'), Produces(TMediaType.APPLICATION_JSON)]
function select([PathParam('dbid')] dbid: string): TtunitArray; virtual; abstract;
[post, path('/insert/{dbid}'), Consumes(TMediaType.APPLICATION_JSON), Produces(TMediaType.APPLICATION_JSON)]
function insert([PathParam('dbid')] dbid: string; [BodyParam] body: TtunitArray): TRes; virtual; abstract;
[post, path('/update/{dbid}'), Consumes(TMediaType.APPLICATION_JSON), Produces(TMediaType.APPLICATION_JSON)]
function update([PathParam('dbid')] dbid: string; [BodyParam] body: TtunitArray): TRes; virtual; abstract;
[post, path('/delete/{dbid}/{unitid}'), Produces(TMediaType.APPLICATION_JSON)]
function delete([PathParam('dbid')] dbid: string; [PathParam('unitid')] unitid: string): TRes; virtual; abstract;
end;
implementation
initialization
TWiRLResourceRegistry.Instance.RegisterResource<TtunitAPI>;
end.
openApi工程中添加上面用工具生成的单元

编译,运行openApi.exe


本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/16463072.html

浙公网安备 33010602011771号