ebook img

Delphi MVC Framework, Leverage the power of REST and JSON-RPC using the most popular framework for Delphi PDF

260 Pages·2020·16.513 MB·English
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Delphi MVC Framework, Leverage the power of REST and JSON-RPC using the most popular framework for Delphi

DelphiMVCFramework Leverage the power of REST and JSON-RPC using the most popular framework for Delphi DANIELE TETI Thisbookisforsaleathttp://leanpub.com/delphimvcframework Thisversionwaspublishedon2020-09-15 ThisisaLeanpubbook.LeanpubempowersauthorsandpublisherswiththeLeanPublishing process.LeanPublishingistheactofpublishinganin-progressebookusinglightweighttoolsand manyiterationstogetreaderfeedback,pivotuntilyouhavetherightbookandbuildtractiononce youdo. ©2018-2020DANIELETETI Tweet This Book! PleasehelpDANIELETETIbyspreadingthewordaboutthisbookonTwitter! Thesuggestedhashtagforthisbookis#dmvcframeworkhandbook. Findoutwhatotherpeoplearesayingaboutthebookbyclickingonthislinktosearchforthis hashtagonTwitter: #dmvcframeworkhandbook TomybelovedwifeDeboraandourlittleboyMattia. CONTENTS Contents Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 WhatistheDelphiMVCFramework,andwhydoesitmatter? . . . . . . . . . . . . . . . . . 3 Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 WhatuserssayaboutDMVCFramework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 FetchingThisBook’sCode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 UsingThisBook’sCode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 BookReleaseNotes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Chapter1:GettingStartedwithDelphiMVCFramework . . . . . . . . . . . . . . . . . . . . . . 10 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 DMVCFrameworkis“batteriesincluded” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 InstallationofDelphiMVCFramework3.2.1-carbon . . . . . . . . . . . . . . . . . . . . . . . . 11 YourfirstRESTfulserverwithDelphiMVCFramework . . . . . . . . . . . . . . . . . . . . . . 13 YourfirstDMVCFramework-style“HelloWorld” . . . . . . . . . . . . . . . . . . . . . . . . . 15 Built-inSystemActions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Chapter2:Controllersandrouting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 TheRouter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 MVCPathattribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 HandlingParameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Query-Stringparameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 URLmappedparameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 MultiplePathsforaSingleAction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 MoreaboutURLMappedparameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 StronglyTypedActions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 MVCHTTPMethodattribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 MVCProducesattribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 MVCConsumesattribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 MVCDocattribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 ActionFilters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 DelphiMVCFramework-theofficialguide|Copyright2020byDanieleTeti|AllRightReserved CONTENTS What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Chapter3:Renders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 TheRenderingPhase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 RenderingDataMustbeSimple! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 RenderingObjectsandListofObjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 CustomizeObjectsSerialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 RenderingTStreamdescendants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 RenderingNestedObjects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 SerializingTDatasetdescendants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 RenderingDictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Renderingimages,pdfandotherbinarycontents . . . . . . . . . . . . . . . . . . . . . . . . . 68 RenderingExceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 RenderingCustomDataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 SupportHATEOASinyourAPIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Deserialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 DeserializeSimpleObjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 DeserializingListofObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 DeserializingHierarchicalStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 TheIMVCListInterface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 SendingBinaryContents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Usingmultipart/form-data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 CustomTypeSerializers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Usingcustomserializer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Chapter4:MunicipalLibrarySystem-TheDatabase . . . . . . . . . . . . . . . . . . . . . . . . 96 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 TheMunicipalLibrarySystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 TheDatabase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Chapter5:MunicipalLibrarySystem-TheAPIs . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 APIsdesignOverview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 DesignanAPIfortheBooksLendingSystem. . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 TheactualAPIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 What’snext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Chapter6:MunicipalLibrarySystem-CreatingAPIsusingDatasets . . . . . . . . . . . . . 106 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 TheCRUDacronym . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 ImplementingtheAPIusingdatasets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 DelphiMVCFramework-theofficialguide|Copyright2020byDanieleTeti|AllRightReserved CONTENTS What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Chapter7:MunicipalLibrarySystem-CreatingAPIswithMVCActiveRecord . . . . . . . 121 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 TheActiveRecordDesignPattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 ActiveRecordinMVCFrameworka.k.a.MVCActiveRecord . . . . . . . . . . . . . . . . . . . 121 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Chapter8:MunicipalLibrarySystem-CompleteAPIswithMVCActiveRecord . . . . . . . 142 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 WebModuleConfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 EstablishaDatabaseConnection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 TAuthorsController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 TControllerBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 HandlingpaginationinTCustomersController.GetCustomers . . . . . . . . . . . . . . . . . . 158 Terminatealending . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 UsersmanagementwithTUsersController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Chapter9:Authentication&authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 AuthenticationvsAuthorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 TheAuthentication/AuthorizationSubsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 SecuringanAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 HTTPBasicAuthentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 JSONWebTokenAuthenticationandAuthorization . . . . . . . . . . . . . . . . . . . . . . . 183 AccessingLoggedUserInformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Chapter10:Middlewares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 What’samiddleware? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 TheIMVCMiddlewareInterface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Built-InMiddleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 CORSMiddleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 CompressionMiddleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 AnalyticsMiddleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 TraceMiddleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 StaticFilesMiddleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Chapter11:MunicipalLibrarySystem-AuthenticationandAuthorization . . . . . . . . . 209 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Howtochooseanauthenticationschema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 DelphiMVCFramework-theofficialguide|Copyright2020byDanieleTeti|AllRightReserved CONTENTS Definingarolessystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 CreateaPythonclient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Chapter12:JSON-RPC:why,whenandhowuseit . . . . . . . . . . . . . . . . . . . . . . . . . 222 Whatyou’lllearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 JSON-RPCOverview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 JSON-RPC2.0Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 JSON-RPC2.0Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 ResponseErrorObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 JSON-RPCvsREST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 PublishingPODOs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 TheMVCInheritableAttribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Inspectingthepublishedmethods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 DefiningHooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 What’sNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Chapter13:TipsandTricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 Tip#1:RedirectinguserstoadifferentURLonlywhenareusingbrowser . . . . . . . . . . 244 Tip#2:Don’tloadsystemcontrollers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Tip#3:RemoveX-Powered-ByHeader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Tip#4:ChangeorremovetheServerHeader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Tip#5:TestingAPIusingPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Tip#6:Storinguserspassword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 DelphiMVCFramework-theofficialguide|Copyright2020byDanieleTeti|AllRightReserved Foreword WrittenbyJimMcKeeth ChiefDeveloperAdvocate&Engineer EmbarcaderoTechnologies Everyone knows Delphi is the best solution for connecting to databases and building mobile and desktop applications. The Delphi MVC Framework (DMVCFramework) brings the amazing productivityofDelphitotheweb! The DMVCFramework is based on Delphi’s WebBroker module, which was introduced in Delphi 3 backin1997.AlothaschangedsinceWebBrokerfirstappeared,bothwithDelphiandwiththeweb. The First Web Browser War began in 1997. Microsoft just released Internet Explorer version 4 and leftaten-foot-tallletter“e”logoonNetscape’sfrontlawn,witha“FromtheIEteam…WeLoveYou,” signattached.AftertheNetscapeemployeesknockeditovertheyreturnedthefavorwithaMozilla dinosaurmascotholdingasignreading“Netscape72,Microsoft18,”thebrowsermarketshareatthe time.Opera,Apple’sCyberdog,theLynxtext-onlybrowser,andothersmadeuptheremaining10%. AsthewebevolvedweseetheriseofXMLandSOAPwebservices.BothXML(ExtensibleMarkup Language) and HTML (HyperText Markup Language) are based on the Standard General Markup Language (SGML), which is the source of the angle brackets. SOAP is the Simple Object Access ProtocolthatallowedforRemoteProcedureCalls(RPC)andpromisedadecentralizedcollectionof remoteserviceseasilyinvokedviawebrequests. Delphigotit’sXMLbasedSOAPWebServicesin2001’sDelphi6.Itaddedboththeabilitytobuild XML SOAP Servers and consume existing XML SOAP services, even those built with other tools. I contributedachaptertoabookonbuildingaweb-basedSOAPClientthatconsumeda.NETSOAP Services.ItusedKylixtodeploytheDelphiwebserveronLinux. SOAPneverrealizeditsdreamsofrevolutionizingthewayserviceswerecalled,onlyeverreceiving limited adoption. Things changed again when Roy Fielding introduced the term representational state transfer (REST) in his doctoral dissertation. Where XML SOAP was a heavyweight officially adoptedprotocol,thenewRESTchallengerwaslightweightandvague.Reallymoreofadescriptive recommendation. RESTisbuiltonthesimplicityoftheHTTPprotocol.Thisallowsforaregularwebbrowsertoview a simple REST endpoint. The resulting data is typically in JSON (JavaScript Object Notation made upofcurlybraces),butthedataisreturned. Further,aserviceisconsideredRESTfulifitmeetsthefollowingarchitecturalconstraints: Foreword 2 1. Uniforminterface-RESTmakesuseoftheUniformResourceLocators(URL)standardofthe webtodefineendpointsastheinterfaceofREST 2. Client–server - This is all about separation of concerns, and the improved scalability that comes with it. The data storage and the user interface are decoupled and allowed to evolve independently. 3. Stateless - This requires that each request must contain all of the information necessary and cannot take advantage of any stored state. So two identical requests will produce the same identical response. This allows for greater horizontal server scalability. Many rest implementations do allow of an authentication token to maintain a session, but beyond that, itisimportantthattheorderofrequestsdoesnotimpacttheresults. 4. Cacheable - Since it is stateless, it is easily cacheable. If you request a specific page of data, then that same request will always return the same results (until the data is changed). A non- cacheablesystemmayautomaticallygiveyouthenextpageonfuturerequests,butitwouldn’t bestatelesseither. 5. Layered system - This is where the popular term “microservices” comes from, with the idea thataRESTfulservicearchitectureismadeofmultiplelayersofRESTservices,eachonlyaware ofitsneighboringlayers. Finally,withREST weseethe realizationof adistributedand openwebservicesarchitecture.Most everysitethatoffersaservicemakesitavailableviaaRESTfulAPI. DelphiMVCFramework-theofficialguide|Copyright2020byDanieleTeti|AllRightReserved

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.