Tutorial: Implementieren Ihrer ersten EMS-Ressource
Nach oben zu Übersicht über EMS-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:
- Öffnen Sie Datei > Neu > Weitere .
- Wählen Sie Delphi-Projekte > EMS > EMS-Package.
- Wählen Sie Package mit Ressource erstellen, und klicken Sie auf Weiter.
- Geben Sie als Ressourcennamen "Test" ein.
- Für dieses Beispiel können Sie entweder Datenmodul oder Unit auswählen.
- Klicken Sie auf Weiter.
- 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:
- Wählen Sie Start > Parameter
- Ü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\19.0\bin\EMSDevServer.exe
- 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