Clases del modelo de datos ORDA y REST

Traducido automáticamente de Deepl

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

Avatar
• Propietario de producto - Marie-Sophie Landrieu-Yvert ingresó al equipo de 4D Product como Propietario de producto en 2017. Como tal, está a cargo de escribir las historias de los usuarios y luego traducirlas en especificaciones funcionales. Su papel es también asegurarse de que la implementación de la funcionalidad entregada cumpla con las necesidades del cliente. Marie-Sophie se graduó en la Escuela de Ingeniería de ESIGELEC y comenzó su carrera como ingeniera en IBM en 1995. Participó en varios proyectos (de mantenimiento y creación) y trabajó como desarrolladora de Cobol. Luego trabajó como diseñadora de UML y desarrolladora de Java. Sus principales funciones fueron analizar y redactar requisitos funcionales, coordinar los equipos de negocio y de desarrollo.