Máme pro vás vzrušující novinku ve verzi 4D v18 a možná vám napověděl už její název!
Tato funkce otevírá nové možnosti pro práci s klientem/serverem. Místo toho, aby byla aplikace v 4D v18 omezena na aktuální databázi a vyžadovala trvalé síťové připojení, může získávat data z jiné, vzdálené databáze 4D, která je vystavena na serveru 4D!
Díky této funkci se zpřístupňuje mnoho možností. Můžete například organizovat své aplikace tak, aby pracovaly offline a synchronizovaly místní data pouze tehdy, když jsou vzdálená data dosažitelná. Nebo můžete zvážit publikování dat na více serverech a přepínání z jednoho na druhý podle potřeby. Další možností by mohlo být rozdělení vašeho datového modelu do různých databází( např. místní data, mezinárodní data). Co takhle mít svá data distribuovaná na různých místech, ale přesto přístupná prostřednictvím jediného kódu klienta 4D (metody projektu a objekty formuláře)? Všechny tyto scénáře jsou nyní možné a v tomto příspěvku na blogu se dozvíte, jak na to!
HDI: Jak pracovat se vzdáleným datovým úložištěm
Díky verzi 4D v18 může být vaše databáze 4D vystavena jako server REST pro jiné klientské aplikace 4D. To znamená, že klient 4D může interagovat s vámi vystavenými daty (vytvářet, číst, aktualizovat, mazat). A ještě lepší zpráva: tato interakce je založena na konceptu ORDA, takže je zcela objektově orientovaná!
Jak vystavit databázi 4D pro vzdálený přístup?
V nastavení webové databáze:
- Na kartě Konfigurace nakonfigurujte port HTTP (z bezpečnostních důvodů nezapomeňte v produkčním režimu používat HTTPS!).
- Na kartě REST resource vyberte možnost„Expose as REST Server“.
- Spusťte webový server. Ve výše uvedeném příkladu jsme zvolili spuštění serveru při spuštění databáze.
- Otevřete databázi na serveru 4D Server.
- Gratulujeme! Vaše databáze je nyní dosažitelná pro vzdálený přístup prostřednictvím IP adresy vašeho počítače a portu, který jste nakonfigurovali!
Poznámka: Použití webového serveru pro přístup k serveru REST nevyžaduje licenci webového serveru. Pro připojení se používají standardní licence 4D Client.
Práce se vzdálenými databázemi
Příkaz Open datastore
Jak jsme uvedli dříve, k databázi se dostanete prostřednictvím konceptů ORDA: s databází se pracuje pomocí objektu datového skladu. Proto je prvním krokem získání objektu datového skladu odpovídajícího vzdálené databázi, ke které chcete přistupovat. Žádný problém! Zavolejte Open datastore příkaz se správným názvem hostitele a můžete začít pracovat.
Objekt datového skladu přiřadíme k místnímu ID „students“. Nyní můžeme začít pracovat s naší vzdálenou databází pomocí ORDA (spouštět dotazy, načítat/aktualizovat entity atd.).
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 ("Jsou to "+String($schoolDS[$dataClass].all().length)+" studenti")
//Run an ORDA query on the Students dataclass
$s:=$schoolDS[$dataClass].query("lastname=:1"; "Smith").first()
If ( # ) ("Student "+ . +" bydlí v "+ . . )$sNull
ALERT$slastname$saddresscity
End if
Zkontrolujte Open datastore dokumentaci, kde se dozvíte více o tom, jak můžete přistupovat ke vzdálené datové databázi pomocí zabezpečeného připojení (TLS).
použití více vzdálených databází
Zde je krátký příklad, který ukazuje, jak snadno lze pracovat s více vzdálenými databázemi. Máme dvě databáze: jedna obsahuje francouzské studenty, druhá anglické studenty.
Můžeme si vybrat, zda chceme zobrazit francouzské, nebo anglické studenty.
Formulářová metoda:
Case of
: (FORM Event.code=On Load)
Form .frenchServer:="french.acme.com"
Form .englishServer:="english.acme.com"
End case
Metoda objektu za přepínačem „Zobrazit francouzské studenty“:
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()
Objektová metoda za přepínacím tlačítkem „Zobrazit anglické studenty“:
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()
Poznámka: Při prvním volání příkazu Open datastore se do paměti načte objekt datového úložiště a na serveru se otevře relace. Při dalších voláních se jednoduše vrátí odkaz na tento objekt datového skladu.
řízení přístupu ke vzdálené databázi
Chcete-li zajistit bezpečnost vystavené databáze 4D, můžete k ní filtrovat přístup. Podívejme se ještě jednou na Open datastore příkaz. Jak je uvedeno níže, lze mu předat uživatele a heslo.
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 poskytuje dva způsoby, jak omezit přístup oprávněným uživatelům:
Použijte skupinu uživatelů 4D
Přístupy lze omezit pomocí skupiny uživatelů 4D. Při vystavení databáze vyberte skupinu s povoleným přístupem na kartě REST resource na stránce s webovými nastaveními.
Pokud je uživatel zadaný v příkazu Open datastore příkazu patří do vybrané skupiny, je přístup povolen, v opačném případě je vygenerována chyba ověření.
Použijte metodu ověřování databáze v klidu
Můžete také použít novou metodu On REST authentication database a nakódovat vlastní řízení přístupu k vystavené databázi. Tato metoda obdrží pověření uživatele v příkazu Open datastore příkazu. Stačí vrátit True pokud je uživateli povoleno pracovat s vaší vzdálenou databází.
Zde je uveden příklad:
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
Poznámka: Vds a datastore.getInfo() Příkazy byly aktualizovány a byly přidány tři nové metody: datastore.startTransaction(), datastore.cancelTransaction(), a datastore.validateTransaction().
Nyní je čas stáhnout si výše uvedené HDI a dozvědět se o této úžasné funkci více!