Vecný obsah, základné pojmy - Web API
API rozhranie systému ABRA Gen (ďalej len Web API) je otvorené rozhranie nad systémom ABRA Gen postavené na princípoch REST a webových technológiách (HTTP protokolu). Umožňuje ABRA Gen prepojiť s inými aplikáciami (e-shopy, webové portály a pod.) a automaticky nadviazať vzájomnú komunikáciu. Automatizácia firemných procesov výrazne šetrí rutinnú prácu zamestnancov a znižuje tak počet chýb.
Web API umožňuje komunikáciu s inými systémami prostredníctvom protokolu HTTP (verzia 1.1) a http metód. Ide o RESTful rozhranie. Skladá sa z dvoch nižšie uvedených komponentov, ktoré spolu vzájomne komunikujú. Na prevádzku Web API je nutné mať Web API správne nakonfigurované. Viď Nastavenie Web API.
Aké sú ďalšie výhody?
- Umožňuje rozloženie záťaže na viac serverov a prináša tak škálovateľnosť a vysokú dostupnosť.
- Obsahuje výkonný dopytovací jazyk, pomocou ktorého možno získať presne tie dáta, ktoré používateľ potrebuje.
- Umožňuje komunikáciu s ABRA Gen z ľubovoľného programovacieho jazyka a operačného systému.
- Implementuje štandard Swagger, dnes známy ako Open API.
Čo je vlastne Web API laicky, viď Co je vlastně Web API a K čemu slouží.
REST je architektúrou rozhrania, ktorá je navrhnutá pre distribuované prostredie. Na rozdiel od známych XML-RPC alebo SOAP je REST orientovaný dátovo a nie procedurálne. Stav aplikácie a správanie je vyjadrené takzvaným zdrojom (resource), každý zdroj musí mať unikátny identifikátor URL. REST podporuje štyri základné metódy, ktoré sú známe pod označením CRUD, teda vytvorenie dát (Create), získanie požadovaných dát (Retrieve), zmenu (Update) a vymazanie (Delete). Tieto metódy sú implementované pomocou zodpovedajúcich metód HTTP protokolu.
Požiadavky kladené na architektonický štýl vyhovujúci paradigme REST:
- Oddelený klient-server - Pri návrhu Web API musia byť klientske a serverové aplikácie od seba úplne nezávislé. Jedinou informáciou, ktorú by klientska aplikácia mala poznať, je URI požadovaného zdroja.
- Bezstavovosť - Každá požiadavka musí obsahovať všetky informácie nevyhnutné pre jej spracovanie. Web API nevyžadujú žiadne relácie na strane servera. Serverové aplikácie nesmú ukladať žiadne dáta súvisiace s požiadavkou klienta.
- Ukladanie do vyrovnávacej pamäte - Ak je to možné, mali by byť prostriedky kešovateľné na strane klienta alebo servera. Odpovede servera tiež musia obsahovať informácie o tom, či je pre dodaný zdroj povolené ukladanie do vyrovnávacej pamäte. Cieľom je zlepšiť výkon na strane klienta a zároveň zvýšiť škálovateľnosť na strane servera.
- Jednotné rozhranie - Všetky požiadavky API na rovnaký zdroj by mali vyzerať rovnako, bez ohľadu na to, odkiaľ požiadavka pochádza.
- Viacvrstvový systém - V Web API prechádzajú volania a odpovede rôznymi vrstvami. Vo všeobecnosti platí, že sa klientske a serverové aplikácie nepripájajú priamo k sebe. V komunikačnej slučke môže byť rad rôznych sprostredkovateľov. Rozhranie Web API musí byť navrhnuté tak, aby klient ani server neboli ovplyvnení tým, či komunikujú s koncovou aplikáciou alebo sprostredkovateľom.
HTTP je komunikačný protokol, ktorý sa využíva na komunikáciu webového servera s klientským softvérom. HTTP je založený na zasielaní požiadaviek a odpovedí na ne. Klient vykoná HTTP požiadavku (request) a webový server mu na ňu odpovie pomocou HTTP odpovedí (response).
Klient posiela serveru požiadavku obsahujúcu URL zdroja a metódu, ktorou oň žiada. Nepovinnou súčasťou požiadavky potom môžu byť hlavičky a telo.
URL adresa rozhrania API je štruktúrovaná podobne ako „bežná“ adresa URL webových stránok, ale konvencie pomenovania sú trochu iné a zvyčajne dodržiavajú prísnejšiu organizačnú logiku.
URL adresa v API má zvyčajne 5 častí:
- Základná URL – je počiatočnou časťou URL adresy rozhrania API. Skladá sa z protokolu, hostiteľa a portu. Napr.: http://localhost:80
- Názov spojenia - časť URL určujúca, nad akým DB spojením má server vykonať požiadavku. Napr.: /develop
- Kontrolér - organizačný celok, typicky názov BO v množnom čísle. Napr.: /storecards
-
Koncový bod (endpoint) - identifikuje, ku ktorému zdroju chce klient pristupovať. Napr.: /{id}.
Ak vykonávate dotaz nad konkrétnym BO, potom použite endpoint, napr.: /{id}/confirm, a neodovzdávajte id ako query parameter ani v tele dotazu.
- Query string – skladá sa z query parametrov, ktoré slúžia na doplnenie API dotazu o dodatočné informácie ovplyvňujúce jeho spracovanie. Napr.: ?executor=outprocess
Úplná URL adresa rozhrania API spojí tieto segmenty do URL adresy:
http://localhost:80/develop/storecards/{id}?executor=outprocess
Parametre sa zapisujú tak, že za adresou nasleduje otáznik a za ním zapísané páry vo formáte kľúč=hodnota. Páry sú oddelené znakom &. V prípade pravdivostného parametra, ak je uvedený ako posledný parameter v query stringu, netreba uvádzať hodnotu a berie sa, ako keby bola použitá hodnota True.
Query string primárne neslúži na prenos dát, ale metadát, nepoužívajte ho napríklad na odovzdanie zoznamu ID, to patrí do tela, pretože tu neprebieha kompresia a URL má len obmedzenú dĺžku.
Rezervované znaky majú v URL zvláštny význam a ak majú byť použité mimo ich vyhradeného významu, musia byť zakódované.
Query string primárne neslúži na prenos dát, ale metadát, nepoužívajte ho napríklad na odovzdanie zoznamu ID, to patrí do tela, pretože tu neprebieha kompresia a URL má len obmedzenú dĺžku.
| Znak | Kódovanie |
|---|---|
| ␣ | %20 |
| ! | %21 |
| " | %22 |
| # | %23 |
| $ | %24 |
| % | %25 |
| & | %26 |
| ' | %27 |
| ( | %28 |
| ) | %29 |
| * | %2A |
| + | %2B |
| , | %2C |
| / | %2F |
| : | %3A |
| : | %3B |
| : | %3D |
| ? | %3F |
| @ | %40 |
| [ | %5B |
| ] | %5D |
| Web API metódy a funkcie v ABRA Gen | |
|---|---|
| Metóda | Funkcia |
|
|
Účelom metódy GET je získať dáta zdroja zo servera. Metóda požiadavky GET sa považuje za bezpečnú operáciu, čo znamená, že by nemala zmeniť stav žiadneho zdroja na serveri. Metódu je teoreticky možné použiť s telom, ale nie je to zvykom a nerobte to. Získa pole s dátami skladových kariet:
Získa dáta skladovej karty s id 1000000101:
|
|
|
Táto metóda sa zvyčajne používa na odosielanie dát na spracovanie serverom. Často sa používa na vytváranie nových zdrojov alebo aktualizáciu existujúcich. Operácia POST sa nepovažuje za bezpečnú operáciu, pretože má právomoc aktualizovať stav servera a pri vykonávaní spôsobiť potenciálne vedľajšie účinky na stav servera. Nemusí byť idempotentná, čo znamená, že môže ponechať dáta a zdroje na serveri v inom stave pri každom vyvolaní. Vytvorí novú skladovú kartu:
|
|
|
Metóda PUT sa používa na aktualizáciu existujúceho zdroja na serveri. Je definovaná ako idempotentná, čo znamená, že viac rovnakých požiadaviek PUT by malo mať rovnaký účinok ako jedna požiadavka. Metóda HTTP PUT je definovaná ako idempotentná, čo znamená, že viac identických požiadaviek HTTP PUT by malo mať rovnaký účinok ako jedna požiadavka. Rovnako ako POST sa nepovažuje za bezpečnú operáciu. Modifikuje existujúcu skladovú kartu:
|
|
|
Táto metóda sa používa na odstránenie konkrétneho zdroja zo servera. Je idempotentná a nie je bezpečná. Vymaže existujúcu skladovú kartu:
|
Hlavičky umožňujú klientovi a serveru odovzdávať ďalšie informácie s HTTP požiadavkou alebo odpoveďou. Hlavička HTTP sa skladá z názvu, v ktorom sa nerozlišujú malé a veľké písmená, za ním nasleduje dvojbodka a potom samotná hodnota.
Viac viď Web API - HTTP hlavičky.
Telo požiadavky slúži na odoslanie dát klientom serveru. Telo odpovede naopak obsahuje dáta, ktoré server odosiela klientovi. Najčastejším textovým formátom pre výmenu dát sú JSON a XML. Binárna forma sa používa na pripojenie obrázkov, videí, zvuku a ďalších netextových súborov. Formát a veľkosť posielaných dát sú opísané pomocou hlavičiek Content-Type and Content-Length.
Ak v našej implementácii posielame binárne dáta, napr. obrázky ako súčasť JSON, kódujeme ich pomocou base64.
Server posiela klientovi odpoveď na požiadavku obsahujúcu stavový kód odpovede. Nepovinnou súčasťou odpovede potom môžu byť hlavičky a telo, ktoré sú opísané už v časti s požiadavkou.
Stavové kódy sú rozdelené do piatich kategórií. Prvá číslica stavového kódu definuje triedu odpovede, zatiaľ čo posledné dve číslice nemajú žiadnu klasifikačnú alebo kategorizačnú úlohu. Štandardom je definovaných päť tried:
-
1xx informačná odpoveď – požiadavka bola prijatá, proces pokračuje
-
2xx úspešný – požiadavka bola úspešne prijatá, pochopená a prijatá
-
3xx presmerovanie – na dokončenie požiadavky je potrebné vykonať ďalšie kroky
-
4xx chyba klienta – požiadavka obsahuje nesprávnu syntax alebo ju nemožno splniť
-
5xx chyba servera – serveru sa nepodarilo splniť zjavne platnú požiadavku
Dôležité stavové kódy a kedy ich použiť:
-
200 OK - Požiadavka bola úspešná a server vrátil požadované dáta
-
201 Created - Požiadavka bola úspešná a bol vytvorený nový zdroj
-
204 No Content - Server úspešne spracoval požiadavku a nevracia žiadny obsah
-
304 Not Modified - Zdroj nebol zmenený od verzie určenej v hlavičke požiadavky If-Modified-Since alebo If-None-Match. V takom prípade nie je potrebné zdroj znova prenášať, pretože klient stále má skôr stiahnutú kópiu.
-
400 Bad Request - Požiadavka bola neplatná alebo nesprávna
-
401 Unauthorized - Klientovi chýbajú platné overovacie poverenia pre požadovaný prostriedok
-
403 Forbidden - Nastane, ak používateľ nemá práva na vykonanie požiadavky
-
404 Not Found - Požadovaný zdroj nebol na serveri API nájdený, nepoužívať, ak výsledkom nejakého obmedzenia je prázdna množina, na to to neslúži
-
500 Internal Server Error - Pri spracovaní požiadavky došlo na serveri k chybe, ide o neočakávanú neošetrenú výnimku
Servery podporujú http content-negotiation, v súčasnosti je avšak vo väčšine prípadov jediným podporovaným formátom JSON, s nasledujúcimi výnimkami:
-
Špeciálne zdroje primárne určené na načítanie informácií do MS Excelu, ktoré v odpovedi na GET požiadavku vracajú výsledok vo formáte prostého textu (vždy).
-
Volanie uložených skriptov, pri ktorom je možné formát explicitne určiť (JSON alebo prostý text).
Web API umožňuje prácu s dátami vo formátoch, ktoré je možné bezpečne serializovať do formátu JSON - konkrétne dtInteger, dtSmallInt, dtWord, dtInt64, dtFloat, dtBCD, dtCurrency, dtBoolean, dtDate, dtDateTime, dtTime, dtString, dtMemo, dtFmtMemo, dtBlob, dtVarBytes, dtBytes, dtTypedBinary, dtGraphic a dtGuid (nie všetky dátové typy sa v systéme ABRA Gen skutočne používajú).
Osobitnú pozornosť je potrebné venovať práci s dátumami (a časmi). V niektorých prípadoch je cez Web API síce technicky možné na objekte nastaviť hodnotu dtDateTime (vrátane času), ale aplikácia ABRA Gen predpokladá, že príslušná položka časový údaj neobsahuje, a pri práci s takto vytvorenými alebo zmenenými záznamami môže v niektorých situáciách dôjsť k neočakávaným výsledkom. Typickým príkladom je dátum dokladu (DocDate$DATE), ktorý by mal obsahovať iba dátumovú časť.
V prípade pochybností si vyhľadajte štruktúru príslušného business objektu v popise Štruktúr a definícií GenDoc.chm. V oboch prípadoch bude pri príslušnej položke uvedený typ dtDateTime, ale v stĺpci Popis bude uvedené buď Dátum... (napr. Dátum dokladu) alebo Dátum a čas... (napr. Dátum a čas vytvorenia). Ak je v popise uvedené iba Dátum (nie Dátum a čas), zapisujte do príslušnej položky iba dátumovú časť (bez času).
Od verzie 23.1. sú položky s hodnotou 0 v API namiesto ISOStringu vrátené s hodnotou null. Hodnota null je zároveň použiteľná v klauzule where a vyhodnocuje sa ako 0.
Web API od verzie 23.1. rešpektuje práva k funkciám. Práva sa preberajú z nastavenia v agende Roly, záložka Práva k funkciám alebo Skupiny rolí podľa toho, čo primárne pre nastavenie práv daná firma využíva. Práva sa preberajú podľa jednotlivých metód.
Význam vybraných práv zo skupiny API je opísaný v kapitole Práva k funkciám.
Nevizuálnym používateľom Web API je teda potrebné nastaviť rovnaké Práva k funkciám ako pre ostatných používateľov. Prípadne možno dočasne využiť PrivilégiaObchádzať práva k API.
Web API rešpektuje aj práva k objektom, ktoré je potrebné nevizuálnym používateľom nastaviť, prípadne je možné využiť agendy Sprístupnenie položiek pre API, kde možno nastaviť výnimky.
Zisťovanie práv používateľa prebieha každých 30 sekúnd. Ak dôjde k zmene práv API používateľa, táto informácia sa po 30 sekundách zistí a uplatnia sa nové práva, ktoré sa zmenili. Dĺžku zisťovania oprávnení ovplyvňuje parameter securityRightsCheckTimeoutMs, ktorý sa nachádza v konfiguračnom súbore APIServer.yaml.
Rozdiely oproti existujúcim webovým službám (webovému API) ABRA Gen:
-
Všetko, čo potrebujete na prevádzku API, je k dispozícii v rámci inštalácie ABRA Gen, dostupné po nainštalovaní ABRA Gen.
V posledných verziách vrát. podpory https protokolu (tj. nie je nutné predradzovať ešte nejaký externý WS ako proxy).
- Neprogramujete (prostredníctvom skriptovania) na strane ABRA Gen. Tj. všetky objekty sú vo východiskovom stave k dispozícii a manipulujete s nimi deklaratívne, tj. posielate Web API nejaký JSON na určitú URL a tým vlastne hovoríte, čo chcete, aby sa s daným Business objektom (BO) stalo.
- Licencovanie - Web API systému ABRA Gen je licencované počtom používateľov, ktorí k nemu majú prístup. Pri webovom API webových služieb sa požiadavky vždy spracovávajú pod jedným konkrétnym používateľom, a keď je potrebné prihlásiť iného používateľa, je nutné vypnúť celého klienta a znovu spustiť. V Web API je možné "prepínanie používateľov za behu", resp. autentizácia je súčasťou každej požiadavky.
Web API ako celok pozostáva z dvoch komponentov. Fyzicky ide o dva súbory v zložke, v ktorej je nainštalovaný systém ABRA Gen (klient).
-
Okrem samotnej aplikácie Web API servera (APIServer.jar) je na spustenie Web API (prípadne inštaláciu a prevádzku služby Windows) potrebný ešte obsah zložky AbraWebAPI (ktorá je tiež súčasťou inštalácie ABRA Gen). Dávkový súbor APIServer.ps1 používaný na spúšťanie/inštaláciu/odinštaláciu API servera predpokladá, že táto zložka bude v rámci adresárovej štruktúry bezprostredne podradená zložke, v ktorej sa nachádza APIServer.jar (a APIServer.ps1). Zložka AbraWebAPI obsahuje dve podzložky:
-
jre.win - Java Runtime Environment (JRE) - prostredie nevyhnutné pre beh API servera; keď spustíte APIServer.ps1, z PowerShell skriptu sa spustí toto prostredie, ktorému je aplikácia APIServer.jar odovzdaná ako parameter:
.\AbraWebAPI\jre.win\bin\java.exe -jar .\APIServer.jarJRE je potrebné pri používaní Web API v režime aplikácie (spravidla používanom v testovacej prevádzke) aj v režime služby (spravidla používanom v ostrej prevádzke).
-
nssm - Non-Sucking Service Manager - nástroj využívaný na inštaláciu spustiteľného súboru ako Windows služby. NSSM je na rozdiel od JRE potrebné iba pri prevádzke Web API v režime služby.
-
Ako to vyzerá, keď pošlete z HTTP klienta požiadavku na Web API:
Klient pošle HTTP požiadavku, server požiadavku prijme a odovzdá ju API knižnici (prostredníctvom natívneho volania metódy handleRequest, ktorá je v knižnici implementovaná). Knižnica zabezpečí vyhodnotenie požiadavky v súlade s business logikou systému ABRA Gen a vráti odpoveď serveru, ktorý ju následne sprostredkuje klientovi.
Všetky komponenty Web API rozhrania podporujú podrobne nastaviteľné sledovanie činnosti s využitím štandardného logovacieho subsystému.
Na logovanie služieb Web API ("business logiky") slúži skupina AS~Group.

