In einem früheren Blog-Beitrag haben Sie mehr über ORDA-Klassen und die Möglichkeiten erfahren, die sie Ihnen bieten, um Ihre Codierungserfahrung zu verbessern. In diesem Blogbeitrag erfahren Sie, wie Sie sie mit dem REST-Server verwenden können.
Schauen wir uns das in Aktion an!
HDI: Beispiele für die Verwendung von ORDA-Klassen mit dem REST-Server
Wir haben eine Datenbank namens LearningSystem, die die folgenden Tabellen enthält:
Diese Datenbank ist als REST-Server auf localhost (Port 8044) verfügbar. Alle in den Klassen definierten Funktionen können über REST-Anfragen in einer POST-Operation aufgerufen werden.
Aufrufen einer in der Datastore-Klasse definierten Funktion
Das Datastore-Objekt wird mit dem Präfix /rest/$catalog abgerufen.
In der Datenspeicherklasse DataStore wurde eine Funktion getStatistics() definiert. Die Funktion gibt eine Sammlung mit Informationen über die Schulen zurück.
Class extends DataStoreImplementation
Function getStatistics
C_COLLECTION( ; ) ( ; ) := ( ; . . ) := . := . . := . . . := . . $0$result
C_OBJECT$obj$school
$resultNew collection()
For each$schoolThisSchoolsall()
$objNew object()
$objname$schoolname
$objcity$schoolcityname
$objnumberOfStudents$schoolstudentslength
$result . ( ) push$obj
End for each
$0:=$result
Sie können es mit der URL http://127.0.0.1:8044/rest/$catalog/getStatistics aufrufen.
Hier ist die Antwort des Servers:
{
"result": [
{
"name": "Alte Schule",
"Stadt": "Solebury",
"numberOfStudents": 3
},
{
"name": "History Institute",
"city": "Solebury",
"numberOfStudents": 3
},
{
"name": "4D University",
"city": "Hummelstown",
"numberOfStudents": 3
}
]
}
Aufruf einer Funktion, die in einer Datenklassenklasse definiert ist
Der Zugriff auf ein Datenklassenobjekt erfolgt über das Präfix /rest/dataClassName.
Eine Funktion registerStudent() wurde in der Datenklassenklasse Schools definiert. Die Funktion empfängt die Daten eines Schülers in einem Objekt und prüft, ob das Englischniveau des Schülers dem von der Schule geforderten Niveau entspricht. Wenn das Englischniveau in Ordnung ist, erstellt und speichert die Funktion die Entität Students.
Class extends DataClass
Function registerStudent
C_OBJECT($1;$data;$student;$school;$result;$0)
$data :=$1
$school :=ds.Schools.query("name = :1";$data.schoolName).first()
$result:=New object("success";True)
If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:="The english level is not enough"
$0 :=$result
End if
If ($result.success)
$student :=ds.Students.new()
$student .fromObject($data)
$student .finalExam:="To take"
$student .school:=$school
$result :=$student.save()
$0 :=$student
End if
Sie ist über die URL http://127.0.0.1:8044/rest/Schools/registerStudent zugänglich.
Die Parameter müssen als Sammlung im Körper der Anfrage übergeben werden:
[
{
"firstname": "Mary",
"lastname": "Smith",
"englishLevel": 2,
"schoolName": "Math school"
}
]
Hier ist die Antwort des Servers:
{
"__entityModel": "Schüler",
"__DATACLASS": "Studenten",
"__KEY": "9",
"__TIMESTAMP": "2020-06-03T13:08:13.542Z",
"__STAMP": 1,
"ID": 9,
"firstname": "Mary",
"lastname": "Smith",
"englishLevel": 2,
"schoolID": 4,
"finalExam": "To take",
"school": {
"__deferred": {
"uri": "/rest/Schools(4)",
"__KEY": "4"
}
}
}
Aufrufen einer in einer Entitätsklasse definierten Funktion
Auf ein Entitätsobjekt wird über das Präfix /rest/dataClassName(key) zugegriffen, wobei key der Primärschlüssel der Entität ist.
Eine Funktion studyingInSameCity() wurde in der Entitätsklasse StudentsEntity definiert. Sie gibt alle anderen Studenten zurück, die in derselben Stadt studieren wie der aktuelle Student.
Class extends Entity
Function studyingInSameCity
C_OBJECT($0;$city)
$city :=This.school.city
$0 :=$city.schools.students.minus (
This)
Dieses Beispiel bezieht sich auf eine Entität mit dem Primärschlüssel = 7. Der Zugriff erfolgt über die URL http://127.0.0.1:8044/rest/Students(7)/studyingInSameCity/?$attributes=firstname, lastname.
Wir wenden die studyingInSameCity() Funktion auf diese Entität an und filtern die zurückgegebenen Attribute, um nur Vor- und Nachname zu erhalten (/?$attributes=firstname, lastname).
Hier ist die Antwort des Servers:
{
"__DATACLASS": "Studenten",
"__entityModel": "Schüler",
"__GlobalStamp": 0,
"__COUNT": 3,
"__FIRST": 0,
"__ENTITIES": [
{
"__KEY": "5",
"__TIMESTAMP": "2020-06-16T13:59:51.095Z",
"__STAMP": 1,
"firstname": "Ricky",
"lastname": "Coyle"
},
{
"__KEY": "6",
"__TIMESTAMP": "2020-06-16T13:59:51.095Z",
"__STAMP": 1,
"firstname": "Alonzo",
"lastname": "Zapata"
}
],
"__SENT": 3
}
Aufruf einer Funktion, die in einer Entitätsauswahlklasse definiert ist
Auf ein Entitätsauswahlobjekt kann über die Filtersyntax zugegriffen werden. Zum Beispiel: /?$filter=“finalExam=’To take'“, um alle Schüler mit dem Wert „To take“ für das Attribut finalExam zu erhalten.
Auf eine Entity-Auswahl kann auch auf andere Weise zugegriffen werden; lesen Sie dazu die Dokumentation.
In der Entitätsauswahlklasse StudentsSelection wurde eine Funktion setFinalExam() definiert. Sie aktualisiert das Attribut finalExam eines jeden Schülers mit dem angegebenen Wert.
Class extends EntitySelection
Function setFinalExam
C_TEXT($1;$value)
C_OBJECT ($student;$status;$0)
$value :=$1
For each ($student;This) Until (Not($status.success))
$student.finalExam:=$value
$status :=$student.save()
End for each
$0 :=$status
In diesem Beispiel ist der Zugriff über die http://127.0.0.1:8044/rest/Students/setFinalExam/?$filter=“finalExam=’To take'“ URL.
Hier ist der Text der Anfrage:
[
"Bestanden"
]
Hier ist die Antwort des Servers (alle betroffenen Schüler wurden ordnungsgemäß aktualisiert):
{
"result": {
"Erfolg": true
}
}
Laden Sie den HDI herunter, um all das in Aktion zu sehen.
Anmerkung:
Schauen Sie sich unbedingt diesen Beitrag über Schlüsselwörter an. Seit 4D v18 R5 sind Funktionen standardmäßig nicht mehr sichtbar. Vergessen Sie nicht, die Funktionen zu markieren, die Sie freilegen möchten!