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
$objnumberOfStudents$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 !