Tutoriel : Implémentation de votre première ressource FireDAC RAD Server

De RAD Studio
Aller à : navigation, rechercher

Remonter à Présentation des ressources de RAD Server


Vous pouvez utiliser un package EMS pour étendre le serveur afin d'exposer des ressources à partir d'une base de données en utilisant FireDAC. Après avoir étendu le serveur, vous pouvez utiliser le serveur de la console EMS pour voir les analyses des appels de points de terminaison.

Pour créer votre propre API FireDAC d'extension du serveur EMS, vous devez créer un package EMS avec les ressources.

Présentation et architecture

EMS FireDAC Schema.png

Cet exemple crée un package EMS Delphi pour exposer des données à partir d'une base de données InterBase en utilisant FireDAC.

Pour créer la nouvelle ressource :

  1. Choisissez Fichier > Nouveau > Autre > Nouveaux éléments.
  2. Créez un nouveau package EMS :
    • Pour Delphi : Projets Delphi > EMS > Package EMS.
    • Pour C++ : Projets C++Builder > EMS > Package EMS.
  3. Sélectionnez Créer un package avec la ressource et cliquez sur Suivant.
  4. Entrez un nom de ressource, par exemple "FireDACTest".
  5. Sélectionnez Module de données et cliquez sur Suivant.
  6. Sélectionnez Get et Post et cliquez sur Terminer.

Dans le fichier Unit1.dfm, ajoutez les composants suivants :

  • Un composant TFDConnection pour établir la connexion à la base de données.
    • Cliquez avec le bouton droit pour ouvrir l'éditeur de connexion.
    • Définissez la propriété Driver ID sur IB.
    • Définissez la propriété Database sur C:\Utilisateurs\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\EMPLOYEE.GDB.
    • Définissez les propriétés User_Name et Password sur sysdba / masterkey si vous utilisez les paramètres par défaut.
  • Un composant TFDPhysIBDriverLink.
  • Un composant TFDGUIxWaitCursor.
  • Un composant TFDStanStorageJSONLink.
  • Un composant TFDSchemaAdapter.
  • Deux composants TFDQuery.
    • Renommez un TFDQuery en QEmployee et l'autre en QCustomer.
    • Sélectionnez le TFDConnection pour la propriété Connection.
    • Pour la propriété SchemaAdapter, sélectionnez le TFDSchemaAdapter à partir de la zone de liste déroulante.
    • Cliquez avec le bouton droit pour ouvrir l'éditeur de requête....
    • Entrez la commande SQL :
      • Dans le composant QEmployee : Select * from employee.
      • Dans le composant QCustomer : Select * from customer.
    • Définissez la propriété CachedUpdates sur True.
  • Deux composants TDataSource.
    • Renommez un TDataSource en DEmployee et l'autre en DCustomer.
    • Sur la propriété DataSet, sélectionnez la requête correspondante.
EMSFireDACResource.png

