Tutorial: Implementieren einer FireDAC-EMS-Ressource

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Übersicht über EMS-Ressourcen


Mit einem EMS-Package können Sie den Server erweitern, um Ressourcen aus einer Datenbank mit FireDAC bereitzustellen. Nach der Erweiterung des Servers können Sie mit dem EMS-Konsolenserver die Analysen der Endpunktaufrufe anzeigen.

Um eine eigene FireDAC-API zur Erweiterung des EMS-Servers zu erstellen, müssen Sie ein EMS-Package mit den Ressourcen erstellen.

Übersicht und Architektur

EMS FireDAC Schema.png

In diesem Beispiel wird ein Delphi-EMS-Package zum Bereitstellen von Daten aus einer InterBase-Datenbank mit FireDAC erstellt.

So erstellen Sie die neue Ressource:

  1. Öffnen Sie Datei > Neu > Weitere > Objektgalerie.
  2. Erstellen Sie ein neues EMS-Package:
    • Für Delphi: Delphi-Projekte > EMS > EMS-Package.
    • Für C++: C++Builder-Projekte > EMS > EMS-Package.
  3. Wählen Sie Package mit Ressource erstellen, und klicken Sie auf Weiter.
  4. Geben Sie einen Ressourcennamen ein, beispielsweise "FireDACTest".
  5. Wählen Sie Datenmodul aus, und klicken Sie auf Weiter.
  6. Wählen Sie Get und Post aus, und klicken Sie auf Fertig stellen.

Fügen Sie der Unit1.dfm die folgenden Komponenten hinzu:

  • Eine TFDConnection-Komponente für die Verbindung mit der Datenbank.
    • Klicken Sie mit der rechten Maustaste, um den Verbindungseditor zu öffnen.
    • Setzen Sie die Eigenschaft Driver ID auf IB.
    • Setzen Sie Database auf C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Data\EMPLOYEE.GDB.
    • Setzen Sie User_Name und Password auf sysdba bzw. masterkey, wenn Sie die Standardparameter verwenden.
  • Eine TFDPhysIBDriverLink-Komponente.
  • Eine TFDGUIxWaitCursor-Komponente.
  • Eine TFDStanStorageJSONLink-Komponente.
  • Eine TFDSchemaAdapter-Komponente.
  • Zwei TFDQuery-Komponenten.
    • Benennen Sie eine der TFDQuery-Komponenten in QEmployee um, und die andere in QCustomer.
    • Setzen Sie die Eigenschaft Connection auf die TFDConnection.
    • Wählen Sie für die Eigenschaft SchemaAdapter den TFDSchemaAdapter aus dem Dropdown-Kombinationsfeld aus.
    • Klicken Sie mit der rechten Maustaste, um den Abfrageeditor zu öffnen.
    • Geben Sie jeweils folgende SQL-Anweisung ein:
      • In der QEmployee-Komponente: Select * from employee.
      • In der QCustomer-Komponente: Select * from customer.
    • Setzen Sie die Eigenschaft CachedUpdates auf True.
  • Zwei TDataSource-Komponenten.
    • Benennen Sie TDataSource in DEmployee um, und die andere Komponente in DCustomer.
    • In der Eigenschaft DataSet wählen Sie die entsprechende Abfrage.
EMSFireDACResource.png

Geben Sie im Quelltext-Editor den folgenden Code ein:

  • Für 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);
  • Für C++ (in der Datei 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());
}

Schreiben Sie Code für die Get-Prozedur.

  • Für 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;
  • Für C++ (in der Datei 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);
}

Schreiben Sie Code für die Post-Prozedur.

  • Für 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;
  • Für C++ (in der Datei 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();
}
Nur für C++: Fügen Sie das folgende Komponentenpackage und dessen Abhängigkeiten dem Erfordert-Knoten hinzu:
  1. Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf den Erfordert-Knoten.
  2. Wählen Sie Referenz hinzufügen ... .
  3. Legen Sie das Feld Suchpfad auf: C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\win32\release
  4. Fügen Sie in das Feld Packagename Folgendes ein:
FireDACCommonDriver.bpi FireDACCommon.bpi FireDAC.bpi FireDACIBDriver.bpi

Testen der neuen Ressource

So testen Sie Ihr Projekt in einer Entwicklungsumgebung:

  1. Wählen Sie Start > Parameter.
  2. Überprüfen Sie, ob im Feld Host-Anwendung der Pfad zur ausführbaren Datei des EMS-Servers korrekt angegeben ist. Der Pfad lautet C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\EMSDevServer.exe.
  3. Wählen Sie Start > Ohne Debugger ausführen, um das Projekt auszuführen.
  4. Das Fenster des Servers wird geöffnet. Klicken Sie auf Browser öffnen, um den Server in Ihrem Standardbrowser zu öffnen.
    Hinweis: Ein Fenster wird angezeigt, in dem Sie einige erforderliche Änderungen an Ihrem Projekt vornehmen können. Klicken Sie auf OK.

Wenn Sie den Server zum ersten Mal ausführen, müssen Sie die Schritte unter Ausführen einer Entwicklungsumgebung befolgen, um die IB-Datei und die Konfigurationsdatei zu erstellen.

Geben Sie in einem Browser den folgenden URL ein:

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

Das Ergebnis sollte wie folgt aussehen:

{"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"}, ...

Die Aufrufe des "GetRecords"-Endpunkts werden auch in der Konsole angezeigt. Weitere Informationen finden Sie unter Einrichten des EMS-Konsolenservers.

Siehe auch