Temos uma nova e excitante característica a anunciar em 4D v18 e o título pode já lhe ter dado uma dica!
Esta característica abre novas possibilidades para o trabalho cliente/servidor. Em vez de se limitar à base de dados actual e de requerer uma ligação permanente à rede, uma aplicação em 4D v18 pode obter dados de outra base de dados 4D remota que está exposta num servidor 4D!
Muitas opções tornam-se disponíveis graças a esta funcionalidade. Por exemplo, poderia organizar as suas aplicações para trabalhar offline e só sincronizar os dados locais quando os dados remotos são acessíveis. Ou poderia considerar a publicação dos seus dados em múltiplos servidores e mudar de um para o outro conforme necessário. Outra opção poderia ser dividir o seu modelo de dados em diferentes bases de dados( por exemplo, dados locais, dados internacionais). Que tal ter os seus dados distribuídos em locais diferentes e ainda acessíveis através de um único código de cliente 4D (métodos de projecto e objectos de formulário)? Todos estes cenários são agora possíveis e este post no blog diz-lhe como!
HDI: Como trabalhar com um datastore remoto
Com 4D v18, a sua base de dados 4D pode ser exposta como um servidor REST para outras aplicações cliente 4D. Isto significa que um cliente 4D pode interagir com os dados que expôs (criar, ler, actualizar, apagar). E ainda mais boas notícias: esta interacção é baseada em conceitos ORDA, por isso é completamente orientada para objectos!
como expor a sua base de dados 4D para acesso remoto?
Nas definições Web da base de dados:
- No separador Configuração, configure uma porta HTTP (por razões de segurança, certifique-se de utilizar HTTPS para o modo de produção!)
- No separador de recursos REST, seleccione a opção“Expor como Servidor REST
- Iniciar o servidor Web. No exemplo acima, escolhemos iniciar o servidor no arranque da base de dados.
- Abra a sua base de dados no Servidor 4D.
- Parabéns! A sua base de dados está agora acessível para acesso remoto através do IP da sua máquina e da porta que configurou!
Nota: A utilização do Servidor Web para aceder ao Servidor REST não requer uma licença do Servidor Web. As licenças de Cliente 4D padrão são utilizadas para ligações.
Trabalhar com bases de dados remotas
Comando de datastore aberto
Como dissemos anteriormente, a sua base de dados é acessível através de conceitos ORDA: uma base de dados é tratada com um objecto de datastore. Por conseguinte, o primeiro passo é obter o objecto de datastore correspondente à base de dados remota a que pretende aceder. Não há problema! Chame a Open datastore comandar com o nome de anfitrião correcto e está a fugir e a correr.
Associamos o objecto de datastore ao ID local, “estudantes”. Podemos agora começar a trabalhar com a nossa base de dados remota utilizando a ORDA (executar consultas, carregar/actualizar entidades, etc.)
C_OBJECT($connectTo;$schoolDS;$s)
C_TEXT ($dataClass)
//The database contains a Students dataclass
$dataClass :="Estudantes"
$connectTo :=New object("hostname"; "school.acme.com")
$schoolDS :=Open datastore($connectTo; "estudantes") //local id of this remote datastore is "students"
//Start working with ORDA means
ALERT ("São "+String($schoolDS[$dataClass].all().length)+" estudantes")
//Run an ORDA query on the Students dataclass
$s:=$schoolDS[$dataClass].query("lastname=:1"; "Smith").first()
If ( # ) ("Estudante "+ . +" vive em "+ . . )$sNull
ALERT$slastname$saddresscity
End if
Verifique o comando Open datastore documentação para saber mais sobre como se pode aceder a uma base de dados remota com uma ligação segura (TLS).
utilizando múltiplas bases de dados remotas
Eis um pequeno exemplo que mostra como é fácil trabalhar com múltiplas bases de dados remotas. Temos duas bases de dados: uma contém estudantes franceses, a outra contém estudantes ingleses.
Podemos escolher entre ver estudantes franceses ou ingleses.
O método do formulário:
Case of
: (FORM Event.code=On Load)
Form .frenchServer:="french.acme.com"
.
Form .englishServer:="english.acme.com"
End case
O método do objecto por detrás do botão de rádio “View French students” (Ver estudantes franceses):
C_OBJECT($connectTo;$students)
$connectTo :=New object()
$connectTo .hostname:=Form.frenchServer
$students :=Open datastore($connectTo; "francês") //datastore containing French students
Form.
students:=$students.Students.all()
O método objecto por detrás do botão de rádio “View English students” (Ver estudantes ingleses):
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: A primeira vez que o comando Open datastore é chamado, o objecto datastore é carregado na memória e uma sessão é aberta no servidor. Em chamadas subsequentes, devolve simplesmente uma referência sobre este objecto de datastore.
controla o acesso à sua base de dados remota
Para manter a base de dados 4D que expôs em segurança, pode filtrar o acesso à mesma. Vamos dar outra vista de olhos à Open datastore comando. Como se mostra abaixo, pode ser passado um utilizador e uma palavra-passe.
C_OBJECT($connectTo;$myStudents)
ON ERR CALL ("manageErrors")
$connectTo :=New object()
$connectTo .hostname:="students.acme.com"
$connectTo .user:="Open datastore"
$connectTo .password:=Form.password
//local id of this remote datastore is "students"
$myStudents := ($connectTo; "students")
ON ERR CALL ("")
4D oferece duas formas de restringir o acesso a utilizadores autorizados:
Usar um grupo de utilizadores 4D
O acesso pode ser restringido utilizando um grupo de utilizadores 4D. Quando expuser a base de dados, seleccione o grupo de acesso permitido no separador de recursos REST da página de definições da Web.
Se o utilizador indicado no comando Open datastore pertence ao grupo seleccionado, o acesso é concedido, caso contrário é gerado um erro de autenticação.
Utilizar o método de base de dados de autenticação em repouso
Também pode utilizar o novo método de base de dados de autenticação On REST para codificar o seu próprio controlo de acesso à base de dados que expôs. Este método recebe as credenciais do utilizador no Open datastore comando. Basta devolver True se o utilizador estiver autorizado a trabalhar com a sua base de dados remota.
Aqui está um exemplo:
C_TEXT($1;$name;$2;
;$password) // The password to provide in Open datastore commandC_BOOLEAN ($0;$result;$3;$digest)
C_OBJECT ($user)
$name :=$1 // The user to provide in Open datastore command
$password :=$2
$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: Ods e datastore.getInfo() comandos foram actualizados, e três novos métodos foram acrescentados: datastore.startTransaction(), datastore.cancelTransaction()e datastore.validateTransaction().
Agora é altura de descarregar o HDI acima para saber mais sobre esta incrível funcionalidade!