Ecrivez le code suivant dans l'onglet Code :

  • Pour Delphi :
  published
    [EndpointName('GetRecords')] // Name of the call to show in the analytics.
    procedure Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
    [EndpointName('PostUpdates')] // Name of the call to show in the analytics.
    procedure Post(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  • Pour C++ (dans le fichier Unit1.cpp) :
void __fastcall PACKAGE Register()
{
		std::auto_ptr<TEMSResourceAttributes> attributes(new TEMSResourceAttributes());
		attributes->ResourceName = "FireDACTest";
		attributes->EndPointName["Get"] = "GetRecords";
		attributes->EndPointName["Post"] = "PostUpdates";
	RegisterResource(__typeinfo(TFireDACTestResource1), attributes.release());
}

Ecrivez le code pour la procédure Get :

  • Pour Delphi :
procedure TFireDACTestResource1.Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
  oStr: TMemoryStream;
begin
  oStr := TMemoryStream.Create;
  try
    QEmployee.Open;
    QCustomer.Open;
    FDSchemaAdapter1.SaveToStream(oStr, TFDStorageFormat.sfJSON);
    // Response owns stream
    AResponse.Body.SetStream(oStr, 'application/json', True);
  except
    oStr.Free;
    raise;
  end;
end;
  • Pour C++ (dans le fichier Unit1.cpp) :
void TFireDACTestResource1::Get(TEndpointContext* AContext, TEndpointRequest* ARequest, TEndpointResponse* AResponse) {
		std::auto_ptr<TMemoryStream> oStr(new TMemoryStream());
		QEmployee->Open();
		QCustomer->Open();
		FDSchemaAdapter1->SaveToStream(oStr.get(), TFDStorageFormat::sfJSON);
		AResponse->Body->SetStream(oStr.release(), "application/json", true);
}

Ecrivez le code pour la procédure Post :

  • Pour Delphi :
procedure TFireDACTestResource1.Post(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
  LStream: TStream;
begin
  if not SameText(ARequest.Body.ContentType, 'application/json') then
    AResponse.RaiseBadRequest('content type');
  if not ARequest.Body.TryGetStream(LStream) then
    AResponse.RaiseBadRequest('no stream');
  LStream.Position := 0;
  FDSchemaAdapter1.LoadFromStream(LStream, TFDStorageFormat.sfJSON);
  FDSchemaAdapter1.ApplyUpdates
end;
  • Pour C++ (dans le fichier Unit1.cpp) :
void TFireDACTestResource1::Post(TEndpointContext* AContext, TEndpointRequest* ARequest, TEndpointResponse* AResponse) {
	TStream* LStream;
	if (!(SameText(ARequest->Body->ContentType, "application/json")))
		AResponse->RaiseBadRequest("content type");
	if (!(ARequest->Body->TryGetStream(LStream)))
		AResponse->RaiseBadRequest("no stream");
	LStream->Position = 0;
	FDSchemaAdapter1->LoadFromStream(LStream, TFDStorageFormat::sfJSON);
	FDSchemaAdapter1->ApplyUpdates();
}
Seulement pour C++ : Ajoutez le package du composant suivant et ses dépendances au noeud Requiert :
  1. Dans le Gestionnaire de projets, double-cliquez sur le noeud Requiert.
  2. Sélectionnez Ajouter une référence ... .
  3. Définissez le champ Chemin de recherche sur : C:\Program Files (x86)\Embarcadero\Studio\22.0\lib\win32\release
  4. Ajoutez les packages suivants au champ Nom du package :
FireDACCommonDriver.bpi FireDACCommon.bpi FireDAC.bpi FireDACIBDriver.bpi

Test de la nouvelle ressource

Pour tester votre projet sur un environnement de développeur :

  1. Choisissez Exécuter > Paramètres.
  2. Contrôlez le champ Application hôte pour voir si le chemin d'accès à l'exécutable du serveur EMS est correct. Le chemin d'accès est C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\EMSDevServer.exe.
  3. Choisissez Exécuter > Exécuter sans débogage pour exécuter le projet.
  4. La fenêtre du serveur s'ouvre. Cliquez sur Ouvrir le navigateur pour ouvrir le serveur dans un navigateur standard.
    Remarque : Une fenêtre apparaît dans laquelle vous pouvez apporter les changements nécessaires à votre projet. Cliquez sur OK.

Si vous exécutez le serveur pour la première fois, vous devez suivre les étapes relatives à l'exécution dans un environnement de développeur pour créer le fichier IB et le fichier de configuration.

Entrez l'URL suivante dans un navigateur :

 http://localhost:8080/FireDACTest/  //It shows the defined queries as JSON data.

Le résultat doit ressembler à ceci :

{"FDBS":{"Version":14,"Manager":{"UpdatesRegistry":true,"TableList":[{"class":"Table","Name":"QEmployee","SourceName":"employee","SourceID":1,"TabID":0,"EnforceConstraints":false,"MinimumCapacity":50,"ColumnList":[{"class":"Column","Name":"EMP_NO","SourceName":"EMP_NO","SourceID":1,"DataType":"Int16","Searchable":true,"Base":true,"OInUpdate":true,"OInWhere":true,"OInKey":true,"OriginTabName":"EMPLOYEE","OriginColName":"EMP_NO"},{"class":"Column","Name":"FIRST_NAME","SourceName":"FIRST_NAME","SourceID":2,"DataType":"AnsiString","Size":15,"Searchable":true,"Base":true,"OInUpdate":true,"OInWhere":true,"OriginTabName":"EMPLOYEE","OriginColName":"FIRST_NAME","SourceSize":15},{"class":"Column","Name":"LAST_NAME","SourceName":"LAST_NAME","SourceID":3,"DataType":"AnsiString","Size":20,"Searchable":true,"Base":true,"OInUpdate":true,"OInWhere":true,"OriginTabName":"EMPLOYEE","OriginColName":"LAST_NAME","SourceSize":20},{"class":"Column","Name":"PHONE_EXT","SourceName":"PHONE_EXT","SourceID":4,"DataType":"AnsiString","Size":4,"Searchable":true,"AllowNull":true,"Base":true,"OAllowNull":true,"OInUpdate":true,"OInWhere":true,"OriginTabName":"EMPLOYEE","OriginColName":"PHONE_EXT","SourceSize":4},{"class":"Column","Name":"HIRE_DATE","SourceName":"HIRE_DATE","SourceID":5,"DataType":"DateTimeStamp","Searchable":true,"Base":true,"OInUpdate":true,"OInWhere":true,"OriginTabName":"EMPLOYEE","OriginColName":"HIRE_DATE"}, ...

Vous pouvez également voir les appels vers le point de terminaison 'GetRecords' sur la console. Pour de plus amples informations, voir Installation du serveur de la console EMS.

Voir aussi