Doplním starší příspěvek DMVC o jednohubku jako je ukázka jednoduchého předání dat a založení dat. Po přečtení první části doplníme náš REST server o POST, tj. vytvoření záznamu.
type
[MVCNameCase(ncLowerCase)]
TTown = class
private
FName: string;
FPostCode: string;
public
[MVCSwagJsonSchemaField('name', 'town name', True, False)]
property Name: string read FName write FName;
[MVCSwagJsonSchemaField('postcode', 'post code', True, False)]
property PostCode: string read FPostCode write FPostCode;
end;
[MVCPath('/town')]
[MVCSwagAuthentication(atJsonWebToken)]
TCtrlTown = class(TMVCController)
public
[MVCPath('/($Id)')]
[MVCHTTPMethod([httpGET])]
{$IFNDEF DEBUG} [MVCRequiresRole('role1')] {$ENDIF}
[MVCSwagSummary('Town section', 'Town by Id', 'GetTown')]
[MVCSwagParam(plPath, 'Id', 'Town id', ptInteger)]
[MVCSwagParam(plQuery, 'params', 'Params', ptString)]
[MVCSwagResponses(200, 'Success', TTown)]
[MVCSwagResponses(401, 'Unauthorized')]
[MVCSwagResponses(500, 'Internal Server Error')]
procedure GetTown(const Id: Integer);
{$IFNDEF DEBUG} [MVCRequiresRole('role1')] {$ENDIF}
[MVCDoc('create Town and return "201: Created"')]
[MVCPath('/')]
[MVCHTTPMethod([httpPOST])]
[MVCSwagSummary('Town section', 'Item create', 'CreateItem')]
[MVCSwagParam(plBody, 'town', 'TownObject object', TTown, ptNotDefined, True, ' { "name": "Zlín", "postcode":"76340" }')]
[MVCSwagResponses(201, 'Success, Data get new created ID')]
[MVCSwagResponses(405, 'Failed')]
[MVCSwagResponses(500, 'Internal Server Error')]
procedure CreateItem();
end;
uses
MVCFramework.Controllers.Register, SysUtils;
procedure TCtrlTown .CreateItem;
var
r: TTown;
begin
r := Context.Request.BodyAs<TTown>;
if (r.PostCode = '') then
raise Exception.Create('Missing PostCode ');
// get connection from connection pool
// update data
Self.Render201Created;
// free connection
end;
Implementace je opravdu jednoduchá: první řádek říká, ať DMVC namapuje předaný JSON na rekord TTown a to přes property. Co s tím záznamem uděláte je úplně jedno. Pozor je uveden atribut ncLowerCase, tj. položky v JSON budou lowercase.
Inkriminovaný JSON pak vypadá
{"name": "Zlín", "postcode":"76340" }
a ve swaggeru je pak nový end point
Žádné parsování atd., jen pár řádků. Stejně to jde pro PUT (update), resp DELETE (smazání).