Nové REST rozhraní - migrace a seznam změn

Na seznam témat a kapitol (obsah)Nadřízená kapitola

V říjnu 2018 došlo k velké modernizaci modulu webových služeb, při které došlo k mnoha změnám. Následující sekce popisují všechny změny, které v rámci modernizace nastaly a uvádějí informace o tom, jak přemigrovat klienty webových služeb na nové rozhraní:

SOAP je beze změn

SOAP rozhraní je bez jakýchkoliv změn v okamžiku, kdy webová služba probíhá bez problému.

Jediný zaznamenaný rozdíl nastává v okamžiku, kdy při zpracování webové služby dojde k chybě. V okamžiku, kdy služba vrací z jakýchkoliv důvodů SOAP:Fault, byly revidovány různé důvody a upraveny návratové hodnoty chyb (například byly udělány změny v tom, "čí je to chyba", typicky faultcode byl v případě nevalidního vstupního XML změněn na "soap:Client" a podobně). V případě normálního běhu služeb se však nezměnilo nic.

Specifikace požadovaného výstupního formátu

Ve starém REST rozhraní se k určení požadovaného výstupního formátu používal speciální parametr "outputFormat", který šel přidal k mnoha službám. Tento parametr je pro snadnost přechodu zachován, nicméně doporučujeme přejít na nový způsob určení toho, jaký výstupní formát chcete a to použitím hlaviček v HTTP požadavku. Využívejte hlavičku Accept, v níž můžete formátů uvést i více za sebou se specifikací Vašich prefencí.

Hlavičkou Content-Type naopak říkáte, jaká data na server nahráváte. To je samozřejmě potřeba pouze u služeb, které jsou volány HTTP metodami POST, PUT atd.

Aktualizovaný modul podporuje nově exporty do formátu YAML. Taktéž je podporován nově export do formátu XLSX. Společně s ukončením podpory starého REST rozhraní dojde k odebrání podpory starého formátu XLS.

Pozor, nová verze REST rozhraní již defaultně nevrací formát XML! Zadáte-li tedy adresu webové služby do webového prohlížeče, dostanete nejspíše chybovou hlášku typu

No message body writer has been found for class
                cz.zcu.stag.services.types.common.WSStringListBean,
                ContentType: text/html

či podobnou. Podstatný je onen "Content-Type: text/html" - prohlížeč totiž zasílá hlavičku "Accept" a primárně samozřejmě chce HTML stránku. Modul WS však HTML (zatím) vracet neumí a proto neumí požadovaný datový formát poskytnout.

(Ne)doporučované výstupní formáty

Pro účely napojení externích informačních systémů na IS/STAG Vám silně doporučujeme používat výstupní formáty XML, JSON, případně YAML. Naopak silně nedoporučujeme používat formáty CSV, XLS a XLSX!

Jak je uvedeno i v kapitole o výstupních datových formátech, tyto tabulkové formáty jsou určeny především pro "lidi" (tj. pro případ, kdy uživatel využívá modul WS pro export nějakých dat, na která se pak dívá v Excelu). U těchto formátů NEGARANTUJEME jejich neměnnost v čase. Zároveň je jejich generování na straně serveru neoptimalizováno a spotřebuje násobně více prostředků (čas, paměť, výkon) než výstup do doporučených formátů.

Vstupní a výstupní XML

Je rozdíl mezi starým a novým REST rozhraním u formátu XML. U starého REST rozhraní je XML vždy zabaleno do "zbytečného" ještě jednoho hlavního root elementu, například:

                <stag:insertPracoviste xmlns:stag="http://stag-ws.zcu.cz/">
                <pracoviste>
                <cisloPracoviste>12345</cisloPracoviste>
                <cisloPracovisteInterni>12345</cisloPracovisteInterni>
                <zkratka>XYZ</zkratka>
                <nazev>Testovaci pracoviste</nazev>
                <nadrazenePracoviste>REK</nadrazenePracoviste>
                <typPracoviste>K</typPracoviste>
                <vedouciUcitIdno>17098</vedouciUcitIdno>
                </pracoviste>
                </stag:insertPracoviste>
            

Nově je ten hlavní element, který dříve reflektoval název webové služby, odebrán. XML pak reprezentuje přímo a pouze onen datový typ, který je službě předáván (či ze služby vyzvedáván). Zároveň u některých služeb došlo ke změně názvu onoho hlavního datového typu, zde například namísto "pracoviste" je "pracovisteForEdit":

                <stag:pracovisteForEdit xmlns:stag="http://stag-ws.zcu.cz/">
                <cisloPracoviste>12345</cisloPracoviste>
                <cisloPracovisteInterni>12345</cisloPracovisteInterni>
                <zkratka>XYZ</zkratka>
                <nazev>Testovaci pracoviste</nazev>
                <nadrazenePracoviste>REK</nadrazenePracoviste>
                <typPracoviste>K</typPracoviste>
                <vedouciUcitIdno>17098</vedouciUcitIdno>
                </stag:pracovisteForEdit>
            

