API je dnes standard – ale ne každý systém ho má
Je velmi příjemné, když se práce přesouvá na bedra strojů a nedělá se ručně – zvlášť práce rutinní, jednoduchá, snadno automatizovatelná. V oblasti informatiky se taková práce neobejde bez toho, aby spolu různé systémy komunikovaly bez zásahu člověka. Proto je dnes zcela běžné, že informační systémy (v širším slova smyslu – tedy jakékoli systémy, které uchovávají data a pracují s nimi) poskytují aplikační rozhraní (API), na které se jiný systém připojí a získá tak přístup k datům.
Mezi informační systémy patří například systémy správy obsahu (CMS), obchodní systémy, systémy ERP, CRM, komunikační systémy, různé systémy pro výrobu, pro zdravotnictví...
Problém je, že mnoho systémů – hlavně starších, ale i dnes se dost takových najde – žádné API neposkytuje. Jsou navrženy pro ovládání člověkem, se strojovou komunikací se nepočítá. To samozřejmě komplikuje integraci do většího celku, resp. vůbec propojování systémů mezi sebou.
Kde API není, uděláme si ho
K propojování systémů lze využít toho, že se data ukládají typicky do nějaké databáze. Mezi ty nejpopulárnější patří MySQL/MariaDB, PostgreSQL, SQLite atd. Právě na zmíněné databáze cílí nástroj ArrestDB. Snadno ho napojíte na použitou databázi a s daty pak můžete pracovat z jiného systému.
ArrestDB poskytuje REST API. Oproti komplikovanějším konceptům, jako je třeba SOAP, klade na klientskou stranu nízké nároky na sestavování odesílaných požadavků.
Takové řešení je velmi jednoduché a výkonné, protože mezi databází a API neleží žádná další vrstva. Zároveň to má ale několik nevýhod, s nimiž je potřeba počítat. Jednak pracujete pouze s daty, bez vedlejších efektů v systému (což ale vůbec nevadí, pokud potřebujete data pouze číst).
Druhou nevýhodou je nutnost ohlídat přístupová práva. Pro tento účel je vhodné vytvořit speciálního uživatele, který získá jen nejmenší potřebná oprávnění. Pokud například potřebuje jen číst data, nemusí mít žádná zápisová práva – nemusí být také vpuštěn do tabulek, případně i sloupců, odkud není potřeba získávat žádná data.
Celé to lze ještě vylepšit tím, že se pro přístup k datům vytvoří funkce a zakáže přístup přímo do tabulek. Tím ale mizí jedna z výhod řešení, tedy jednoduchost.
A konečně zatřetí API přistupuje k datům tak, jak jsou uložena v databázi. Tedy o operace s daty se musí postarat systém, který přes API k datům přistupuje. Také tento problém lze vyřešit implementací databázových funkcí, pokud je to vhodné.
Napojujeme ArrestDB na databázi
Nástroj ArrestDB je koncipován jako jediný soubor PHP (nazvaný index.php), který zajišťuje vše potřebné. Soubor si můžete stáhnout z GitHubu a uložit na server – například do adresáře api, který pro tento účel vytvoříte. ArrestDB je rozšiřován pod permisivní licencí MIT, čili s ním můžete dělat skoro cokoliv, třeba i začlenit do proprietárního softwaru.
Pro fungování je potřeba webový server (např. Apache nebo nginx), PHP verze aspoň 5.4 a rozšíření PDO (které je standardně dostupné, je potřeba jen ohlídat, aby byly nainstalovány balíčky pro samotné PDO a pro ovladač konkrétní databáze).
Pak už zbývá jen nastavit připojení k databázi. Parametry můžete nastavit přímo v souboru index.php nebo je mít zcela samostatně (třeba i mimo prostor, kam vidí webový server; stačí tam mít přístup z PHP). Pro jednoduchost uvažujme, že jsou přímo v hlavním souboru, na jeho začátku.
Základem je proměnná $dsn, ve které se nastaví přístup k databázi ve formátu DSN. Pro databázi MySQL nebo MariaDB se použije:
$dsn = 'mysql://<uživatel>:<heslo>@<adresa>[:<port>]/<název_databáze>/';
Obdobně pro PostgreSQL:
$dsn = 'pgsql://<uživatel>:<heslo>@<adresa>[:<port>]/<název_databáze>/';
Trochu jiné to bude jen pro SQLite, protože tato databáze je v souboru. Uvede se tedy cesta k němu:
$dsn = 'sqlite:///<cesta>/<název_souboru>';
Bezpečnější a pohodlnější přístup
Uvedené nastavení bohatě postačuje k tomu, aby API fungovalo a dalo se s ním pracovat. Ještě ale zbývají dvě důležité věci. Jednak je žádoucí povolit přístup jen z adres, kde se nacházejí legitimní systémy (s nimiž se daný systém propojuje). To lze udělat na úrovni webového serveru, ale prostředky k tomu poskytuje i ArrestDB:
$clients = array ( '127.0.0.1', '192.168.6.12', '2a02:8308:5042:1700:39b7:4813:e3c7:b6be', );
Do pole $clients můžete vložit jak adresy IPv4, tak i IPv6. Pozor ale, že v případě IPv6 je potřeba použít malá písmena a adresu také patřičně zkrátit (vynechat nulové dvojice bajtů), pokud to lze. Jinak to nebude fungovat. Případně si můžete kód ArrestDB snadno upravit tak, aby toto omezení neměl.
Druhou důležitou věcí je pohodlnější tvorba URL. Ve výchozím stavu totiž musíte vždycky uvádět název souboru s PHP skriptem (index.php). To se dá ale snadno odstranit, pokud si u webového serveru Apache zapnete modul mod_rewrite a do souboru .htaccess v adresáři vložíte toto:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [L,QSA] </IfModule>
Pravidla zajistí přepis URL, zároveň respektují případné existující soubory a adresáře. Pro webový server nginx by bylo potřeba tato pravidla definovat v konfiguraci a vypadala by poněkud jinak.
Používáme ArrestDB
Pro práci s ArrestDB je nezbytné znát strukturu databáze – tedy názvy tabulek a jejich sloupců. Další práce už je pak jednoduchá. Například lze získat všechny řádky z tabulky:
GET https://adresa.serveru/tabulka/
Uvedený zápis znamená, že se na server adresa.serveru pošle přes HTTPS požadavek metodou GET a žádá se o data z tabulky tabulka. Vrácená data jsou vždy ve formátu JSON. Množinu řádků tabulky lze omezit a určit jejich řazení:
GET https://adresa.serveru/tabulka/?order=asc&by=datum_od&limit=10&offset=20
Lze použít i výběr podle klíče:
GET https://adresa.serveru/tabulka/10
Tento požadavek získá data obsahující (nejvýše) jeden řádek. Pozor ale, že klíč musí mít název „id“, jinak to nebude fungovat. Filtrovat řádky lze ale i podle jiného sloupce:
GET https://adresa.serveru/tabulka/nazev/abcd
Zde se vyberou řádky podle sloupce nazev, testuje se na obsažení daného řetězce (LIKE '%abcd%'). Na stránce ArrestDB najdete další příklady, včetně manipulace s daty pomocí dalších metod protokolu HTTP (POST, PUT, DELETE). Ale i tady platí, že pro změnu a smazání řádku je potřeba mít jako klíč sloupec s názvem „id“.
Data pro vložení nebo změnu musí být zakódována jako application/x-www-form-urlencoded. Ukládání dat ve formátu multipart/form-data slibuje tvůrce ArrestDB doplnit později.
Shrnutí
ArrestDB je jednoduchý nástroj pro tvorbu API nad databází, dostupný pod svobodnou permisivní licencí. Umožňuje velmi snadno zpřístupnit data v databázi systému, který neposkytuje aplikační rozhraní pro napojování jiných systémů. Hlavním limitem pro práci je nemožnost určit klíč pro selekci řádků v tabulkách, ne vždy si lze vystačit s tím „zadrátovaným“.