Académique Documents
Professionnel Documents
Culture Documents
Delphi 2010 WP DataSnap FR
Delphi 2010 WP DataSnap FR
Sige social
100 California Street, 12th Floor
San Francisco, California 94111
Sige EMEA
York House
18 York Road
Maidenhead, Berkshire
SL6 1SF, United Kingdom
Sige Asia-Pacific
L7. 313 La Trobe Street
Melbourne VIC 3000
Australia
Copyright 2009 Bob Swart (aka Dr. Bob - www.drbob42.com). Tous droits rservs.
1.
1.1
2.
2.1.
2.1.1.
2.1.1.1.
2.1.1.1.1.
2.1.1.1.2.
2.1.1.1.3.
2.1.1.1.4.
2.1.1.1.5.
2.1.1.2.
2.1.2.
2.1.3.
2.1.4.
2.2.
2.2.1.
2.2.1.1.
2.2.1.2.
2.3.
2.3.1.
3.
3.1.
3.2.
3.2.1.
3.2.2
3.2.3.
3.2.4.
3.3.
3.4.
4.
4.1.
4.2.
4.3.
5.
5.1.
5.2.
5.3.
6.
6.1.
7.
7.1.
8.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
1.
Historique DataSnap
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
2.1.1.1. SERVERCONTAINERUNITDEMO
Les deux premiers composants sont toujours prsents ; les trois autres
dpendent naturellement des protocoles de communication optionnels
slectionns.
2.1.1.1.1. TDSSERVER
Le composant TDSServer na que quatre proprits : AutoStart, HideDSAdmin,
Name et Tag. La proprit AutoStart est paramtre par dfaut sur True, ce qui
signifie que le Serveur DataSnap dmarrera ds que le formulaire est cr. Dans
le cas contraire, il est possible dappeler manuellement la mthode Start la
mthode Stop peut toujours tre appele. La fonction Started permet de
dterminer si le Serveur DataSnap a dj dmarr.
Par dfaut la proprit HideDSAdmin est paramtre sur False. Dans le cas
contraire (True), les clients se connectant au Serveur DataSnap ne peuvent pas
appeler les mthodes serveur intgres de la classe TDSAdmin. Cette dernire
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
nest pas proprement parler une classe mais ses mthodes que nous pouvons
appeler sont documentes dans lunit DSNames :
TDSAdminMethods = class
public
const CreateServerClasses = 'DSAdmin.CreateServerClasses';
const CreateServerMethods = 'DSAdmin.CreateServerMethods';
const FindClasses = 'DSAdmin.FindClasses';
const FindMethods = 'DSAdmin.FindMethods';
const FindPackages = 'DSAdmin.FindPackages';
const GetPlatformName = 'DSAdmin.GetPlatformName';
const GetServerClasses = 'DSAdmin.GetServerClasses';
const GetServerMethods = 'DSAdmin.GetServerMethods';
const GetServerMethodParameters = 'DSAdmin.GetServerMethodParameters';
const DropServerClasses = 'DSAdmin.DropServerClasses';
const DropServerMethods = 'DSAdmin.DropServerMethods';
const GetDatabaseConnectionProperties = 'DSAdmin.GetDatabaseConnectionProperties';
end;
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
2.1.1.1.2. TDSSERVERCLASS
Le composant TDSServerClass est responsable dindiquer la classe ct serveur
utilise pour exposer les mthodes publies aux clients distants ( travers une
invocation de mthode dynamique).
La proprit Serveur du composant TDSServerClass pointe sur le composant
TDSServer. Lautre proprit importante en plus de Name et Tag est
LifeCycle paramtre par dfaut sur Session mais qui peut aussi prendre les
valeurs Server ou Invocation. Pour faire bref, Server, Session et Invocation
signifient qu'une instance de classe est utilise pour toute la dure de vie du
serveur, pour la dure de la session DataSnap ou simplement pour linvocation
de mthode. Session signifie que chaque connexion entrante obtiendra sa propre
instance de la classe serveur. Si vous choisissez Invocation, vous terminerez
avec une classe serveur sans-tat utile si vous souhaitez dployer une
application de serveur Web CGI (qui est galement sans tat et
charge/dcharge chaque requte) ; si vous passez Server, une seule
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
instance de classe serveur est partage par toutes les connexions et requtes
entrantes. Ce qui peut tre utile (par exemple, si vous souhaitez compter le
nombre de requtes) mais il faut sassurer que cela ne risque pas de causer des
problmes de threading (par exemple, lorsque de multiples requtes entrantes
doivent tre traites simultanment).
Le composant TDSServerClass a quatre vnements : OnCreateInstance,
OnDestroyInstance (instance cre/dtruite), OnGetClass et OnPrepare. Le
gestionnaire dvnements OnPrepare peut tre utilis pour prparer une
mthode serveur.
En cas dutilisation de Delphi 2009 ou de Delphi 2010 en plaant manuellement
le composant TDSServerClass dans un conteneur, nous devons implmenter
lvnement OnGetClass car nous devons spcifier quelle classe sera
dporte/distancie du serveur vers le client.
Cependant, les assistants DataSnap de Delphi 2010 implmentent
automatiquement le gestionnaire OnGetClass comme suit :
procedure TServerContainer1.DSServerClass1GetClass
(DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass);
Begin
PersistentClass := ServerMethodsUnitDemo.TServerMethods1;
end;
Remarquons quil sagit du code gnr que nous avons lgrement modifi en
renommant lunit ServerMethodsUnit1 pour lenregistrer sous
ServerMethodsUnitDemo.pas.
2.1.1.1.3. TDSTCPSERVERTRANSPORT
Le composant TDSTCPServerTransport est responsable de la communication
entre serveur et clients DataSnap en utilisant le protocole TCP/IP.
Le composant TDSTCPserverTransport dispose de cinq proprits importantes :
BufferKBSize, Filters (nouveau dans Delphi 2010), MaxThreads, PoolSize, Port et
Server.
La proprit BufferKBSize indique la dimension du buffer de communication (par
dfaut 32 Ko). La proprit Filters peut contenir une collection de filtres de
transport (couverts en dtail la section 4). La proprit MaxThreads permet de
dfinir le nombre maximal de threads (0 par dfaut signifiant pas de limite
maximale ). PoolSize peut tre mis en uvre pour activer des pools de
connexion et la proprit Port pour contrler le port TCP/IP utilis par le serveur
pour se connecter au client (si vous modifiez ce paramtre, vous devrez
galement le modifier par la suite dans le client DataSnap).
La proprit Serveur renvoie au composant TDSServer. Le composant
DSTCPServerTransport ne comporte aucun vnement.
2.1.1.1.4. TDSHTTPSERVICE
Le composant TDSHTTPService assure la communication entre le serveur
DataSnap et les clients DataSnap via le protocole HTTP.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Notez que les informations HTTP Trace napparaissent que lorsque le client utilise
effectivement le protocole HTTP pour se connecter au serveur (et non le
protocole TCP/IP par dfaut).
Exemple de sortie de trace :
17:05:55.398 HTTP Trace TDSHTTPContextIndy
17:05:55.400 /datasnap/tunnel
17:05:55.403 OK
2.1.1.1.5. TDSHTTPSERVICEAUTHENTICATIONMANAGER
Le composant TDSHTTPServiceAuthenticationManager sera plac dans le
conteneur du serveur si l'option dauthentification du protocole de communication
HTTP a t coche. Bien entendu, il est toujours possible de le placer
manuellement dans le conteneur.
Le composant TDSHTTPServiceAuthenticationManager doit tre connect la
proprit AuthenticationManager dun composant TDSHTTPService.
Il comporte un seul vnement, OnHTTPAuthenticate, qui peut tre utilis pour
vrifier les informations dauthentification HTTP fournies au Serveur par le Client
DataSnap.
procedure TServerContainer1.DSHTTPServiceAuthenticationManager1HTTPAuthenticate
(Sender: TObject; const Protocol, Context, User, Password: string;
var valid: Boolean);
begin
if (User = 'Bob') and (Password = 'Swart') then
valid := True
else
valid := False
end;
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Bien entendu, cette routine de validation devra tre complte dune recherche
dans la base de donnes, par exemple partir dune version hache du mot de
passe. Pour les envois dinformations utilisateur et mot de passe (hach) du
client au serveur, lauthentification HTTP est facilite par lemploi du protocole
HTTPS sur une partie du transfert ; il est donc esprer quEmbarcadero
lajoutera la liste actuelle des protocoles HTTP et TCP/IP.
Le protocole HTTPS garantira que la connexion est scurise et que le paquet de
donnes est crypt et empchera tout programme de capter vos donnes
dutilisateur et mot de passe (haches). Consultez votre fournisseur de services
Internet ou votre Webmestre pour connatre les ventuelles possibilits HTTPS
de votre domaine cette mesure est fortement recommande (jutilise par
exemple https://www.bobswart.nl).
Une autre technique efficace applique par certaines applications serveur
DataSnap consiste crire les (tentatives) dauthentification HTTP dans un
fichier de log pouvant galement accueillir les donnes de Protocole et de
Contexte. Ceci peut savrer utile pour connatre lidentit des utilisateurs qui sy
connectent et de ceux qui tentent de sy connecter (par exemple, les fausses
tentatives de connexions destines accder au serveur DataSnap).
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
2.1.1.2. SERVERMETHODSUNITDEMO
Aprs ServerContainerUnitDema.pas, passons maintenant une autre unit
importante de la nouvelle application serveur DataSnap : lunit
ServerMethodsUnitDemo.pas. Dans la bote de dialogue New DataSnap Server,
nous avons spcifi la classe TDSServerModule utiliser comme anctre ; le type
TServerMethods1 est donc driv de TDSServerModule (qui est driv de
TDSServerModuleBase, lui-mme driv de TProviderDataModule, qui ajoute un
module de destruction Destroy et une procdure BeforeDestruction). Un
TProviderDataModule est driv dun TDataModule normal, et apporte des
fonctionnalits supplmentaires de collaboration avec des fournisseurs (ceci sera
dvelopp ultrieurement).
tant donn que lune des classes anctres de TServerMethods1 est
TDataModule, longlet de conception indiquera la zone concepteur pour un
module de donnes : les contrles non-visuels (par exemple, contrles daccs
aux donnes) pourront y tre placs. Nous verrons le placement des composants
d'accs aux donnes la section 3 ; dans limmdiat, nous laisserons la zone de
conception vide et continuerons dcouvrir comment ajouter des mthodes la
classe TServerMethods1.
Si vous ne souhaitez pas ajouter de cibles supplmentaires au groupe projet pour
une application DataSnap Console et/ou DataSnap Windows Service, vous
pouvez passer directement la partie 2.1.4, pour commencer implmenter les
mthodes serveur.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Notez que quelles que soient les autres options slectionnes, vous rutiliserez
ServerContainerUnitDemo.pas et ServerMethodsUnitDemo.pas partir du projet
DataSnapServer dans tous les cas.
Cliquez sur OK pour gnrer le nouveau projet. L encore, ceci aboutira la
cration dun fichier Project1.dproj, ainsi que dun fichier
ServerContainerUnit2.pas et dun fichier ServerMethodsUnit2.pas. Cliquez avec le
bouton droit sur lunit ServerMethodsUnit2.pas dans le Gestionnaire de projets
et retirez-la du nouveau projet.
Conservez ServerContainerUnit2.pas pour linstant, elle servira copier une
mthode.
Enregistrez le projet dans DataSnapConsoleServer.dproj.
Si vous comparez le contenu de lunit ServerContainerUnitDemo.pas celui de
la nouvelle unit ServerContainerUnit2.pas (pour lapplication console), vous
constaterez que cette dernire inclut une procdure globale nomme
RunDSServer. Cette procdure globale nest utile que pour une application
Console ; vous devrez donc la copier/coller dans le code source du projet
DataSnapConsoleServer.dproj juste avant le dbut du bloc principal.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end
end.
type
TServerMethods1 = class(TDSServerModule)
private
{ Private declarations }
public
{ Public declarations }
function EchoString(Value: string): string;
function ServerTime: TDateTime;
end;
Ceci est d au fait que lapplication DataSnapServer est alors en mode dcoute
active des requtes entrantes via TCP/IP et HTTP. Elle agira alors comme un
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Cheval de Troie capable dcouter les requtes entrantes ; pour cela, cliquez
sur le bouton Autoriser laccs et poursuivez le dmarrage du serveur DataSnap.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Le lecteur est invit sexercer en appliquant cette mme procdure pour tester
la mthode EchoString.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Notez que vous devez galement indiquer une valeur pour le nom dhte
(HostName), sauf si vous ralisez des tests avec un Serveur DataSnap sur la
mme machine locale.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Laissez ensuite le jeu CommandType sur ctQuery et faites cliquez sur la proprit
ellipse pour que la proprit CommandText entre une requte SQL.
SELECT EMP_NO, FIRST_NAME, LAST_NAME, HIRE_DATE, JOB_COUNTRY FROM EMPLOYEE
3.1. TSQLSERVERMETHOD
Ceci fournit un moyen simple dafficher les donnes en mode lecture seule (dans
la mesure o TSQLServerMethod nautorise pas la combinaison
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
3.2. TDSPROVIDERCONNECTION
Si nous devons appliquer des mises jour, nous avons besoin dun composant
TDSProviderConnection qui nous donne une rfrence un DataSetProvider du
ct serveur permettant non seulement de lire les donnes mais aussi d'envoyer
les mises jour.
Nous devons tout dabord effectuer un changement sur le module de donnes du
serveur. Cependant, nous navons pour linstant fait quajouter une fonction pour
retourner TDataSet et nous devons ajouter maintenant un vritable
TDataSetProvider et nous assurer quil est export du serveur vers les clients
DataSnap. Par consquent, retournons lunit ServerMethodsUnitDemo et
plaons un composant TDataSetProvider ct de TSQLDataSet, pointant vers la
proprit DataSet de TDataSetProvider vers TSQLDataSet. Nous devons
galement renommer TDataSetProvider pour le rendre intelligible
(dspEmployees).
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Si une erreur se produit (enregistrement non trouv) lors de la mise jour, nous
pouvons obtenir un retour dans lvnement OnReconcileError de TClientDataSet
(voir les dtails la section 3.2.3).
Lenvoi manuel des mises jour au serveur DataSnap utilise galement la
mthode ApplyUpdates de TClientDataSet mais ne doit cette fois pas tre
appele par les gestionnaires dvnement OnAfterInsert, OnAfterPost et
OnAfterDelete. Au lieu de cela, nous devons ajouter un bouton au formulaire
client pour permettre lutilisateur de retourner explicitement les modifications
au serveur.
procedure TForm2.btnUpdateClick(Sender: TObject);
ClientDataSet1.ApplyUpdates(0);
end;
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Cliquez ensuite sur OK, pour ajouter RecError.pas votre projet DataSnapClient.
Cette unit contient la dfinition et limplmentation du dialogue Erreur de mise
jour utilisable pour rsoudre les erreurs de mise jour de la base de donnes.
Le paramtre Action peut retourner les valeurs suivantes (dans lordre des
valeurs enum relles) :
- raSkip Ne pas mettre jour lenregistrement mais conserver les
modifications non ralises dans le log de changement. Prt pour un
nouvel essai la prochaine fois.
- raAbort Annulation de lensemble de la rconciliation ; aucun autre
enregistrement ne sera pass au gestionnaire dvnements
OnReconcileError.
- raMerge Fusion de lenregistrement mis jour avec lenregistrement
actuel de la base de donnes (distante), modification uniquement des
valeurs de champ (distants) si elles ont chang de votre ct.
- raCorrect Remplacement de lenregistrement mis jour par une valeur
corrige de lenregistrement du gestionnaire dvnement (ou dans
ReconcileErrorDialog). Avec cette option lintervention utilisateur est
requise (saisie).
- raCancel Annulation de tous les changements l'intrieur de
l'enregistrement et retour lenregistrement (local) original.
- raRefresh Annulation de tous les changements lintrieur de
lenregistrement avec rechargement des valeurs de la base de donnes
(distante) actuelle (et non depuis lenregistrement local original).
Lintrt de ReconcileErrorForm est de saffranchir de ces considrations. Il suffit
dinclure lunit ErrorDialog dans la dfinition de formulaire principal du client
DataSnap, de cliquer sur le formulaire Client DataSnap et de choisir Fichier |
Utiliser lunit pour obtenir le dialogue Utiliser lunit. Avec le formulaire client
comme unit courante, le dialogue Utiliser lunit liste la seule unit disponible :
ErrorDialog.
Il suffit de la slectionner et de cliquer sur OK.
La seconde opration raliser est dcrire une ligne de code dans le
gestionnaire dvnements OnReconcileError pour appeler la fonction
HandleReconcileError de lunit ErrorDialog (qui vient dtre ajoute la liste
dimportation ClientMainForm). La fonction HandleReconcileError dispose des
mmes quatre arguments que OnReconcileError (ce qui nest naturellement pas
une concidence). Il sagit donc de passer les arguments de lun lautre rien
de plus, rien de moins. Le gestionnaire OnReconcileError du composant
TClientDataSet peut tre cod comme suit :
procedure TFrmClient.ClientDataSet1ReconcileError(DataSet: TClientDataSet;
E: EReconcileError; UpdateKind: TUpdateKind;
var Action: TReconcileAction);
begin
Action := HandleReconcileError(DataSet, UpdateKind, E)
end;
Le dploiement d'un serveur DataSnap utilisant des bases de donnes peut tre
plus complexe que le dploiement du serveur DataSnap avec lequel nous avons
dbut. Pour lapplication client, rien ne change il sagit toujours dun client
lger/intelligent qui peut tre dploy comme un excutable autonome en
ajoutant lunit MidasLib aux clauses dutilisation.
Pour le serveur DataSnap, nous devons maintenant aussi dployer les pilotes de
base de donnes. Les pilotes et fichiers dpendent de la base de donnes
slectionne. En utilisant DBX4, pensez vrifier le composant TSQLConnection
et les fichiers dbxconnections.ini et dbxdrivers.ini dans C:\Documents and
Settings\All Users\ Documents\RAD Studio\dbExpress\7.0 (Windows XP) ou dans
C:\Users\Public\Documents\RADStudio\dbExpress\7.0 (Windows Vista et
Windows 7).
Le fichier dbxdrivers.ini indique pour le pilote donn les composants
DriverPackageLoader et MetaDataPackageLoader (pointant gnralement vers le
mme package). Pour BlackfishSQL, cela signifie que DBXClientDriver140.bpl doit
tre dploy ainsi que Blackfish. Pour plus dinformations sur le dploiement de
BlackfishSQL, reportez-vous fichier deploy_en.htm dans le rpertoire
RADStudio\7.0.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
4. FILTRES DATASNAP
LES DONNES COMME VOUS VOULEZ
Dans cette section, nous aborderons le fonctionnement des filtres et la faon
dutiliser les filtres existants (tels que la compression) ou de construire de
nouveaux filtres DataSnap. Les filtres DataSnap sont des DLL spcifiques qui
interceptent le flux doctets de communication et peuvent fonctionner dans une
chane de filtres complte.
Nous pouvons par exemple combiner compression et cryptage, journalisation et
compression, etc.
Nous devons indiquer quel(s) filtre(s) doivent tre utiliss par le serveur et le
client DataSnap deux endroits. Pour le serveur, nous devons indiquer une liste
dans la proprit Filters du composant TDSTCPServerTransport et pour les
clients, nous devons indiquer une liste similaire de filtres dans les clauses
dutilisation du projet client DataSnap. Cela suffit pour le client dans la mesure
o chaque filtre DataSnap doit automatiquement senregistrer pour utilisation.
Lors du gestionnaire dvnements OnConnect, nous pouvons examiner les filtres
enregistrs utiliss pour la connexion (par exemple en utilisant une fonction
spcifique LogInfo pour crire ces informations dans un fichier journal) :
procedure TServerContainer1.DSServer1Connect(
DSConnectEventObject: TDSConnectEventObject);
var
i: Integer;
begin
LogInfo('Connect ' + DSConnectEventObject.ChannelInfo.Info);
for i:=0 to DSConnectEventObject.Transport.Filters.Count-1 do
LogInfo(' Filter: ' +
DSConnectEventObject.Transport.Filters.GetFilter(i).Id);
end;
Examinons par exemple un filtre DataSnap existant, livr avec Delphi 2010 qui
peut tre utilis pour comprimer les flux de donnes entre le serveur DataSnap
et lunit DbxCompressionFilter.
Le composant TDSTCPServerTransport (pour TCP/IP) et le composant
DSHTTPService (pour HTTP) ont une proprit Filters contenant
TTransportFiltersCollection. Nous pouvons cliquer sur lellipse de la proprit
Filters pour modifier la collection de filtres. Dans ce dialogue, nous pouvons
ajouter un nouvel lment TTransportFilterItem et utiliser linspecteur dobjets
pour paramtrer FilterId et quelques proprits optionnelles. Delphi 2010 est
livr avec le filtre ZLibCompression qui peut tre spcifi ici comme FilterId.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
unit LogFilter;
interface
uses
SysUtils, DBXPlatform, DBXTransport;
type
TLogFilter = class(TTransportFilter)
private
protected
function GetParameters: TDBXStringArray; override;
function GetUserParameters: TDBXStringArray; override;
public
function GetParameterValue(const ParamName: UnicodeString): UnicodeString; override;
function SetParameterValue(const ParamName: UnicodeString;
const ParamValue: UnicodeString): Boolean; override;
constructor Create; override;
destructor Destroy; override;
function ProcessInput(const Data: TBytes): TBytes; override;
function ProcessOutput(const Data: TBytes): TBytes; override;
function Id: UnicodeString; override;
end;
const
LogFilterName = 'Log';
Comme nous lavons vu, pour utiliser le filtre transport dans le serveur
DataSnap, nous devons lajouter la liste des filtres de TDSTCPServerTransport
ou du composant TDSHTTPService.
En phase de conception, le filtre ZLibCompression est dj connu mais pas les
nouveaux filtres (sauf si nous les ajoutons un package pour les installer).
Heureusement, nous pouvons galement ajouter les filtres de transport en
excution en ajoutant lunit filtre la clause dutilisation de
ServerContainerUnitDemo puis en ajoutant le filtre manuellement (par nom) la
liste des filtres, par exemple dans :
procedure TServerContainer1.DataModuleCreate(Sender: TObject);
begin
DSTCPServerTransport1.Filters.AddFilter(LogFilterName);
DSHTTPService1.Filters.AddFilter(LogFilterName);
DSHTTPService1.Active := True;
end;
Ceci permet de sassurer que le serveur utilise LogFilter et que le client lutilisera
automatiquement aprs lajout de lunit LogFilter la clause dutilisation du
client. Sinon, le message derreur suivant saffichera :
navons pas ajouter dinformation telle que ParamStr(0) pour identifier quelle
cible produit effectivement le message de log.
Au-del des cibles Windows, un assistant permet de produire des cibles ISAPI,
CGI ou Excutable dbogueur dapplication Web. Nous aborderons dabord les
avantages de ces cibles et dmontrerons comment produire un groupe de projet
unique avec trois cibles diffrentes partageant les mmes units personnalises ;
il en rsulte un seul groupe de projets avec trois projets produisant une cible
diffrente pour le mme objet serveur DataSnap.
Bien que les applications serveur DataSnap que nous avons conues fonctionnent
correctement, certains moments il est impossible de dployer ces applications
serveur. Par exemple, lorsquil est impossible ou interdit douvrir les ports requis
du pare-feu pour permettre aux clients de se connecter au serveur. Cependant,
dans la plupart des cas, un site Web est hberg sur un serveur Web et le port
80 est gnralement ouvert (pour le serveur Web).
Si nous supposons que Microsoft Internet Information Services (IIS) est utilis
comme serveur Web, nous pouvons utiliser le nouvel assistant Application
DataSnap WebBroker pour produire un projet qui sera dploy sur IIS.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Cet assistant propose trois choix dont lun nest pas vritablement une
application WebBroker mais essentiellement un client de dbogage dapplication
Web nutiliser qu cette fin. Ce client est trs puissant puisquil permet
dutiliser le Dbogueur dapplication Web (dans le menu Outils de lEDI Delphi)
comme application hte tout en dboguant lapplication Client DataSnap avec le
dbogueur dapplication Web.
Le dbogage des applications CGI ou ISAPI/NSAPI est plus dlicat. Par
consquent le Dbogueur dapplication Web est un choix pertinent pour les
applications encore en dveloppement.
Les cibles restantes (DLL ISAPI/NSAPI/Excutable autonome CGI) peuvent tre
slectionnes pour de vritables projets serveur DataSnap.
Remarquons que le choix de Excutable autonome CGI nest pas une excellente
ide car cet excutable sera charg/dcharg chaque requte entrante. En
ajoutant le temps de connexion une base de donnes pour effectuer quelques
oprations, on comprend bien les problmes de performance qui peuvent se
poser. Lutilisation dune cible ISAPI rsultera dans une DLL qui nest charge
quune fois et demeure en mmoire afin que les requtes suivantes (dautres
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Aprs avoir cliqu sur OK, un nouveau projet est cr avec trois units. En
labsence de fichiers Project1 et Unit1 dans le rpertoire de projets par dfaut, le
projet sera dnomm Project1 et les units Unit1, ServerMethodsUnit1 et Unit2.
La premire unit doit tre un formulaire vide unique pour lExcutable
dbogueur dapplication Web et non requis pour les autres cibles Web.
Enregistrez cette unit dans WADForm.pas. La deuxime unit est dnomme
ServerMethodsUnit1.pas et contient notre module serveur driv de
TDSServerModule comme indiqu dans la bote de dialogue. Nous reviendrons
cette unit dans un moment ; nous pouvons lenregistrer pour linstant sous le
nom ServerMethodsUnit1.pas. La troisime unit dnomme Unit2 est un module
Web trois composants dj prsents (trois, si vous navez pas coch loption
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Cliquez sur OK pour gnrer un nouveau projet (qui sera ajout au groupe),
nomm Project1, avec les units ServerMethodUnit2.pas et Unit1.pas ajoutes
au nouveau projet.
Maintenant, au lieu dutiliser les nouvelles units ServerMethodUnit2.pas et
Unit1.pas, nous devons utiliser ServerMethodUnit1.pas et DSWebMod.pas qui
font dj parti du projet DSWADServer. Cliquez avec le bouton droit sur le nud
ServerMethodUnit2.pas sous le nud Project1.dll et slectionnez Retirer du
Projet. Cliquez sur OK dans la bote de dialogue de confirmation (remarquez que
si vous ne les avez pas encore sauvegardes, il nest naturellement pas utile de
supprimer les fichiers ServerMethodUnit2.pas et .dfm du disque). Faites de
mme avec Unit1.pas, afin que Project1.dll ne contienne plus dunits. Ensuite,
cliquez avec le bouton droit sur Project1.dll et ajoutez les units DSWebMod.pas
et ServerMethodUnit1.pas au projet. Finalement, renommez Project1 en
DSISAPIServer.dproj pour complter le groupe de projet.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Vous devriez avoir maintenant un groupe avec deux projets partageant les units
DSWebMod et DSSererMethodUnit1.pas comme prsent dans la copie dcran
suivante :
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Sans quil soit ncessaire dcrire une application client DataSnap, nous pouvons
dsormais tester certaines mthodes. Par exemple EchoString (pour sassurer du
retour de ce que nous envoyons).
Si nous cliquons avec le bouton droit sur la procdure
TServerMethods1.EchoString, nous pouvons choisir Afficher les paramtres pour
afficher une nouvelle fentre dans lEDI o nous pourrons saisir la valeur du
paramtre de Value (par exemple 42). Ensuite, en cliquant avec le bouton droit
sur cette nouvelle fentre, nous pouvons slectionner Excuter pour excuter la
mthode serveur distante. Le rsultat est affich ci-dessous :
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Ceci dmontre que nous pouvons appeler les mthodes serveur personnalises
depuis le serveur DataSnap. Pour connecter lapplication client DataSnap au
serveur, il suffit de modifier les proprits de TSQLConnection. Prcdemment,
nous nous sommes connects la version Windows du serveur DataSnap ; nous
devons maintenant modifier ces paramtres pour se connecter la version Web.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
6. REST
ET
JSON...
Lappel de cette URL REST produit un rsultat JSON, par exemple dans le navigateur :
Marco Cant fournit dautres dtails sur REST dans son livre blanc consacr
Delphi 2010 et aux clients REST.
Dans cet exemple, la mthode de rappel indique la valeur passe la mthode EchoString,
avant que la mthode neffectue un vritable retour (cest--dire pendant quelle est encore
en cours dexcution). Limplmentation de la nouvelle mthode EchoString ct serveur doit
dsormais disposer la valeur de chane dans un objet TJSONObject et la passer la
mthode callback.Execute comme suit :
function TServerMethods2.EchoString(Value: string; callback: TDBXcallback): string;
var
msg: TJSONObject;
pair: TJSONPair;
begin
Result := Value;
msg := TJSONObject.Create;
pair := TJSONPair.Create('ECHO', Value);
pair.Owned := True;
msg.AddPair(pair);
callback.Execute(msg);
end;
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Vous pouvez dcocher la bote Always use this selection sauf bien sr si vous
ne voulez construire que des connexions de donnes DataSnap.
Cliquez sur Continue pour obtenir la page suivante du dialogue. Vous pouvez
alors indiquer les dtails de connexion au serveur DataSnap. Dans la liste de
choix Protocol, nous pouvons choisir tcp/ip ou http. Ensuite, vous devez indiquer
lhte (cest--dire le nom de la machine sur laquelle le serveur DataSnap est
excut ventuellement localhost si vous effectuez les tests sur la mme
machine locale). Ensuite, vous devez indiquer le numro de port. Par dfaut, il
sagira du port 80 pour HTTP et du port 211 pour TCP/IP, mais vous savez
maintenant que les deux valeurs peuvent (ou doivent) tre diffrentes assurezvous au moins dindiquer la mme valeur ici que celle indique dans le/les
composants de transport de lunit ServerContainerUnitDemo.
La proprit suivante contient le chemin daccs. Il nest important que si vous
devez vous connecter un serveur DataSnap bas sur Web Broker (o vous
devez indiquer le chemin URL pour accder au serveur Web DataSnap c'est-dire, la partie aprs the http://..../ domaine.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Cliquez sur le bouton de test de connexion pour vrifier que la connexion peut
tre ralise vers le serveur DataSnap indiqu. Ceci vous permettra dafficher le
message Test connection succeeded si tout a t indiqu correctement.
Lorsque vous cliquez sur OK, une nouvelle entre pour la connexion DataSnap
sera ajoute larbre des connexions aux donnes (dans ce cas pour un nud
localhost). Si vous devez dvelopper le nouveau nud, vous trouverez des sousnuds pour Tables, Views et Stored Procedures ; les deux premiers sont vides
mais Stored Procedures doit contenir toutes les mthodes serveur exposes du
serveur DataSnap y compris nos mthodes personnalises EchoString,
GetEmployees et ServerTime.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Si vous cliquez sur OK, un nouveau projet DataSnapClient sera cr dans lEDI
Delphi Prism avec une unit Main.pas pour le formulaire principal.
Dans Server Explorer, slectionnez la nouvelle connexion vers le serveur
DataSnap que nous avons cre la section prcdente. Lexplorateur de
proprits affiche les proprits et notamment ConnectionString qui doit se
prsenter comme suit :
communicationprotocol=http;hostname=localhost;port=8080;dsauthenticationuser=Bob;ds
authenticationpassword=Swart
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
'communicationprotocol=http;hostname=localhost;port=8080;dsauthenticationuser=Bob;dsa
enticationpassword=Swart';
Connection.Open;
try
Client := ClientProxy1.TServerMethods1Client.Create(Connection);
MessageBox.Show(
Client.EchoString('Delphi Prism 2010'));
finally
Connection.Close;
end;
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
end;
'communicationprotocol=http;hostname=localhost;port=8080;dsauthenticationuser=Bob;dsa
enticationpassword=Swart';
Connection.Open;
try
Client := ClientProxy1.TServerMethods1Client.Create(Connection);
Employees := Client.GetEmployees;
ds := new DataSet();
dt := new DataTable("DataSnap");
ds.Tables.Add(dt);
ds.Load(Employees, LoadOPtion.PreserveChanges, ds.Tables[0]);
dataGridView1.DataSource := ds.Tables[0];
MessageBox.Show(
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
Le rsultat est les donnes suivantes prsentes dans une vue en grille d'une
application Delphi Prism WinForms dmontrant que nous pouvons crire des
clients .NET lgers pour se connecter aux serveurs DataSnap.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.
8. SYNTHSE
Nous avons dmontr dans ce livre blanc que nous pouvons utiliser DataSnap o
nous voulons (sous Windows avec une interface, un service ou une application
console ou sur le Web avec une application CGI, ISAPI ou Dbogueur
dapplication Web) ainsi que comme clients Win32 ou .NET et comme nous
voulons en utilisant TCP/IP, HTTP avec authentification HTTP et sur option avec
des filtres de compression, de cryptage, etc.
DataSnap 2010 offre des extensions et amliorations substantielles par rapport
DataSnap 2009 et des volutions remarquables depuis les versions originales de
DataSnap et MIDAS bases sur COM.
Bob Swart Bob Swart Training & Consultancy (eBob4)^
Embarcadero Technologies, Inc. est un diteur leader de solutions primes pour
les dveloppeurs dapplications et les professionnels des bases de donnes pour
les aider concevoir et excuter plus efficacement et rapidement leurs solutions
quels que soient les langages de programmation ou les plates-formes. 90 des
100 premires socits mondiales du classement Fortune et une communaut
active de plus de 3 millions dutilisateurs dans le monde font confiance aux outils
dEmbarcadero pour maximiser leur productivit, rduire les cots, simplifier la
gestion du changement et de la conformit et acclrer linnovation.
Les produits phares dEmbarcadero sont notamment : Embarcadero Change
Manager, RAD Studio, DBArtisan, Delphi, ER/Studio, JBuilder et Rapid
SQL. La socit Embarcadero a t cre en 1993 et son sige se situe San
Francisco ; lentreprise est prsente dans le monde entier et son site Web peut
tre consult ladresse www.embarcadero.com.
Copyright 2009 Bob Swart (aka Dr.Bob - www.drbob42.com). Tous droits rservs.