In un precedente post del blog, avete imparato a conoscere le classi ORDA e le possibilità che offrono per rendere più fluida la vostra esperienza di codifica. In questo blog post, vedrete come utilizzarle con il server REST.
Vediamolo in azione!
HDI: esempi di utilizzo delle classi ORDA con il server REST
Abbiamo un database chiamato LearningSystem che contiene le seguenti tabelle:
Questo database è esposto come server REST su localhost (porta 8044). Tutte le funzioni definite nelle sue classi possono essere richiamate tramite richieste REST in un’operazione POST.
Chiamata di una funzione definita nella classe datastore
L’oggetto datastore viene recuperato utilizzando il prefisso /rest/$catalog.
Una funzione getStatistics() è stata definita nella classe DataStore del datastore. La funzione restituisce un insieme di informazioni sulle scuole.
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
È possibile richiamarlo con l’URL http://127.0.0.1:8044/rest/$catalog/getStatistics.
Ecco la risposta del server:
{
"result": [
{
"nome": "Old school",
"city": "Solebury",
"numberOfStudents": 3
},
{
"nome": "Istituto di Storia",
"città": "Solebury",
"numberOfStudents": 3
},
{
"name": "4D University",
"city": "Hummelstown",
"numberOfStudents": 3
}
]
}
Richiamo di una funzione definita in una classe di dati
Si accede a un oggetto classe di dati tramite il prefisso /rest/dataClassName.
Una funzione registerStudent() è stata definita nella classe di dati Scuole. La funzione riceve i dati dello studente in un oggetto e verifica se il livello di inglese dello studente corrisponde al livello richiesto dalla scuola. Se il livello d’inglese è corretto, la funzione crea e salva l’entità Studente.
Class extends DataClass
Function registerStudent
C_OBJECT($1;$data;$student;$school;$result;$0)
$data :=$1
$school :=ds.Schools.query("nome = :1";$data.schoolName).first()
$result:=New object("successo";True)
If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:= "Il livello di inglese non è sufficiente"
$0 :=$result
End if
If ($result.success)
$student :=ds.Students.new()
$student .fromObject($data)
$student .finalExam:="Prendere"
$student .school:=$school
$result :=$student.save()
$0 :=$student
End if
È accessibile attraverso l’URL http://127.0.0.1:8044/rest/Schools/registerStudent.
I parametri devono essere passati come una collezione, nel corpo della richiesta:
[
{
"firstname": "Mary",
"lastname": "Smith",
"englishLevel": 2,
"schoolName": "Math school"
}
]
Ecco la risposta del server:
{
"__entityModel": "Students",
"__DATACLASS": "Studenti",
"__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"
}
}
}
Chiamare una funzione definita in una classe entità
Si accede a un oggetto entità tramite il prefisso /rest/dataClassName(key), dove key è la chiave primaria dell’entità.
Nella classe di entità StudentsEntity è stata definita una funzione studyingInSameCity(). Essa restituisce tutti gli altri studenti che studiano nella stessa città dello studente corrente.
Class extends Entity
Function studyingInSameCity
C_OBJECT($0;$city)
$city :=This.school.city
$0 :=$city.schools.students.minus (
This)
Questo esempio riguarda un’entità con chiave primaria = 7. Vi si accede tramite l’URL http://127.0.0.1:8044/rest/Students(7)/studyingInSameCity/?$attributes=firstname, lastname.
Applichiamo la funzione studyingInSameCity() su questa entità e filtriamo gli attributi restituiti per ottenere solo nome e cognome (/?$attributes=firstname, lastname).
Ecco la risposta del server:
{
"__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
}
Richiamo di una funzione definita in una classe di selezione di entità
Si può accedere a un oggetto di selezione di entità tramite la sintassi del filtro. Ad esempio, /?$filter=”finalExam=’To take'” per ottenere tutti gli studenti con un valore di “To take” per l’attributo finalExam.
Si può accedere a una selezione di entità anche in altri modi, quindi è bene controllare la documentazione.
Nella classe di selezione dell’entità StudentsSelection è stata definita una funzione setFinalExam(). Essa aggiorna l’attributo finalExam di ogni studente con il valore dato.
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 questo esempio, è accessibile attraverso l’URL http://127.0.0.1:8044/rest/Students/setFinalExam/?$filter=”finalExam=’To take'”. URL.
Ecco il corpo della richiesta:
[
"Passato"
]
Ecco la risposta del server (tutti gli studenti interessati sono stati correttamente aggiornati):
{
"result": {
"success": true
}
}
Scaricate l’HDI per vedere tutto questo in azione.
Nota:
Si consiglia di dare un’occhiata a questo post sulle parole chiave. Da 4D v18 R5, le funzioni non sono esposte per impostazione predefinita. Non dimenticate di contrassegnare le funzioni che volete esporre!