Tenemos una nueva y emocionante función que anunciar en 4D v18 y el título ya le habrá dado una pista.
Esta funcionalidad abre nuevas posibilidades para el trabajo cliente/servidor. En lugar de limitarse a la base de datos actual y requerir una conexión de red permanente, una aplicación en 4D v18 puede obtener datos de otra base de datos 4D remota que esté expuesta en un servidor 4D.
Gracias a esta característica, se dispone de muchas opciones. Por ejemplo, puede organizar sus aplicaciones para trabajar sin conexión y sólo sincronizar los datos locales cuando los datos remotos sean accesibles. O podría considerar publicar sus datos en múltiples servidores y cambiar de uno a otro cuando sea necesario. Otra opción podría ser dividir su modelo de datos en diferentes bases de datos(por ejemplo, datos locales, datos internacionales). ¿Y qué hay de tener sus datos distribuidos en diferentes lugares pero accesibles a través de un único código de cliente 4D (métodos de proyecto y objetos de formulario)? Todos estos escenarios son ahora posibles y esta entrada del blog le dice cómo.
HDI: Cómo trabajar con un datastore remoto
Con 4D v18, su base de datos 4D puede ser expuesta como un servidor REST para otras aplicaciones cliente 4D. Esto significa que un cliente 4D puede interactuar con los datos que usted ha expuesto (crear, leer, actualizar, eliminar). Y aún más buenas noticias: esta interacción se basa en los conceptos de ORDA, ¡así que está completamente orientada a objetos!
¿Cómo exponer su base de datos 4D para el acceso remoto?
En la configuración web de la base de datos:
- En la pestaña Configuración, configure un puerto HTTP (por razones de seguridad, asegúrese de usar HTTPS para el modo de producción)
- En la pestaña de recursos REST, seleccione la opción«Exponer como servidor REST«.
- Inicie el servidor web. En el ejemplo anterior, elegimos iniciar el servidor al iniciar la base de datos.
- Abra su base de datos en el servidor 4D.
- ¡Enhorabuena! ¡Su base de datos es ahora alcanzable para el acceso remoto a través de la IP de su máquina y el puerto que usted configuró!
Nota: El uso del Web Server para acceder al REST Server no requiere una licencia de Web Server. Las licencias estándar de 4D Client se utilizan para las conexiones.
Trabajar con bases de datos remotas
Comando Open datastore
Como dijimos antes, su base de datos es accesible a través de los conceptos de ORDA: una base de datos se maneja con un objeto datastore. Por lo tanto, el primer paso es obtener el objeto datastore correspondiente a la base de datos remota a la que quieres acceder. No hay problema. Llama al comando Open datastore con el nombre de host correcto y ya está en marcha.
Asociamos el objeto datastore al ID local, «estudiantes». Ahora podemos empezar a trabajar con nuestra base de datos remota utilizando ORDA (ejecutar consultas, cargar/actualizar entidades, etc.)
C_OBJECT($connectTo;$schoolDS;$s)
C_TEXT ($dataClass)
//The database contains a Students dataclass
$dataClass :="Estudiantes"
$connectTo :=New object("hostname"; "school.acme.com")
$schoolDS :=Open datastore($connectTo; "estudiantes") //local id of this remote datastore is "students"
//Start working with ORDA means
ALERT ("Son "+String($schoolDS[$dataClass].all().length)+" estudiantes")
//Run an ORDA query on the Students dataclass
$s:=$schoolDS[$dataClass].query("lastname=:1"; "Smith").first()
If ( # ) ("El estudiante "+ . +" vive en "+ . . )$sNull
ALERT$slastname$saddresscity
End if
Consulta la Open datastore para saber más sobre cómo puede acceder a una base de datos remota con una conexión segura (TLS).
uso de múltiples bases de datos remotas
He aquí un breve ejemplo que muestra lo fácil que es trabajar con múltiples bases de datos remotas. Tenemos dos bases de datos: una contiene estudiantes franceses, la otra contiene estudiantes ingleses.
Podemos elegir entre ver a los estudiantes franceses o ingleses.
El método del formulario:
Case of
(FORM Event.code=On Load)
Form .frenchServer:="francés.acme.com"
Form .englishServer:="inglés.acme.com"
End case
El método del objeto detrás del botón de opción «Ver estudiantes de francés»:
C_OBJECT($connectTo;$students)
$connectTo :=New object()
$connectTo .hostname:=Form.frenchServer
$students :=Open datastore($connectTo; "french") //datastore containing French students
Form.
students:=$students.Students.all()
El método del objeto detrás del botón de opción «Ver estudiantes de inglés»:
C_OBJECT($connectTo;$students)
$connectTo :=New object()
$connectTo .hostname:=Form.englishServer
$students :=Open datastore($connectTo; "inglés") //datastore containing English students
Form.
students:=$students.Students
.all()
Nota: La primera vez que se llama al comando Open datastore, el objeto datastore se carga en memoria y se abre una sesión en el servidor. En las siguientes llamadas simplemente devuelve una referencia a este objeto datastore.
controlar el acceso a la base de datos remota
Para mantener segura la base de datos 4D que ha expuesto, puede filtrar el acceso a la misma. Veamos de nuevo el comando Open datastore comando. Como se muestra a continuación, se le puede pasar un usuario y una contraseña.
C_OBJECT($connectTo;$myStudents)
ON ERR CALL ("manageErrors")
$connectTo :=New object()
$connectTo .hostname:="students.acme.com"
$connectTo .user:="mary@4d.com"
$connectTo .password:=Form.password
//local id of this remote datastore is "students"
$myStudents :=Open datastore($connectTo; "students")
ON ERR CALL (""
)
4D ofrece dos maneras de restringir el acceso a los usuarios autorizados:
Utilizar un grupo de usuarios 4D
El acceso puede ser restringido utilizando un grupo de usuarios 4D. Cuando exponga la base de datos, seleccione el grupo con acceso permitido en la pestaña de recursos REST de la página de configuración web.
Si el usuario dado en el comando Open datastore pertenece al grupo seleccionado, se concede el acceso, de lo contrario se genera un error de autenticación.
Utilice el método de autenticación en reposo de la base de datos
También puede utilizar el nuevo método de base de datos de autenticación On REST para codificar su propio control de acceso a la base de datos que ha expuesto. Este método recibe las credenciales del usuario en el Open datastore comando. Simplemente devuelve True si el usuario tiene permiso para trabajar con su base de datos remota.
He aquí un ejemplo:
C_TEXT($1;$name;$2;$password)
C_BOOLEAN ($0;$result;$3;$digest)
C_OBJECT ($user)
$name :=$1 // The user to provide in Open datastore command
$password :=$2 // The password to provide in Open datastore command
$digest :=$3 // True if password is hashed
$result :=False
//Search for the user in our Users dataclass
$user:=ds.Users.query("name=:1";$name).first()
If ( # ) ( & ( . = )) := :=$userNull
// Passwords are hashed in Users dataclass
If$digest$userpassword$password
$resultTrue
End if
End if
$0$result
Nota: Las letrasds y datastore.getInfo() han sido actualizados, y se han añadido tres nuevos métodos: datastore.startTransaction(), datastore.cancelTransaction(), y datastore.validateTransaction().
Ahora es el momento de descargar el IDH anterior para saber más sobre esta increíble función.