Classi del modello di dati ORDA e REST

Tradotto automaticamente da Deepl

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

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert è entrata a far parte del team 4D Product come Product Owner nel 2017. In qualità di Product Owner, è incaricata di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente.Marie-Sophie si è laureata presso la scuola di ingegneria ESIGELEC e ha iniziato la sua carriera come ingegnere presso IBM nel 1995. Ha partecipato a vari progetti (di manutenzione o di costruzione) e ha lavorato come sviluppatrice Cobol. In seguito ha lavorato come progettista UML e sviluppatore Java. Ultimamente i suoi ruoli principali erano l'analisi e la scrittura dei requisiti funzionali, il coordinamento dei team di business e di sviluppo.