Classes du modèle de données ORDA et REST

Traduit automatiquement de Deepl

Dans un précédent billet de blog, vous avez découvert les classes ORDA et les possibilités qu’elles offrent pour faciliter votre expérience de codage. Dans ce billet de blog, vous verrez comment les utiliser avec le serveur REST.

Voyons cela en action !

HDI : Exemples d’utilisation des classes ORDA avec le serveur REST

Nous avons une base de données nommée LearningSystem qui contient les tables suivantes :

Cette base de données est exposée en tant que serveur REST sur localhost (port 8044). Toutes les fonctions définies dans ses classes peuvent être appelées en utilisant des requêtes REST dans une opération POST.

Appel d’une fonction définie dans la classe datastore

L’objet datastore est récupéré en utilisant le préfixe /rest/$catalog.

Une fonction getStatistics() a été définie dans la classe DataStore dat astore. La fonction renvoie une collection contenant des informations sur les écoles.

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

Vous pouvez l’appeler avec l’URL http://127.0.0.1:8044/rest/$catalog/getStatistics.

Voici la réponse du serveur :

{
"result" : [
{
"name" : "Old school",
"city" : "Solebury",
"numberOfStudents" : 3
},
{
"name" : "Institut d'histoire",
"Ville" : "Solebury",
"numberOfStudents" : 3
},
{
"name" : "Université 4D,
, ville : "Hummelstown",
"numberOfStudents" : 3
}
]
}

Appel d’une fonction définie dans une classe de données

On accède à un objet de classe de données via le préfixe /rest/dataClassName.

Une fonction registerStudent() a été définie dans la classe de classe de données Schools. La fonction reçoit les données de l’étudiant dans un objet et vérifie si le niveau d’anglais de l’étudiant correspond au niveau requis par l’école. Si son niveau d’anglais est correct, la fonction crée et enregistre l’entité 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:= "Le niveau d'anglais n'est pas suffisant"
$0 :=$result

End if

If ($result.success)
$student :=ds.Students.new()

$student .fromObject($data)
$student .finalExam:= "A prendre"
$student .school:=$school

$result :=$student.save()

$0 :=$student
End if

Il est accessible via l’URL http://127.0.0.1:8044/rest/Schools/registerStudent.

Les paramètres doivent être passés sous forme de collection, dans le corps de la requête:

[
{
"firstname" : "Mary",
"lastname" : "Smith",
"englishLevel" : 2,
"schoolName" : "École de mathématiques"
}
]

Voici la réponse du serveur :

{
"__entityModel" : "Students",
"__DATACLASS" : "Students",
"__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"
}
}
}

Appel d’une fonction définie dans une classe d’entité

On accède à un objet entité par le préfixe /rest/dataClassName(key), où key est la clé primaire de l’entité.

Une fonction studyingInSameCity() a été définie dans la classe d’entité StudentsEntity. Elle renvoie tous les autres étudiants qui étudient dans la même ville que l’étudiant actuel.

Class extends Entity

Function studyingInSameCity
C_OBJECT($0;$city)

$city :=This.school.city
$0 :=$city.schools.students.
minus (This)

Cet exemple concerne une entité dont la clé primaire est 7 et à laquelle on accède via l’URL http://127.0.0.1:8044/rest/Students(7)/studyingInSameCity/?$attributes=firstname, lastname.

Nous appliquons la fonction studyingInSameCity() sur cette entité et filtrons les attributs renvoyés pour obtenir uniquement le prénom et le nom (/?$attributes=firstname, lastname).

Voici la réponse du serveur :

{
"__DATACLASS" : "Students",
"__entityModel" : "Students",
"__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
}

Appel d’une fonction définie dans une classe de sélection d’entités

Il est possible d’accéder à un objet de sélection d’entités via la syntaxe du filtre. Par exemple, /?$filter= »finalExam=’To take' » pour obtenir tous les étudiants dont la valeur de l’attribut finalExam est « To take ».

Il est également possible d’accéder à une sélection d’entités par d’autres moyens, alors n’oubliez pas de consulter la documentation.

Une fonction setFinalExam() a été définie dans la classe de sélection d’entités StudentsSelection. Elle met à jour l’attribut finalExam de chaque étudiant avec la valeur donnée.

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

Dans cet exemple, il est accessible via l’URL http://127.0.0.1:8044/rest/Students/setFinalExam/?$filter= »finalExam=’To take' » URL.

Voici le corps de la requête :

[
"Passed"
]

Voici la réponse du serveur (tous les étudiants concernés ont été correctement mis à jour) :

{
"result" : {
"success" : true
}
}

Téléchargez le HDI pour voir tout ce qui précède en action.

Remarque :
N’oubliez pas de consulter cet article sur les mots-clés. Depuis 4D v18 R5, les fonctions ne sont pas exposées par défaut. N’oubliez pas de marquer les fonctions que vous souhaitez exposer !

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert a rejoint l'équipe de 4D Product en tant que Product Owner en 2017. En tant que Product Owner, elle est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Marie-Sophie est diplômée de l'école d'ingénieur ESIGELEC et a commencé sa carrière en tant qu'ingénieur chez IBM en 1995. Elle a participé à divers projets (projets de maintenance ou de construction) et a travaillé en tant que développeur Cobol. Elle a ensuite travaillé en tant que concepteur UML et développeur Java. Dernièrement, ses principaux rôles étaient d'analyser et de rédiger des exigences fonctionnelles, de coordonner les équipes commerciales et de développement.