Tutorial: Implementieren Ihrer ersten RAD Server-Ressource

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Übersicht über RAD Server-Ressourcen


Sie können eine neue Ressource für den EMS-Server anlegen, indem Sie ein EMS-Package erstellen.

So erstellen Sie ein neues Delphi-Package:

  1. Öffnen Sie Datei > Neu > Weitere .
  2. Wählen Sie Delphi-Projekte > EMS > EMS-Package.
  3. Wählen Sie Package mit Ressource erstellen, und klicken Sie auf Weiter.
  4. Geben Sie als Ressourcennamen "Test" ein.
  5. Für dieses Beispiel können Sie entweder Datenmodul oder Unit auswählen.
  6. Klicken Sie auf Weiter.
  7. Wählen Sie Get und GetItem aus, und klicken Sie auf Fertig stellen.

Fügen Sie in die Unit, die Ihrem Projekt hinzugefügt wurde, den folgenden Code ein:

Erstellen Sie eine neue Funktion:

  • Für Delphi:
type
  [ResourceName('Test')]
  TTestResource1 = class(TDataModule)
  private
    // Declare the function
    function MakeJSON(I: Integer): TJSONObject; //It takes an integer as a parameter and returns a JSON Object.
  published
    procedure Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
    [ResourceSuffix('{item}')]
    procedure GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  end;
  • Für C++ (in der Datei Unit1.h):
class TTestResource1 : public TDataModule
{
__published:
private:
	TJSONObject* MakeJSON(int I);
public:
	__fastcall TTestResource1(TComponent* Owner);
	void Get(TEndpointContext* AContext, TEndpointRequest* ARequest, TEndpointResponse* AResponse);
	void GetItem(TEndpointContext* AContext, TEndpointRequest* ARequest, TEndpointResponse* AResponse);
};

Rufen Sie durch Drücken von STRG+UMSCHALT+C die Klassenvervollständigung auf, um im implementation-Abschnitt einen Rumpf (Stub) für diese Funktion zu erstellen.

Schreiben Sie Code für die gerade hinzugefügte Funktion:

  • Für Delphi:
function TTestResource1.MakeJSON(I: Integer): TJSONObject;
begin
  Result := TJSONObject.Create; 
  Result.AddPair('index', TJSONNumber.Create(I)); //Adds to the JSON object a pair {"index": I}, the index number.
  Result.AddPair('value', TJSONString.Create(TestValues[I])); //Adds to the the JSON object a pair {"value":String}, the string corresponding to the index number. 
end;
  • Für C++ (in der Datei Unit1.cpp):
TJSONObject* TTestResource1::MakeJSON(int I) {
	TJSONObject *result = new TJSONObject();
	result->AddPair(new TJSONPair("index", new TJSONNumber(I)));
	result->AddPair(new TJSONPair("value", new TJSONString(TestValues[I])));
	return result;
}

Fügen Sie die Konstanten in den implementation-Abschnitt unter einer uses-Anweisung ein:

  • Für Delphi:
const
  TestValues: array [0 .. 2] of string = ('a', 'b', 'c'); // It creates an array of string values.
  • Für C++ (in der Datei Unit1.cpp):
 const char* TestValues[] = { "a", "b", "c" };

Schreiben Sie Code für den Get-Endpunkt:

  • Für Delphi:
procedure TTestResource1.Get(const AContext: TEndpointContext;
  const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
  LJSON: TJSONArray;
  I: Integer;
begin
  LJSON := TJSONArray.Create; 
  for I := Low(TestValues) to High(TestValues) do 
    LJSON.Add(MakeJSON(I)); //[{"index":0,"value":"a"},{"index":1,"value":"b"},{"index":2,"value":"c"}]
  AResponse.Body.SetValue(LJSON, True) // True causes AResponse to free JSON

end;
  • Für C++ (in der Datei Unit1.cpp):
void TTestResource1::Get(TEndpointContext* AContext, TEndpointRequest* ARequest, TEndpointResponse* AResponse) {
	int I;
	TJSONArray *LJSON = new TJSONArray();
	int TestValuesSize = sizeof(TestValues) / sizeof(TestValues[0]);
	for (I = 0; I < TestValuesSize; I++) {
		LJSON->Add(MakeJSON(I));
	}
	AResponse->Body->SetValue(LJSON, true);
}

Schreiben Sie Code für den GetItem-Endpunkt:

  • Für Delphi:
procedure TTestResource1.GetItem(const AContext: TEndpointContext;
  const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
  I: Integer;
begin
  if not TryStrToInt(ARequest.Params.Values['item'], I) then //{"index":I,"value":value}
    AResponse.RaiseBadRequest('Index expected');
  if (I < 0) or (I >= Length(TestValues)) then
    AResponse.RaiseBadRequest('Index out of range');
  AResponse.Body.SetValue(MakeJSON(I), True);
  // True causes AResponse to free JSON
end;
  • Für C++ (in der Datei Unit1.cpp):
void TTestResource1::GetItem(TEndpointContext* AContext, TEndpointRequest* ARequest, TEndpointResponse* AResponse) {
	String item;
	int I = 0;
	int TestValuesSize = sizeof(TestValues) / sizeof(TestValues[0]);
	item = ARequest->Params->Values["item"];
	if (!(TryStrToInt(item, I))) {
		AResponse->RaiseBadRequest("Index expected");
	}
	else {
		if ((I < 0) || (I >= TestValuesSize))
			AResponse->RaiseBadRequest("Index out of range");
		else
			AResponse->Body->SetValue(MakeJSON(I), true);
	}

}

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\22.0\bin\EMSDevServer.exe
  3. Führen Sie das Projekt aus. Der Fenster des Servers wird geöffnet.

Fügen Sie in einem Browser die folgenden URLs ein:

  http://localhost:8080/test/  //It uses the Get() endpoint to get all the JSON array
  http://localhost:8080/test/1//It uses the GetItem() endpoint to get the first item of the array.
  http://localhost:8080/test/2
  http://localhost:8080/test/3
  <localhost>:<port_number>/resource/parameter
  <ip_address>:<port_number>/resource/parameter

Siehe auch