From 0b6df41668816346f93b7afde7621291c7ebdb45 Mon Sep 17 00:00:00 2001 From: "daniele.teti" Date: Fri, 27 Jun 2014 13:30:39 +0000 Subject: [PATCH] BUGFIXES New sample: articles_crud --- ... - Introduction to DelphiMVCFramework.pdf} | Bin samples/angularjs/SAMPLETODO.FDB | Bin 2670592 -> 2670592 bytes samples/articles_crud/BusinessObjects.pas | 92 ++++++++++ samples/articles_crud/Commons.pas | 15 ++ .../articles_crud/Controllers.Articles.pas | 86 +++++++++ samples/articles_crud/Controllers.Base.pas | 49 +++++ samples/articles_crud/MainDM.dfm | 56 ++++++ samples/articles_crud/MainDM.pas | 35 ++++ samples/articles_crud/Services.pas | 98 ++++++++++ samples/articles_crud/WebModuleUnit1.dfm | 13 ++ samples/articles_crud/WebModuleUnit1.pas | 46 +++++ samples/articles_crud/articles_crud.dpr | 60 +++++++ samples/articles_crud/articles_crud.dproj | 168 ++++++++++++++++++ samples/data/ORDERSMANAGER.FDB | Bin 0 -> 2998272 bytes samples/renders/renders.dproj | 10 ++ samples/winecellar/WINES.FDB | Bin 2670592 -> 2670592 bytes sources/MVCFramework.Commons.pas | 2 +- sources/MVCFramework.RESTClient.pas | 63 +++---- sources/MVCFramework.Router.pas | 57 +++--- sources/MVCFramework.pas | 53 +++--- sources/ObjectsMappers.pas | 2 + .../DMVCFrameworkTests.dproj | 2 - .../DMVCFrameworkTests/FrameworkTestsU.pas | 56 ++++++ .../DMVCFrameworkTests/LiveServerTestU.pas | 3 - .../DMVCFrameworkTests/TestControllersU.pas | 10 ++ .../TestServer/TestServerControllerU.pas | 2 +- 26 files changed, 884 insertions(+), 94 deletions(-) rename docs/{DelphiMVCFramework.pdf => ITDevCON 2013 - Introduction to DelphiMVCFramework.pdf} (100%) create mode 100644 samples/articles_crud/BusinessObjects.pas create mode 100644 samples/articles_crud/Commons.pas create mode 100644 samples/articles_crud/Controllers.Articles.pas create mode 100644 samples/articles_crud/Controllers.Base.pas create mode 100644 samples/articles_crud/MainDM.dfm create mode 100644 samples/articles_crud/MainDM.pas create mode 100644 samples/articles_crud/Services.pas create mode 100644 samples/articles_crud/WebModuleUnit1.dfm create mode 100644 samples/articles_crud/WebModuleUnit1.pas create mode 100644 samples/articles_crud/articles_crud.dpr create mode 100644 samples/articles_crud/articles_crud.dproj create mode 100644 samples/data/ORDERSMANAGER.FDB diff --git a/docs/DelphiMVCFramework.pdf b/docs/ITDevCON 2013 - Introduction to DelphiMVCFramework.pdf similarity index 100% rename from docs/DelphiMVCFramework.pdf rename to docs/ITDevCON 2013 - Introduction to DelphiMVCFramework.pdf diff --git a/samples/angularjs/SAMPLETODO.FDB b/samples/angularjs/SAMPLETODO.FDB index 5dc30fe289883074159b4af32df56a33c032657c..bd753796d815956f45f8589fed9daaf051044155 100644 GIT binary patch delta 414 zcmYk2y)Q#y6vofndtYrSEv=$TZ?(R*mOO-^w3&Y1~WwbH;i~ysZ(ZL8ZLX1vEn9;@PX7n&3j9x~R(Z}d# z#2D5I;#aolDLTC+D;r-B;fk|uZ>spI8Zec3-Ia;?oorTCoU&bL*okVxPD&*bMJHH# z&HGJ5QKl3-Pe#lm5))NtD^#AWEQLJBgJyQv|8>q^QzYrao+h6STC`Jik(r~t%xJ~w z%j6%mY*!;mkfGH&G~^pmXgY?SE!zt*gICA}{{|L*9= mAFh+9iN?p$y7s^Afv5TCS(vVg3YY7Hnjy__^>Te=YUTr0X={c6 delta 281 zcmYMvy;8zJ00iJWxF90_AQ3evBnH&6qSVCg3-pE`L@_@jd_+PXGw9?`--e~Z6Nv&$>@`WA#F3Ph1mghiBy zIigI=6BS~Cs1l3B60uCI5H(_zs1r7^Ml^_ZVuRQu9HL2V5!*zIXcO)$ymu`dQP_;# zz&lSJQ+d#1<4w(uGV=4$^3SAB!ikQC);RE|K_{PEQCN?^Z 0 then + raise Exception.Create('Cannot delete an article with a price greater than 0 (yes, it is a silly check)'); +end; + +procedure TArticle.SetCode(const Value: string); +begin + FCode := Value; +end; + +procedure TArticle.SetDescription(const Value: string); +begin + FDescription := Value; +end; + +procedure TArticle.SetPrice(const Value: Currency); +begin + FPrice := Value; +end; + +end. diff --git a/samples/articles_crud/Commons.pas b/samples/articles_crud/Commons.pas new file mode 100644 index 00000000..42999135 --- /dev/null +++ b/samples/articles_crud/Commons.pas @@ -0,0 +1,15 @@ +unit Commons; + +interface + +uses + System.SysUtils; + +type + EServiceException = class(Exception) + + end; + +implementation + +end. diff --git a/samples/articles_crud/Controllers.Articles.pas b/samples/articles_crud/Controllers.Articles.pas new file mode 100644 index 00000000..6d4c2062 --- /dev/null +++ b/samples/articles_crud/Controllers.Articles.pas @@ -0,0 +1,86 @@ +unit Controllers.Articles; + +interface + +uses mvcframework, Controllers.Base; + +type + + [MVCPath('/articles')] + TArticlesController = class(TBaseController) + public + [MVCPath] + [MVCHTTPMethod([httpGET])] + procedure GetArticles(context: TWebContext); + [MVCPath('/($id)')] + [MVCHTTPMethod([httpGET])] + procedure GetArticleByID(context: TWebContext); + [MVCPath('/($id)')] + [MVCHTTPMethod([httpDelete])] + procedure DeleteArticleByID(context: TWebContext); + [MVCPath] + [MVCHTTPMethod([httpPOST])] + procedure CreateArticle(context: TWebContext); + end; + +implementation + +{ TArticlesController } + +uses Services, BusinessObjects, Commons, mvcframework.Commons; + +procedure TArticlesController.CreateArticle(context: TWebContext); +var + Article: TArticle; +begin + Article := context.Request.BodyAs; + try + GetArticlesService.Add(Article); + Render(201, 'Article creato'); + finally + Article.Free; + end; +end; + +procedure TArticlesController.DeleteArticleByID(context: TWebContext); +var + Article: TArticle; +begin + GetArticlesService.StartTransaction; + try + Article := GetArticlesService.GetByID(context.Request.ParamsAsInteger['id']); + try + GetArticlesService.Delete(Article); + finally + Article.Free; + end; + GetArticlesService.Commit; + except + GetArticlesService.Rollback; + raise; + end; +end; + +procedure TArticlesController.GetArticles(context: TWebContext); +begin + Render(GetArticlesService.GetAll); +end; + +procedure TArticlesController.GetArticleByID(context: TWebContext); +var + Article: TArticle; +begin + try + Article := GetArticlesService.GetByID(context.Request.ParamsAsInteger['id']); + Render(Article); + except + on E: EServiceException do + begin + raise EMVCException.Create(E.Message, '', 0, 404); + end + else + raise; + end; +end; + +end. diff --git a/samples/articles_crud/Controllers.Base.pas b/samples/articles_crud/Controllers.Base.pas new file mode 100644 index 00000000..ab8a1a2a --- /dev/null +++ b/samples/articles_crud/Controllers.Base.pas @@ -0,0 +1,49 @@ +unit Controllers.Base; + +interface + +uses + MVCFramework, Services, MainDM; + +type + TBaseController = class abstract(TMVCController) + strict private + FDM: TdmMain; + FArticlesService: TArticlesService; + function GetDataModule: TdmMain; + strict protected + function GetArticlesService: TArticlesService; + public + destructor Destroy; override; + + end; + +implementation + +uses + System.SysUtils; + +{ TBaseController } + +destructor TBaseController.Destroy; +begin + FArticlesService.Free; + FDM.Free; + inherited; +end; + +function TBaseController.GetArticlesService: TArticlesService; +begin + if not Assigned(FArticlesService) then + FArticlesService := TArticlesService.Create(GetDataModule); + Result := FArticlesService; +end; + +function TBaseController.GetDataModule: TdmMain; +begin + if not Assigned(FDM) then + FDM := TdmMain.Create(nil); + Result := FDM; +end; + +end. diff --git a/samples/articles_crud/MainDM.dfm b/samples/articles_crud/MainDM.dfm new file mode 100644 index 00000000..33e21444 --- /dev/null +++ b/samples/articles_crud/MainDM.dfm @@ -0,0 +1,56 @@ +object dmMain: TdmMain + OldCreateOrder = False + Height = 214 + Width = 438 + object Connection: TFDConnection + Params.Strings = ( + + 'Database=C:\DEV\DMVCFramework\samples\ordersmanager\bin\TOMSORDE' + + 'RS_DEVELOPMENT.FDB' + 'User_Name=sysdba' + 'Password=masterkey' + 'DriverID=FB') + ConnectedStoredUsage = [] + BeforeConnect = ConnectionBeforeConnect + Left = 64 + Top = 48 + end + object dsArticles: TFDQuery + Connection = Connection + UpdateOptions.AssignedValues = [uvFetchGeneratorsPoint, uvGeneratorName] + UpdateOptions.FetchGeneratorsPoint = gpImmediate + UpdateOptions.GeneratorName = 'GEN_ARTICOLI_ID' + UpdateOptions.UpdateTableName = 'ARTICOLI' + UpdateOptions.KeyFields = 'ID' + UpdateObject = updArticles + SQL.Strings = ( + 'SELECT * FROM ARTICOLI') + Left = 144 + Top = 48 + end + object updArticles: TFDUpdateSQL + Connection = Connection + InsertSQL.Strings = ( + 'INSERT INTO ARTICOLI' + '(ID, CODICE, DESCRIZIONE, PREZZO)' + 'VALUES (:NEW_ID, :NEW_CODICE, :NEW_DESCRIZIONE, :NEW_PREZZO)' + 'RETURNING ID, CODICE, DESCRIZIONE, PREZZO') + ModifySQL.Strings = ( + 'UPDATE ARTICOLI' + + 'SET ID = :NEW_ID, CODICE = :NEW_CODICE, DESCRIZIONE = :NEW_DESCR' + + 'IZIONE, ' + ' PREZZO = :NEW_PREZZO' + 'WHERE ID = :OLD_ID' + 'RETURNING ID, CODICE, DESCRIZIONE, PREZZO') + DeleteSQL.Strings = ( + 'DELETE FROM ARTICOLI' + 'WHERE ID = :OLD_ID') + FetchRowSQL.Strings = ( + 'SELECT ID, CODICE, DESCRIZIONE, PREZZO' + 'FROM ARTICOLI' + 'WHERE ID = :ID') + Left = 144 + Top = 112 + end +end diff --git a/samples/articles_crud/MainDM.pas b/samples/articles_crud/MainDM.pas new file mode 100644 index 00000000..d5162e77 --- /dev/null +++ b/samples/articles_crud/MainDM.pas @@ -0,0 +1,35 @@ +unit MainDM; + +interface + +uses + System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option, + FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, + FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.FB, Data.DB, + FireDAC.Comp.Client, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, + FireDAC.DApt, FireDAC.Comp.DataSet; + +type + TdmMain = class(TDataModule) + Connection: TFDConnection; + dsArticles: TFDQuery; + updArticles: TFDUpdateSQL; + procedure ConnectionBeforeConnect(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +implementation + +{%CLASSGROUP 'Vcl.Controls.TControl'} + +{$R *.dfm} + +procedure TdmMain.ConnectionBeforeConnect(Sender: TObject); +begin + Connection.Params.Values['Database'] := '..\..\data\ORDERSMANAGER.FDB'; +end; + +end. diff --git a/samples/articles_crud/Services.pas b/samples/articles_crud/Services.pas new file mode 100644 index 00000000..00d1c01c --- /dev/null +++ b/samples/articles_crud/Services.pas @@ -0,0 +1,98 @@ +unit Services; + +interface + +uses + System.Generics.Collections, BusinessObjects, MainDM, System.SysUtils, Commons; + +type + + TServiceBase = class abstract + strict protected + FDM: TdmMain; + public + constructor Create(AdmMain: TdmMain); virtual; + procedure Commit; + procedure Rollback; + procedure StartTransaction; + end; + + TArticlesService = class(TServiceBase) + public + function GetAll: TObjectList; + function GetByID(const AID: Integer): TArticle; + procedure Delete(AArticolo: TArticle); + procedure Add(AArticolo: TArticle); + end; + +implementation + +uses + ObjectsMappers, FireDAC.Stan.Option, FireDAC.Comp.Client; + +{ TArticoliService } + +procedure TArticlesService.Add(AArticolo: TArticle); +var + Cmd: TFDCustomCommand; +begin + AArticolo.CheckInsert; + Cmd := FDM.updArticles.Commands[arInsert]; + Mapper.ObjectToFDParameters(Cmd.Params, AArticolo, 'NEW_'); + Cmd.OpenOrExecute; +end; + +procedure TArticlesService.Delete(AArticolo: TArticle); +var + Cmd: TFDCustomCommand; +begin + AArticolo.CheckDelete; + Cmd := FDM.updArticles.Commands[arDelete]; + Mapper.ObjectToFDParameters(Cmd.Params, AArticolo, 'OLD_'); + Cmd.Execute; +end; + +function TArticlesService.GetAll: TObjectList; +begin + FDM.dsArticles.Open('SELECT * FROM ARTICOLI ORDER BY ID'); + Result := FDM.dsArticles.AsObjectList; + FDM.dsArticles.Close; +end; + +function TArticlesService.GetByID(const AID: Integer): TArticle; +begin + FDM.dsArticles.Open('SELECT * FROM ARTICOLI WHERE ID = :ID', [AID]); + try + if not FDM.dsArticles.Eof then + Result := FDM.dsArticles.AsObject + else + raise EServiceException.Create('Article not found'); + finally + FDM.dsArticles.Close; + end; +end; + +{ TServiceBase } + +procedure TServiceBase.Commit; +begin + FDM.Connection.Commit; +end; + +constructor TServiceBase.Create(AdmMain: TdmMain); +begin + inherited Create; + FDM := AdmMain; +end; + +procedure TServiceBase.Rollback; +begin + FDM.Connection.Rollback; +end; + +procedure TServiceBase.StartTransaction; +begin + FDM.Connection.StartTransaction; +end; + +end. diff --git a/samples/articles_crud/WebModuleUnit1.dfm b/samples/articles_crud/WebModuleUnit1.dfm new file mode 100644 index 00000000..41708580 --- /dev/null +++ b/samples/articles_crud/WebModuleUnit1.dfm @@ -0,0 +1,13 @@ +object WebModule1: TWebModule1 + OldCreateOrder = False + OnCreate = WebModuleCreate + Actions = < + item + Default = True + Name = 'DefaultHandler' + PathInfo = '/' + OnAction = WebModule1DefaultHandlerAction + end> + Height = 230 + Width = 415 +end diff --git a/samples/articles_crud/WebModuleUnit1.pas b/samples/articles_crud/WebModuleUnit1.pas new file mode 100644 index 00000000..81bcb197 --- /dev/null +++ b/samples/articles_crud/WebModuleUnit1.pas @@ -0,0 +1,46 @@ +unit WebModuleUnit1; + +interface + +uses System.SysUtils, System.Classes, Web.HTTPApp, mvcframework; + +type + TWebModule1 = class(TWebModule) + procedure WebModule1DefaultHandlerAction(Sender: TObject; + Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); + procedure WebModuleCreate(Sender: TObject); + private + FEngine: TMVCEngine; + public + { Public declarations } + end; + +var + WebModuleClass: TComponentClass = TWebModule1; + +implementation + +{ %CLASSGROUP 'Vcl.Controls.TControl' } + +uses Controllers.Articles; + +{$R *.dfm} + + +procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; + Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); +begin + Response.Content := + '' + + 'Web Server Application' + + 'Web Server Application' + + ''; +end; + +procedure TWebModule1.WebModuleCreate(Sender: TObject); +begin + FEngine := TMVCEngine.Create(self); + FEngine.AddController(TArticlesController); +end; + +end. diff --git a/samples/articles_crud/articles_crud.dpr b/samples/articles_crud/articles_crud.dpr new file mode 100644 index 00000000..c8dc0aca --- /dev/null +++ b/samples/articles_crud/articles_crud.dpr @@ -0,0 +1,60 @@ +program articles_crud; +{$APPTYPE CONSOLE} + + +uses + System.SysUtils, + Winapi.Windows, + IdHTTPWebBrokerBridge, + Web.WebReq, + Web.WebBroker, + WebModuleUnit1 in 'WebModuleUnit1.pas' {WebModule1: TWebModule}, + Controllers.Base in 'Controllers.Base.pas', + Controllers.Articles in 'Controllers.Articles.pas', + Services in 'Services.pas', + BusinessObjects in 'BusinessObjects.pas', + MainDM in 'MainDM.pas' {dmMain: TDataModule}, + Commons in 'Commons.pas'; + +{$R *.res} + + +procedure RunServer(APort: Integer); +var + LInputRecord: TInputRecord; + LEvent: DWord; + LHandle: THandle; + LServer: TIdHTTPWebBrokerBridge; +begin + Writeln(Format('Starting HTTP Server on port %d', [APort])); + LServer := TIdHTTPWebBrokerBridge.Create(nil); + try + LServer.DefaultPort := APort; + LServer.Active := True; + Writeln('Press ESC to stop the server'); + LHandle := GetStdHandle(STD_INPUT_HANDLE); + while True do + begin + ReadConsoleInput(LHandle, LInputRecord, 1, LEvent); + if (LInputRecord.EventType = KEY_EVENT) and + LInputRecord.Event.KeyEvent.bKeyDown and + (LInputRecord.Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE) then + break; + end; + finally + LServer.Free; + end; +end; + +begin + ReportMemoryLeaksOnShutdown := True; + try + if WebRequestHandler <> nil then + WebRequestHandler.WebModuleClass := WebModuleClass; + RunServer(8080); + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end + +end. diff --git a/samples/articles_crud/articles_crud.dproj b/samples/articles_crud/articles_crud.dproj new file mode 100644 index 00000000..9c80142a --- /dev/null +++ b/samples/articles_crud/articles_crud.dproj @@ -0,0 +1,168 @@ + + + {41237016-48D9-45F1-8FFC-66D1B61A206B} + 15.4 + VCL + articles_crud.dpr + True + Debug + Win32 + 1 + Console + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + $(BDS)\bin\delphi_PROJECTICNS.icns + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + articles_crud + 1040 + $(BDS)\bin\delphi_PROJECTICON.ico + None + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + error + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + + + bin + 1033 + FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;SampleListViewMultiDetailAppearancePackage;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;ITDevCon2012AdapterPackage;inetdbbde;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapServer;DataSnapCommon;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;MetropolisUILiveTile;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;IndyIPCommon;CloudService;FmxTeeUI;FireDACIBDriver;CodeSiteExpressPkg;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;CustomAdaptersMDPackage;FireDACASADriver;bindcompfmx;vcldbx;FireDACODBCDriver;RESTBackendComponents;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;SampleListViewRatingsAppearancePackage;Tee;DBXOdbcDriver;vclFireDAC;xmlrtl;DataSnapNativeClient;svnui;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;vclactnband;soaprtl;FMXTee;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;VclSmp;FireDACMSSQLDriver;FireDAC;DBXInformixDriver;Intraweb;VCLRESTComponents;DataSnapConnectors;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;SampleGenerator1Package;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;svn;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;bdertl;FireDACMSAccDriver;dbexpress;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapServer;DataSnapCommon;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;MetropolisUILiveTile;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;IndyIPCommon;CloudService;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;vclFireDAC;xmlrtl;DataSnapNativeClient;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;vclactnband;soaprtl;FMXTee;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;VclSmp;FireDACMSSQLDriver;FireDAC;DBXInformixDriver;Intraweb;VCLRESTComponents;DataSnapConnectors;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;FireDACMSAccDriver;dbexpress;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + 1033 + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + +
WebModule1
+ dfm + TWebModule +
+ + + + + +
dmMain
+ dfm + TDataModule +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + + + + + articles_crud.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + True + False + + True + + 12 + + + +
diff --git a/samples/data/ORDERSMANAGER.FDB b/samples/data/ORDERSMANAGER.FDB new file mode 100644 index 0000000000000000000000000000000000000000..c6adcbe2c8346dfabec90b7708953021ddc7008b GIT binary patch literal 2998272 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 literal 0 HcmV?d00001 diff --git a/samples/renders/renders.dproj b/samples/renders/renders.dproj index 2a3931ed..fbabf516 100644 --- a/samples/renders/renders.dproj +++ b/samples/renders/renders.dproj @@ -91,6 +91,15 @@ + + + + + + + + + Cfg_2 Base @@ -173,6 +182,7 @@ True False + True 12 diff --git a/samples/winecellar/WINES.FDB b/samples/winecellar/WINES.FDB index 7f9d70cb69709a0a5ec5268301d437dec8373ef0..56b871464e1877adcefdd6293300ba331701a33f 100644 GIT binary patch delta 1179 zcmb8tT}V@57zgm@Jv-YhH_MOwSZY&WOCw@RY-EdVjKE{&$0kMv>d+yIZp&_jh@D|- zbk~KPi>Mnf>Ov3^KY}!cuIeI)F1qL@2#X*iP)c#p{~TrW116or?{Lm}5AXYbpXbQ( zIFq4)(M8*|nUaS)UDoY94deX?jB4Wo6Fw1rx&DIQ8n-{Nkbtv8dtkVZn5UX2T|;r# zXxzm>03C>+2Ll)(4UWK3NCy*`Ap?%Vama)$$c7v^0lAO|`A`5BI0=PN1jTR)tWYu+ zca<95!UOZ1K`yOf({8t2m}-9L99b%zT`CjZOd8YkvPT`FI8oHj#%w%4P2EUKd6=;?24RiYoV=Jj&V>-DTcZCsV3(ndo<74wNk(Gkj*I zHP-n(#{TXeBhu!tJeOgjmSBHmAQ0;5>kD_v^qP!%@<#$aA(urcrp@mwd7Rl?C8m-=XkKZqO8&Q4#6<@1b_xEHFsoG|9$n=u3 wGszzabt}VmUb#Qif48DwMQg=4Dllp1`T8enD@KPZIF!R_I5Rg?QE^ZC2jzZ0VgLXD delta 327 zcmYMuzfQt%5Ww;K{aT=cfABw|_@`9u2n&hY*gk>L$;~i0IQjq`nn+-9Zrot-0knfQ zPVxXgfCGbxj=lgx6TcxO-sN+-%iVBM^r#}7DLHD4O!<$X6dBX0Pcy*tWUrMTiTqr? z$<_3rDw=Fht`&7)Bo|NqUFP>PUqQowi5&7Mz`_iQC}9?Jn8yOjSi};Rv4T~sVI380 zpo&dwp@wbjU>AF7=G%opCuW+D>|>?)?ftYnv|opHGf-ZfbL!TOH; @@ -276,7 +277,7 @@ end; constructor TRESTClient.Create(const AServerName: string; AServerPort: Word; AIOHandler: TIdIOHandler); var - Pieces: TArray; + Pieces: TArray; begin inherited Create; FPrimaryThread := TThread.CurrentThread; @@ -342,7 +343,7 @@ begin end; procedure TRESTClient.StartAsynchRequest(AHTTPMethod: THttpCommand; - AUrl: string; ABodyString: String); + AUrl: string; ABodyString: string); var th: TThread; begin @@ -364,7 +365,6 @@ begin end) else FAsynchProc(R); - ClearAllParams; finally TMonitor.Exit(TObject(R)); end; @@ -392,6 +392,7 @@ begin else FAsynchProcAlways(); end; + ClearAllParams; end); th.Start; end; @@ -447,7 +448,7 @@ begin end; end; -function TRESTClient.doPATCH(AResource: string; AResourceParams: array of string; ABodyString: String): IRESTResponse; +function TRESTClient.doPATCH(AResource: string; AResourceParams: array of string; ABodyString: string): IRESTResponse; var URL: string; begin @@ -482,7 +483,7 @@ begin end; function TRESTClient.doPOST(AResource: string; AResourceParams: array of string; -ABodyString: String): IRESTResponse; +ABodyString: string): IRESTResponse; var URL: string; begin @@ -504,7 +505,7 @@ begin end; function TRESTClient.doPUT(AResource: string; AResourceParams: array of string; -ABodyString: String): IRESTResponse; +ABodyString: string): IRESTResponse; var URL: string; begin @@ -526,17 +527,17 @@ begin end; -function TRESTClient.DSDelete(const URL, KeyValue: String): IRESTResponse; +function TRESTClient.DSDelete(const URL, KeyValue: string): IRESTResponse; begin Result := doDELETE(URL, [KeyValue]); end; -function TRESTClient.DSInsert(const URL: String; DataSet: TDataSet): IRESTResponse; +function TRESTClient.DSInsert(const URL: string; DataSet: TDataSet): IRESTResponse; begin Result := doPOST(URL, [], DataSet.AsJSONObjectString); end; -function TRESTClient.DSUpdate(const URL: String; DataSet: TDataSet; const KeyValue: String): IRESTResponse; +function TRESTClient.DSUpdate(const URL: string; DataSet: TDataSet; const KeyValue: string): IRESTResponse; begin Result := doPUT(URL, [KeyValue], DataSet.AsJSONObjectString); end; @@ -769,7 +770,7 @@ begin end; function TRESTClient.SendHTTPCommandWithBody(const ACommand: THttpCommand; -const AAccept, AContentType, AUrl: string; ABodyString: String): IRESTResponse; +const AAccept, AContentType, AUrl: string; ABodyString: string): IRESTResponse; begin Result := TRESTResponse.Create; FHTTP.Request.RawHeaders.Clear; @@ -940,19 +941,19 @@ begin inherited; end; -function TRESTResponse.GetContentEncoding: String; +function TRESTResponse.GetContentEncoding: string; begin Result := FContentEncoding; end; -function TRESTResponse.GetContentType: String; +function TRESTResponse.GetContentType: string; begin Result := FContentType; end; -function TRESTResponse.GetHeader(const Value: String): String; +function TRESTResponse.GetHeader(const Value: string): string; var - s: String; + s: string; begin if Assigned(FHeaders) and (FHeaders.Count > 0) then begin @@ -1005,7 +1006,7 @@ end; procedure TRESTResponse.SetHeaders(AHeaders: TStrings); var CT: TArray; - C: String; + C: string; begin FHeaders.Assign(AHeaders); diff --git a/sources/MVCFramework.Router.pas b/sources/MVCFramework.Router.pas index ab51908f..cdedf506 100644 --- a/sources/MVCFramework.Router.pas +++ b/sources/MVCFramework.Router.pas @@ -21,6 +21,7 @@ type AAttributes: TArray): Boolean; function IsHTTPAcceptCompatible(AWebRequestMethodType: TMVCHTTPMethodType; AAccept: AnsiString; AAttributes: TArray): Boolean; + function GetFirstMimeType(const AContentType: string): string; protected function IsHTTPMethodCompatible(AMethodType: TMVCHTTPMethodType; AAttributes: TArray): Boolean; virtual; @@ -33,21 +34,16 @@ type class function StringMethodToHTTPMetod(const Value: AnsiString) : TMVCHTTPMethodType; constructor Create(AMVCConfig: TMVCConfig); - function ExecuteRouting(AWebRequest: TWebRequest; - AMVCControllers: TList; - ADefaultContentType, ADefaultContentCharset: String; - var AMVCRequestParams: TMVCRequestParamsTable; - out AResponseContentType, AResponseContentEncoding: string) - : Boolean; overload; function ExecuteRouting(AWebRequestPathInfo: AnsiString; AWebRequestMethodType: TMVCHTTPMethodType; AWebRequestContentType: AnsiString; AWebRequestAccept: AnsiString; AMVCControllers: TList; - ADefaultContentType: String; - ADefaultContentCharset: String; + ADefaultContentType: string; + ADefaultContentCharset: string; var AMVCRequestParams: TMVCRequestParamsTable; - out AResponseContentType, AResponseContentEncoding: string) + out AResponseContentType: string; + out AResponseContentEncoding: string) : Boolean; overload; property MethodToCall: TRTTIMethod read FMethodToCall; property MVCControllerClass: TMVCControllerClass read FMVCControllerClass; @@ -63,23 +59,6 @@ uses { TMVCRouter } -function TMVCRouter.ExecuteRouting(AWebRequest: TWebRequest; - AMVCControllers: TList; - ADefaultContentType, ADefaultContentCharset: String; - var AMVCRequestParams: TMVCRequestParamsTable; - out AResponseContentType, AResponseContentEncoding: string): Boolean; -var - HTTPMethodType: TMVCHTTPMethodType; -begin - HTTPMethodType := StringMethodToHTTPMetod(AWebRequest.Method); - Result := ExecuteRouting(AWebRequest.PathInfo, HTTPMethodType, - AWebRequest.ContentType, AWebRequest.Accept, AMVCControllers, - ADefaultContentType, - ADefaultContentCharset, - AMVCRequestParams, - AResponseContentType, AResponseContentEncoding); -end; - constructor TMVCRouter.Create(AMVCConfig: TMVCConfig); begin inherited Create; @@ -89,9 +68,10 @@ end; function TMVCRouter.ExecuteRouting(AWebRequestPathInfo: AnsiString; AWebRequestMethodType: TMVCHTTPMethodType; AWebRequestContentType: AnsiString; AWebRequestAccept: AnsiString; AMVCControllers: TList; - ADefaultContentType, ADefaultContentCharset: String; + ADefaultContentType, ADefaultContentCharset: string; var AMVCRequestParams: TMVCRequestParamsTable; - out AResponseContentType, AResponseContentEncoding: string): Boolean; + out AResponseContentType: string; + out AResponseContentEncoding: string): Boolean; var controllerClass: TMVCControllerClass; _type: TRttiType; @@ -121,7 +101,7 @@ begin { ISAPI CHANGE THE REQUEST PATH INFO START } if IsLibrary then begin - AWebRequestPathInfo := String(AWebRequestPathInfo).Remove(0, FMVCConfig.Value['isapi_path'].Length); + AWebRequestPathInfo := string(AWebRequestPathInfo).Remove(0, FMVCConfig.Value[TMVCConfigKey.ISAPIPath].Length); if Length(AWebRequestPathInfo) = 0 then AWebRequestPathInfo := '/'; end; @@ -211,6 +191,16 @@ begin Exit(T(a)); end; +function TMVCRouter.GetFirstMimeType( + const AContentType: string): string; +begin + Result := AContentType; + while Pos(',', Result) > 0 do + Result := Copy(Result, 1, Pos(',', Result) - 1); + while Pos(';', Result) > 0 do + Result := Copy(Result, 1, Pos(';', Result) - 1); // application/json;charset=UTF-8 {daniele} +end; + function TMVCRouter.IsCompatiblePath(AMVCPath: string; APath: string; var AParams: TMVCRequestParamsTable): Boolean; function ToPattern(const V: string; Names: TList): string; @@ -287,8 +277,10 @@ begin begin FoundOneAttribProduces := true; MethodAccept := MVCProducesAttribute(AAttributes[i]).Value; - while Pos(',', AAccept) > 0 do - AAccept := Copy(AAccept, 1, Pos(',', AAccept) - 1); + AAccept := GetFirstMimeType(AAccept); +// while Pos(',', AAccept) > 0 do +// AAccept := Copy(AAccept, 1, Pos(',', AAccept) - 1); + Result := SameText(AAccept, MethodAccept, loInvariantLocale); if Result then Break; @@ -316,8 +308,7 @@ begin begin FoundOneAttribConsumes := true; MethodContentType := MVCConsumesAttribute(AAttributes[i]).Value; - while Pos(',', AContentType) > 0 do - AContentType := Copy(AContentType, 1, Pos(',', AContentType) - 1); + AContentType := GetFirstMimeType(AContentType); Result := SameText(AContentType, MethodContentType, loInvariantLocale); if Result then Break; diff --git a/sources/MVCFramework.pas b/sources/MVCFramework.pas index 4bde8860..5c9491c8 100644 --- a/sources/MVCFramework.pas +++ b/sources/MVCFramework.pas @@ -95,7 +95,7 @@ type FParamsTable: TMVCRequestParamsTable; FContentType: string; FCharset: string; - FContentEncoding: string; + FContentCharset: string; function GetHeader(const Name: string): string; function GetHeaderValue(const Name: string): string; function GetPathInfo: string; @@ -140,7 +140,7 @@ type property ClientPreferHTML: boolean read GetClientPreferHTML; property Files: TAbstractWebRequestFiles read GetFiles; property ContentType: string read FContentType; - property ContentEncoding: string read FContentEncoding; + property ContentCharset: string read FContentCharset; property Charset: string read FCharset; end; @@ -268,14 +268,14 @@ type FContext: TWebContext; FWebSession: TWebSession; FResponseStream: TStringBuilder; - FContentEncoding: string; + FContentCharset: string; procedure SetContext(const Value: TWebContext); procedure SetWebSession(const Value: TWebSession); procedure SetContentType(const Value: string); function GetContentType: string; function GetWebSession: TWebSession; - function GetContentEncoding: string; - procedure SetContentEncoding(const Value: string); + function GetContentCharset: string; + procedure SetContentCharset(const Value: string); protected procedure RaiseSessionExpired; virtual; @@ -289,7 +289,7 @@ type procedure MVCControllerAfterCreate; virtual; procedure MVCControllerBeforeDestroy; virtual; property ContentType: string read GetContentType write SetContentType; - property ContentEncoding: string read GetContentEncoding write SetContentEncoding; + property ContentCharset: string read GetContentCharset write SetContentCharset; // Session procedure SessionStart; virtual; procedure SessionStop(ARaiseExceptionIfExpired: boolean = true); virtual; @@ -560,7 +560,7 @@ var StaticFileName: string; ContentType: string; Handled: boolean; - ResponseContentType, ResponseContentEncoding: string; + ResponseContentType, ResponseContentCharset: string; begin LogEnterMethod(Request.PathInfo); try @@ -592,10 +592,17 @@ begin ExecuteBeforeRoutingMiddleware(Context, Handled); if not Handled then begin - if Router.ExecuteRouting(Request, FControllers, FMVCConfig[TMVCConfigKey.DefaultContentType], + if Router.ExecuteRouting( + Request.PathInfo, + TMVCRouter.StringMethodToHTTPMetod(Request.Method), + Request.ContentType, + Request.Accept, + FControllers, + FMVCConfig[TMVCConfigKey.DefaultContentType], FMVCConfig[TMVCConfigKey.DefaultContentCharset], - - ParamsTable, ResponseContentType, ResponseContentEncoding) then + ParamsTable, + ResponseContentType, + ResponseContentCharset) then begin SelectedController := Router.MVCControllerClass.Create; try @@ -615,7 +622,7 @@ begin Handled := false; // gets response contentype from MVCProduces attribute SelectedController.ContentType := ResponseContentType; - SelectedController.ContentEncoding := ResponseContentEncoding; + SelectedController.ContentCharset := ResponseContentCharset; SelectedController.OnBeforeAction(Context, Router.MethodToCall.Name, Handled); if not Handled then begin @@ -1306,7 +1313,7 @@ begin begin CT := c.Split([';']); FContentType := trim(CT[0]); - FCharset := 'utf-8'; // default encoding + FCharset := TMVCConstants.DEFAULT_CONTENT_CHARSET; // default charset if Length(CT) > 1 then begin if CT[1].trim.StartsWith('charset', true) then @@ -1316,9 +1323,9 @@ begin end; end; - c := GetHeaderValue('content-encoding'); - if c.IsEmpty then - FContentEncoding := c; + // c := GetHeaderValue('content-encoding'); + // if c.IsEmpty then + // FContentEncoding := c; end; destructor TMVCWebRequest.Destroy; @@ -1349,7 +1356,7 @@ begin inherited Create; IsSessionStarted := false; SessionMustBeClose := false; - FContentEncoding := TMVCConstants.DEFAULT_CONTENT_CHARSET; + FContentCharset := TMVCConstants.DEFAULT_CONTENT_CHARSET; end; destructor TMVCController.Destroy; @@ -1396,9 +1403,9 @@ begin end; end; -function TMVCController.GetContentEncoding: string; +function TMVCController.GetContentCharset: string; begin - Result := FContentEncoding; + Result := FContentCharset; end; function TMVCController.GetContentType: string; @@ -1578,7 +1585,7 @@ end; procedure TMVCController.Render(const Content: string); begin - InternalRender(Content, ContentType, ContentEncoding, Context); + InternalRender(Content, ContentType, ContentCharset, Context); end; procedure TMVCController.Render(AObject: TObject; AInstanceOwner: boolean); @@ -1680,9 +1687,9 @@ begin SessionMustBeClose := true; end; -procedure TMVCController.SetContentEncoding(const Value: string); +procedure TMVCController.SetContentCharset(const Value: string); begin - FContentEncoding := Value; + FContentCharset := Value; end; procedure TMVCController.SetContentType(const Value: string); @@ -2147,7 +2154,7 @@ begin if (not Context.Request.IsAjax) and (Context.Request.ClientPreferHTML) then begin ContentType := TMVCMimeType.TEXT_HTML; - ContentEncoding := 'UTF-8'; + ContentCharset := TMVCConstants.DEFAULT_CONTENT_CHARSET; ResponseStream.Clear; ResponseStream.Append @@ -2275,7 +2282,7 @@ end; procedure TMVCController.Render(AJSONValue: TJSONValue; AInstanceOwner: boolean); begin - InternalRender(AJSONValue, ContentType, ContentEncoding, Context, AInstanceOwner); + InternalRender(AJSONValue, ContentType, ContentCharset, Context, AInstanceOwner); end; procedure TMVCController.ResponseStatusCode(const ErrorCode: UInt16); diff --git a/sources/ObjectsMappers.pas b/sources/ObjectsMappers.pas index 4adf7d89..6eb5c6c1 100644 --- a/sources/ObjectsMappers.pas +++ b/sources/ObjectsMappers.pas @@ -1535,6 +1535,8 @@ begin end else if _field.PropertyType.QualifiedName = 'System.TTime' then _field.SetValue(TObject(AObject), ISOStrToTime(jvalue.Value)) + else if _field.PropertyType.QualifiedName = 'System.Currency' then + _field.SetValue(TObject(AObject), (jvalue as TJSONNumber).AsDouble) else _field.SetValue(TObject(AObject), (jvalue as TJSONNumber).AsDouble) end; diff --git a/unittests/DMVCFrameworkTests/DMVCFrameworkTests.dproj b/unittests/DMVCFrameworkTests/DMVCFrameworkTests.dproj index a404e7fa..de87dae9 100644 --- a/unittests/DMVCFrameworkTests/DMVCFrameworkTests.dproj +++ b/unittests/DMVCFrameworkTests/DMVCFrameworkTests.dproj @@ -175,8 +175,6 @@ DMVCFrameworkTests.dpr - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components diff --git a/unittests/DMVCFrameworkTests/FrameworkTestsU.pas b/unittests/DMVCFrameworkTests/FrameworkTestsU.pas index 4357c3a1..19e12435 100644 --- a/unittests/DMVCFrameworkTests/FrameworkTestsU.pas +++ b/unittests/DMVCFrameworkTests/FrameworkTestsU.pas @@ -26,6 +26,8 @@ type procedure TestPathWithParameters; procedure TestWithMethodTypes; procedure TestComplexRoutings; + procedure TestProduceRoutings; + procedure TestProduceRoutingsWithExplicitCharset; procedure TestObjectToJSONObject; procedure TestObjectListToJSONArray; @@ -362,6 +364,60 @@ begin end; +procedure TTestRouting.TestProduceRoutings; +var + Params: TMVCRequestParamsTable; + ResponseContentType: string; + ResponseContentCharset: string; +begin + Params := TMVCRequestParamsTable.Create; + try + // a GET request with a ACCEPT: application/json + CheckTrue(Router.ExecuteRouting('/orders', httpGET, + '', + 'application/json', + Controllers, + TMVCConstants.DEFAULT_CONTENT_TYPE, + TMVCConstants.DEFAULT_CONTENT_CHARSET, + Params, + ResponseContentType, + ResponseContentCharset)); + CheckEquals(0, Params.Count); + CheckEquals('TSimpleController', Router.MVCControllerClass.ClassName); + CheckEquals('OrdersProduceJSON', Router.MethodToCall.Name); + CheckEquals(TMVCConstants.DEFAULT_CONTENT_CHARSET, ResponseContentCharset); + finally + Params.Free; + end; +end; + +procedure TTestRouting.TestProduceRoutingsWithExplicitCharset; +var + Params: TMVCRequestParamsTable; + ResponseContentType: string; + ResponseContentCharset: string; +begin + Params := TMVCRequestParamsTable.Create; + try + // a GET request with a ACCEPT: application/json + CheckTrue(Router.ExecuteRouting('/orders', httpGET, + '', + 'application/json; charset=UTF-8', + Controllers, + TMVCConstants.DEFAULT_CONTENT_TYPE, + TMVCConstants.DEFAULT_CONTENT_CHARSET, + Params, + ResponseContentType, + ResponseContentCharset)); + CheckEquals(0, Params.Count); + CheckEquals('TSimpleController', Router.MVCControllerClass.ClassName); + CheckEquals('OrdersProduceJSON', Router.MethodToCall.Name); + CheckEquals(TMVCConstants.DEFAULT_CONTENT_CHARSET, ResponseContentCharset); + finally + Params.Free; + end; +end; + procedure TTestRouting.TestWithMethodTypes; var Params: TMVCRequestParamsTable; diff --git a/unittests/DMVCFrameworkTests/LiveServerTestU.pas b/unittests/DMVCFrameworkTests/LiveServerTestU.pas index a569cb6f..0a1f4ff2 100644 --- a/unittests/DMVCFrameworkTests/LiveServerTestU.pas +++ b/unittests/DMVCFrameworkTests/LiveServerTestU.pas @@ -261,7 +261,6 @@ end; procedure TServerTest.TestMiddlewareHandler; var r: IRESTResponse; - JSON: TJSONObject; P: TPerson; begin r := RESTClient @@ -274,7 +273,6 @@ end; procedure TServerTest.TestMiddlewareSpeedMiddleware; var r: IRESTResponse; - JSON: TJSONObject; P: TPerson; begin P := TPerson.Create; @@ -307,7 +305,6 @@ end; procedure TServerTest.TestPOSTWithObjectJSONBody; var r: IRESTResponse; - JSON: TJSONObject; P: TPerson; begin P := TPerson.Create; diff --git a/unittests/DMVCFrameworkTests/TestControllersU.pas b/unittests/DMVCFrameworkTests/TestControllersU.pas index 0f87827e..5d61152f 100644 --- a/unittests/DMVCFrameworkTests/TestControllersU.pas +++ b/unittests/DMVCFrameworkTests/TestControllersU.pas @@ -22,6 +22,11 @@ type public [MVCPath('/')] procedure Index(Context: TWebContext); + + [MVCPath('/orders')] + [MVCProduces('application/json')] + procedure OrdersProduceJSON(Context: TWebContext); + [MVCPath('/orders')] procedure Orders(Context: TWebContext); @@ -77,6 +82,11 @@ begin end; +procedure TSimpleController.OrdersProduceJSON(Context: TWebContext); +begin + +end; + procedure TSimpleController.PatchOrder(Context: TWebContext); begin diff --git a/unittests/TestServer/TestServerControllerU.pas b/unittests/TestServer/TestServerControllerU.pas index 4e871b15..57235bcf 100644 --- a/unittests/TestServer/TestServerControllerU.pas +++ b/unittests/TestServer/TestServerControllerU.pas @@ -205,7 +205,7 @@ procedure TTestServerController.TestEncoding(ctx: TWebContext); var Obj: TJSONObject; begin - ContentEncoding := 'utf-8'; + ContentCharset := TMVCConstants.DEFAULT_CONTENT_CHARSET; Obj := TJSONObject.Create; Obj.AddPair('name1', 'jørn'); Obj.AddPair('name2', 'Što je Unicode?');