Vstupní a výstupní JSON

Ve starém modulu byly možnosti volby formátu pouze u výstupu. Při volání POST služeb se vstupními komplexními datovými typy bylo vždy nutné předat XML. Nový modul již akceptuje i na vstupu formáty JSON a YAML. (Pozor, formáty CSV a XLSX jsou opravdu speciální a jsou brány i nadále pouze jako výstupní).

U výstupu do JSON došlo ke změně, která reflektuje změnu u XML uvedenou v předchozí sekci. Dříve byl vždy celý JSON "zabalen" ještě navíc v obalovacím elementu "[" a "]" (jakoby byl celý výstup ještě navíc jako jeden prvek nějakého pole). Nově je JSON vracen "o úroveň níže", tj. není tímto root polem obalen.

HTTP kódy

V případě, že webová služba nevrací žádná data (null či prázdný seznam), nově vrací pouze HTTP kód k tomu určený: 204 No Content.

Služby se "String" výstupem

Existuje několik služeb, které vracejí pouze jediný řetězec. Jedná se například o služby getUcitIdnoByStagLogin, getExternalLoginByUcitIdno a podobné. Protože došlo k odstranění obalujícího XML elementu při výstupu dat v XML, nelze služby s takto jendoduchým výstupním datovým typem do XML vůbec převádět. Není prostě "do čeho výsledek obalit". Tyto služby proto nemají možnost výstupu do XML, musíte využít JSON a nebo službu zavolejte s "Accept: text/plain", což je nejjednodušší - výsledkem volání je prostě prostý text.

Přihlašování

Proces přihlašování je popsán v samostatné kapitole. Novinkou je to, že modul WS po úspěšném přihlášení uživatele rovnou volajícímu vrátí i nový parametr "stagUserInfo", v němž volající rovnou získá seznam uživatelských rolí toho, kdo byl právě přihlášen. Není tak pro klienta nutné rovnou okamžitě volat webovou službu getStagUserListForLoginTicket, data získá rovnou a hned.

Zároveň dojde v okamžiku ukončení podpory starého REST rozhraní k odebrání parametrů, které neměly valný význam a s přidáním nového parametru ztrácí zcela smysl - modul WS přestane předávat parametry "stagUserName" a "stagUserRoles".

Změny ve službách

V nové implementaci aplikace nebylo bohužel možno zachovat zpětnou kompatibilitu (tzn. ani ve staré, kompatibilní verzi REST rozhraní) v následujících případech:

  • studenti/zapisRozvrhovychAkci .  Struktura vstupního XML byla lehce pozměněna, došlo k "obalení" jinými XML elementy. Více viz dokumentace a WADL služby.

  • REST rozhraní všech nových služeb s prefixem ng_ .  Tyto služby jsou vytvářeny automaticky a bohužel nebylo možné jejich generování přizpůsobit. SOAP rozhraní služeb zůstalo zachováno, nicméně REST rozhraní nešlo zachovat. Struktura navráceného datového typu se bohužel lehce liší, například v případě XML je obalen novým root elementem.

    Změna se netýká mnoha reálně využívaných služeb, nicméně dva příklady používaných jsou: TROZ (Služby používané pro tvorbu rozpočtu na ZČU) a REDOP (služba pro výstup pro systém REDOP). Prosíme, kontaktujte správce těchto systémů, pokud využívají REST rozhraní, ať své klienty adaptují. Děkujeme za pochopení.

Další změny - prosím hlašte

Před nasazením modulu došlo k důkladnému testování všech služeb a v rámci tohoto testování k porovnávání starého aplikace a kompatibilního rozhraní v aplikaci nové. Testovány byly všechny výstupní formáty podporované starou aplikací (XML, JSON, CSV, XLS). Dospěli jsme k závěru, že žádné jiné rozdíly aplikace neobsahuje a tudíž že se nám podařilo vytvořit kompatibilní rozhraní tak, že až na popsané "drobnosti" (například služba, u které to bohužel vážně nešlo), je shodné s původním.

Přesto bychom velmi ocenili - jakmile narazíte na nezvyklé chování svého klienta (a tipuji, že se to určitě stane), napište nám prosím o tom hlášení na stag@service.zcu.cz a popište přesně, jaký posíláte HTTP požadavek, jak se aplikace nově chová a jak se chovala dříve. Pokusíme se na taková hlášení reagovat velmi pružně a aplikaci tak co nejdříve opravit.