ORDA-Datenmodell-Klassen und REST

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
$obj
numberOfStudents$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!

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert ist seit 2017 als Product Owner im 4D Produktteam tätig. Als Product Owner ist sie für das Schreiben der User Stories und deren Umsetzung in funktionale Spezifikationen zuständig. Ihre Aufgabe ist es auch, sicherzustellen, dass die Implementierung der Funktionen den Anforderungen des Kunden entspricht. Marie-Sophie ist Absolventin der ESIGELEC Ingenieurschule und begann ihre Karriere als Ingenieurin bei IBM im Jahr 1995. Sie nahm an verschiedenen Projekten teil (Wartungs- oder Build-Projekte) und arbeitete als Cobol-Entwicklerin. Dann arbeitete sie als UML-Designerin und Java-Entwicklerin. In letzter Zeit bestand ihre Hauptaufgabe darin, funktionale Anforderungen zu analysieren und zu schreiben sowie Geschäfts- und Entwicklungsteams zu koordinieren.