Delphi MVC framework - 1

vložil Radek Červinka 14. října 2021 20:47

Je to už neuvěřitelných 7 let, kdy jsem se zmínil o Delphi MVC frameworku a musím říct, že když jsem tehdy říkal, že mi přijde jako nejprogresivnější tak jsem nelhal.

Od té doby zrobustněl, bylo přidáno spousta funkcí (jako podpora swaggeru, JWT autentizaci, JSON-RPC 2.0, Cors a desítky dalších), nebudu to tady vyjmenovávat, ale přímo odkáži na github.com/danieleteti/delphimvcframework. Součástí archívu je spousta dem. Výhodou je taky kompletní zdrojový kód.

Cílem dnešního článku je ukázat jak jednoduše vytvoříte základní službu (celý REST full je podobně jednoduchý) odpovídající na vaše pořadavky.

Nebudu vytvářet kompletní server, zakládní kostru vám vygeneruje průvodce, nebo použije některé z dem, třeba z adresare samples\swaggerdoc, ale raději ukážu konkrétní jednu službu.

    1unit uControlerTown;
    2
    3interface
    4
    5uses
    6  System.Generics.Collections,  db,
    7  MVCFramework,
    8  MVCFramework.Commons,
    9  MVCFramework.Swagger.Commons,
   10  MVCFramework.Serializer.Commons,
   11  MVCFramework.Middleware.Authentication.RoleBasedAuthHandler,
   12  MVCFramework.Nullables;
   13
   14const
   15  csServerService =  'DemoService';
   16
   17type
   18
   19  [MVCNameCase(ncLowerCase)]
   20  TTown = class
   21  private
   22    FName: string;
   23    FPostCode: string;
   24  public
   25    [MVCSwagJsonSchemaField('name', 'town name', True, False)]
   26    property Name: string read FName write FName;
   27    [MVCSwagJsonSchemaField('postcode', 'post code', True, False)]
   28    property PostCode: string read FPostCode write FPostCode;
   29  end;
   30
   31
   32
   33  [MVCPath('/town')]
   34  [MVCSwagAuthentication(atJsonWebToken)]
   35  TCtrlDrevina = class(TMVCController)
   36  public
   37    [MVCPath('/($Id)')]
   38    [MVCHTTPMethod([httpGET])]
   39{$IFNDEF DEBUG}    [MVCRequiresRole('role1')] {$ENDIF}
   40    [MVCSwagSummary('Town section', 'Town by Id', 'GetTown')]
   41    [MVCSwagParam(plPath, 'Id', 'Town id', ptInteger)]
   42    [MVCSwagParam(plQuery, 'params', 'Params', ptString)]
   43    [MVCSwagResponses(200, 'Success', TTown)]
   44    [MVCSwagResponses(401, 'Unauthorized')]
   45    [MVCSwagResponses(500, 'Internal Server Error')]
   46    procedure GetTown(const Id: Integer);
   47    // dalsi metody
   48  end;
   49
   50implementation
   51
   52uses
   53  MVCFramework.Controllers.Register;
   54
   55procedure TCtrlDrevina.GetTown(const Id: Integer);
   56var
   57  r: TTown;
   58  sParams: string;
   59  function qParam(const sName:string): string;
   60  begin
   61    Result := '';
   62    if Context.Request.QueryStringParamExists(sName) then
   63      Result := Context.Request.QueryParams[sName];
   64  end;
   65
   66begin
   67  sParams := qParam('params');    // example param query access
   68
   69  r := TTown.Create;
   70  r.Name := 'Zlín';
   71  r.PostCode := '76701';
   72  Render(r);
   73end;
   74
   75
   76initialization
   77
   78  TControllersRegister.Instance.RegisterController(TCtrlDrevina, csServerService);
   79
   80end.

Výsledkem je služba, která po zadání http://localhost:8080/api/town/10?params=test (kde ten začátek je samozřejmě server kde to běží) vrátí JSON.

{"name":"Zlín","postcode":"76701"}

Zároveň je ukázáno, jak se dají předat parametry a jak DMVC provádí mapování na parametry funkce.

Zkusím to rozebrat: na řádcích 20 - 29 definuji model, který vrací služba. Ty MVCSwagJsonSchemaField jsou atributy, které slouží serveru pro vytváření automatické dokumentace pro swagger a jsou nepovinné.

Řádky 33 - 48 popisují rozhraní této podslužby, kdy /town určuje API část v URL a pak jsou jednotlivé podslužby (momentálně jen jedna), a kde řádek 37 a 38 ukazuje, že služba bude mapovat parametr v URL na parametr funkce id, a jedná se o http GET.

Řádek 39 určuje, že pokud to nebude Debug mod, tak bude sekce chráněna autentizací (pro jednuduché ladění) a typ je dokumentován řádkem 34 (k tomu příště, nebo se podívejte do uvedeného dema, nebo samples\jsonwebtoken_roleauth).

Řadek 40 definuje pro swagger sekci a popis (viz screenshot dole), a následující dva řádky popisují 2 parametry - jeden v URL a druhý jako query v URL.

Následující řádky popisují známé http response kódy a jejich význam (tj. to co produkujeme) a nakonec je deklarace vlastní implementační metody.

Vlastní implementace

Vlastní obsluha je jednoduchá jako flákanec, vytvoříme instanci modelu, naplníme daty a dáme render. Render umí záznamy, třídy, pole atd. Samozřejmě reagujeme nějak na parametry, můžeme číst z DB (ideálně přes Connection pool jak jsem popisoval) atd.

No a poslední řádek je registrace naší podslužby mezi ostatní služby produkované DMVC.

Výsledek

Všechny ty věci kolem jsou kvůli swaggeru, což je web nástroj pro dokumentaci a testování. Takže jak to bude vypadat?

Po zobrazení swaggeru (všechno je součástí vašeho serveru) (je vynecháno záhlaví s informacemi o serveru)

Delphi swagger

Úplně dole jsou rozkliknutelné modely (tj. datové typy).

Rozbalení naší služby nám umožní pracovat s danou službou:

Delphi swagger

Nyní máte možnost zkoušet volání a pozorovat výsledky. Pozn.: pro začátečníky připomínám, že GET u http je možno zobrazit i ve webovém prohlížeči. Kromě testování je tímto zároveň prováděna dokumentace služby.

Jo a minimální požadavek je momentálně Delphi 10 Seattle.

Tagy:

Komponenty | Server

Komentáře

14.10.2021 23:35:50 #

Daniel_Andrascik

Ja sa zase pripomeniem ze od Daniele Teti pouzivam jeho hojne komercne nsadzovany DORM. Dnes uz nesledujem dostupne alternativy ale tiez je to jedna skvela praca vid.: https://delphi.cz/post/ORM-pribeh-z-praxe.aspx . Viac takychto ludi co "open sourcuju" takuto kvalitnu pracu, ktoru vyvijaju pre svoj komercny biznys, cize je to vyvijane a odladovane v komercnej praxi, ale nemaju zabrany publikovat svoje interne kniznice ako open source... Klobuk dole...

Daniel_Andrascik

15.10.2021 15:44:43 #

frantisek

a vysledkom je exe? alebo ako by som to nasadil na linux server alebo ako to je

frantisek

15.10.2021 16:01:39 #

radekc

Výsledkem je cokoliv, třeba samotne exe (Indy http server), nebo linuxova binarka, nebo modul apache, nebo modul pro ISS. Prostě jak to použiješ tak to je.

radekc

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců