En una entrada anterior del blog, usted aprendió acerca de las clases ORDA y las posibilidades que ofrecen para hacer su experiencia de codificación más suave. En esta entrada del blog, verás cómo utilizarlas con el servidor REST.
¡Veámoslo en acción!
HDI: Ejemplos de uso de las clases ORDA con el servidor REST
Tenemos una base de datos llamada LearningSystem que contiene las siguientes tablas:
Esta base de datos está expuesta como un servidor REST en localhost (puerto 8044). Todas las funciones definidas en sus clases pueden ser llamadas usando peticiones REST en una operación POST.
Llamada a una función definida en la clase datastore
El objeto datastore se recupera utilizando el prefijo /rest/$catalog.
Se ha definido una función getStatistics() en la clase datastore de DataStore. La función devuelve una colección con información sobre las escuelas.
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
Puede llamarlo con la URL http://127.0.0.1:8044/rest/$catalog/getStatistics.
Esta es la respuesta del servidor:
{
"resultado": [
{
"nombre": "Old school",
"city": "Solebury",
"numberOfStudents": 3
},
{
"name": "History Institute",
"city": "Solebury",
"numberOfStudents": 3
},
{
"name": "4D University",
"city": "Hummelstown",
"numberOfStudents": 3
}
]
}
Llamada a una función definida en una clase de datos
Se accede a un objeto de clase de datos mediante el prefijo /rest/dataClassName.
Se ha definido una función registerStudent() en la clase de datos Escuelas. La función recibe los datos del estudiante en un objeto y comprueba si el nivel de inglés del estudiante cumple con el nivel requerido por la escuela. Si su nivel de inglés es correcto, la función crea y guarda la entidad Students.
Class extends DataClass
Function registerStudent
C_OBJECT($1;$data;$student;$school;$result;$0)
$data :=$1
$school :=ds.Schools.query("nombre = :1";$data.schoolName).first()
$result:=New object("éxito";True)
If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:="El nivel de inglés no es suficiente"
$0 :=$result
End if
If ($result.success)
$student :=ds.Students.new()
$student .fromObject($data)
$student .finalExam:="Tomar"
$student .school:=$school
$result :=$student.save()
$0 :=$student
End if
Es accesible a través de la URL http://127.0.0.1:8044/rest/Schools/registerStudent.
Los parámetros deben pasarse como una colección, en el cuerpo de la petición:
[
{
"firstname": "Mary",
"lastname": "Smith",
"englishLevel": 2,
"schoolName": "Math school"
}
]
Esta es la respuesta del servidor:
{
"__entityModel": "Students",
"__DATACLASS": "Estudiantes",
"__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"
}
}
}
Llamada a una función definida en una clase de entidad
Se accede a un objeto de entidad a través del prefijo /rest/dataClassName(key), donde key es la clave primaria de la entidad.
Se ha definido una función studyingInSameCity() en la clase de entidad StudentsEntity. Devuelve todos los demás estudiantes que estudian en la misma ciudad que el estudiante actual.
Class extends Entity
Function studyingInSameCity
C_OBJECT($0;$city)
$city :=This.school.city
$0 :=$city.schools.students.minus (
This)
Este ejemplo es para una entidad con clave primaria = 7. Se accede a través de la URL http://127.0.0.1:8044/rest/Students(7)/estudiandoEnLaMismaCiudad/?$attributes=nombre, apellido.
Aplicamos la función studyingInSameCity() sobre esta entidad y filtramos los atributos devueltos para obtener sólo el nombre y el apellido (/?$attributes=nombre, apellido).
Esta es la respuesta del servidor:
{
"__DATACLASS": "Estudiantes",
"__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
}
Llamada a una función definida en una clase de selección de entidades
Se puede acceder a un objeto de selección de entidad mediante la sintaxis de filtro. Por ejemplo, /?$filter=»finalExam=’To take'» para obtener todos los estudiantes con un valor de «To take» para el atributo finalExam.
También se puede acceder a una selección de entidades de otras maneras, así que asegúrese de consultar la documentación.
Se ha definido una función setFinalExam() en la clase de selección de entidades StudentsSelection. Actualiza el atributo finalExam de cada estudiante con el valor dado.
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
En este ejemplo, es accesible a través de la http://127.0.0.1:8044/rest/Students/setFinalExam/?$filter=»finalExam=’To take'» URL.
Este es el cuerpo de la petición:
[
"Aprobado"
]
Esta es la respuesta del servidor (todos los alumnos afectados han sido debidamente actualizados):
{
"resultado": {
"success": true
}
}
Descargue el IDH para ver todo lo anterior en acción.
Nota:
Asegúrese de revisar este post sobre las palabras clave. Desde 4D v18 R5, las funciones no están expuestas por defecto. ¡No olvide marcar las funciones que quiera exponer!