Abbiamo una nuova entusiasmante funzione da annunciare in 4D v18 e il titolo potrebbe già darvi un indizio!
Questa funzione apre nuove possibilità per il lavoro client/server. Anziché essere limitata al database corrente e richiedere una connessione di rete permanente, un’applicazione in 4D v18 può ottenere i dati da un altro database 4D remoto esposto su un server 4D!
Questa funzione rende disponibili molte opzioni. Ad esempio, si possono organizzare le applicazioni per lavorare offline e sincronizzare i dati locali solo quando quelli remoti sono raggiungibili. Oppure si può pensare di pubblicare i dati su più server e passare da uno all’altro quando necessario. Un’altra opzione potrebbe essere quella di suddividere il modello di dati in diversi database(ad esempio, dati locali e dati internazionali). E se i dati fossero distribuiti in luoghi diversi, ma comunque accessibili attraverso un unico codice client 4D (metodi di progetto e oggetti modulo)? Tutti questi scenari sono ora possibili e questo post vi spiega come!
HDI: come lavorare con un datastore remoto
Con 4D v18, il database 4D può essere esposto come server REST per altre applicazioni client 4D. Ciò significa che un client 4D può interagire con i dati esposti (creare, leggere, aggiornare, cancellare). Un’altra buona notizia: questa interazione si basa sui concetti di ORDA, quindi è completamente orientata agli oggetti!
Come esporre il database 4D per l’accesso remoto?
Nelle impostazioni Web del database:
- Nella scheda Configurazione, configurare una porta HTTP (per motivi di sicurezza, assicurarsi di utilizzare HTTPS per la modalità di produzione!)
- Nella scheda Risorse REST, selezionare l’opzione“Esponi come server REST“.
- Avviare il server Web. Nell’esempio precedente, abbiamo scelto di avviare il server all’avvio del database.
- Aprire il database sul server 4D.
- Congratulazioni! Il database è ora raggiungibile per l’accesso remoto attraverso l’IP del computer e la porta configurata!
Nota: L’uso del server Web per accedere al server REST non richiede una licenza per il server Web. Per le connessioni si utilizzano le licenze standard di 4D Client.
Lavorare con i database remoti
Comando Open datastore
Come abbiamo detto in precedenza, il database è raggiungibile tramite i concetti di ORDA: un database viene gestito con un oggetto datastore. Pertanto, il primo passo è ottenere l’oggetto datastore corrispondente al database remoto a cui si vuole accedere. Nessun problema! Richiamate il comando Open datastore con l’hostname corretto e il gioco è fatto.
Associamo l’oggetto datastore all’ID locale “studenti”. Ora possiamo iniziare a lavorare con il nostro database remoto usando ORDA (eseguire query, caricare/aggiornare entità, ecc.)
C_OBJECT($connectTo;$schoolDS;$s)
C_TEXT ($dataClass)
//The database contains a Students dataclass
$dataClass :="Studenti"
$connectTo :=New object("hostname"; "school.acme.com")
$schoolDS :=Open datastore($connectTo; "studenti") //local id of this remote datastore is "students"
//Start working with ORDA means
ALERT ("Sono "+String($schoolDS[$dataClass].all().length)+" studenti")
//Run an ORDA query on the Students dataclass
$s:=$schoolDS[$dataClass].query("cognome=:1"; "Smith").first()
If ( # ) ("Lo studente "+ . +" vive in "+ . . )$sNull
ALERT$slastname$saddresscity
End if
Consultate la Open datastore per saperne di più su come accedere a un database remoto con una connessione protetta (TLS).
utilizzo di più database remoti
Ecco un breve esempio che mostra quanto sia facile lavorare con più database remoti. Abbiamo due database: uno contiene studenti francesi, l’altro studenti inglesi.
Possiamo scegliere di visualizzare gli studenti francesi o inglesi.
Il metodo del modulo:
Case of
: (FORM Event.code=On Load)
Form .frenchServer:="french.acme.com"
Form .englishServer:="english.acme.com"
End case
Il metodo dell’oggetto dietro il pulsante di opzione “Visualizza studenti francesi”:
C_OBJECT($connectTo;$students)
$connectTo :=New object()
$connectTo .hostname:=Form.frenchServer
$students :=Open datastore($connectTo; "francese") //datastore containing French students
Form.
students:=$students.Students.all()
Il metodo dell’oggetto dietro il pulsante di opzione “Visualizza studenti inglesi”:
C_OBJECT($connectTo;$students)
$connectTo :=New object()
$connectTo .hostname:=Form.englishServer
$students :=Open datastore($connectTo; "english") //datastore containing English students
Form.
students:=$students.Students.all()
Nota: la prima volta che viene richiamato il comando Open datastore, l’oggetto datastore viene caricato in memoria e viene aperta una sessione sul server. Alle chiamate successive, il comando restituisce semplicemente un riferimento a questo oggetto datastore.
controllare l’accesso al database remoto
Per mantenere al sicuro il database 4D esposto, è possibile filtrarne l’accesso. Diamo un’altra occhiata al comando Open datastore . Come mostrato di seguito, gli si può passare un utente e una password.
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 offre due modi per limitare l’accesso agli utenti autorizzati:
Utilizzare un gruppo di utenti 4D
L’accesso può essere limitato utilizzando un gruppo di utenti 4D. Quando si espone il database, selezionare il gruppo a cui è consentito l’accesso nella scheda Risorse REST della pagina delle impostazioni Web.
Se l’utente indicato nel comando Open datastore appartiene al gruppo selezionato, l’accesso è consentito, altrimenti viene generato un errore di autenticazione.
Utilizzare il metodo di autenticazione del database a riposo
È anche possibile utilizzare il nuovo metodo On REST authentication database per codificare il proprio controllo di accesso al database esposto. Questo metodo riceve le credenziali dell’utente nel comando Open datastore e il comando Restituisce semplicemente True se l’utente è autorizzato a lavorare con il database remoto.
Ecco un esempio:
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: i caratterids e datastore.getInfo() sono stati aggiornati e sono stati aggiunti tre nuovi metodi: datastore.startTransaction(), datastore.cancelTransaction(), e datastore.validateTransaction().
Ora è il momento di scaricare l’HDI di cui sopra per saperne di più su questa straordinaria funzione!