{"id":10906,"date":"2025-04-09T11:29:01","date_gmt":"2025-04-09T09:29:01","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/640\/?post_type=ht_kb&#038;p=10906"},"modified":"2025-04-09T11:38:08","modified_gmt":"2025-04-09T09:38:08","slug":"interfejs-dla-programowalnych-uslug-sieci-web","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/","title":{"rendered":"Interfejs dla programowalnych us\u0142ug sieci Web"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Wprowadzenie\" >Wprowadzenie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Definicje_pojec\" >Definicje poj\u0119\u0107<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Opis\" >Opis<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Wymagania_wstepne\" >Wymagania wst\u0119pne<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Tworzenie_programowalnej_uslugi_internetowej\" >Tworzenie programowalnej us\u0142ugi internetowej<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Projektowanie_interfejsu_uslugi_sieciowej\" >Projektowanie interfejsu us\u0142ugi sieciowej<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Tworzenie_obiektow_deweloperskich_typu_Java_class_i_Application\" >Tworzenie obiekt\u00f3w deweloperskich typu Java class i Application<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#URI_zadania\" >URI \u017c\u0105dania<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Identyfikator_URI_zadania_uslugi_sieci_Web\" >Identyfikator URI \u017c\u0105dania us\u0142ugi sieci Web<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Ogolne_parametry_zapytania_URI_zadania\" >Og\u00f3lne parametry zapytania URI \u017c\u0105dania<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Tworzenie_uslugi_SOAP\" >Tworzenie us\u0142ugi SOAP<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Przyklad_uslugi_SOAP\" >Przyk\u0142ad us\u0142ugi SOAP<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Wersja_SOAP\" >Wersja SOAP<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Stanowe_uslugi_SOAP\" >Stanowe us\u0142ugi SOAP<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Tworzenie_uslugi_REST\" >Tworzenie us\u0142ugi REST<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Przyklad_uslugi_REST\" >Przyk\u0142ad us\u0142ugi REST<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Pobieranie_pliku_WSDLWADL\" >Pobieranie pliku WSDL\/WADL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Uwierzytelnianie_i_autoryzacja\" >Uwierzytelnianie i autoryzacja<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Wsparcie_dla_rozwiazywania_problemow\" >Wsparcie dla rozwi\u0105zywania problem\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Przyklady_klientow_uslug_sieciowych\" >Przyk\u0142ady klient\u00f3w us\u0142ug sieciowych<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Przykladowy_klient_uslugi_SOAP\" >Przyk\u0142adowy klient us\u0142ugi SOAP<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Przykladowy_klient_uslugi_REST\" >Przyk\u0142adowy klient us\u0142ugi REST<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Narzedzie_SOAP_UI_do_testowania_uslug_sieciowych\" >Narz\u0119dzie SOAP UI do testowania us\u0142ug sieciowych<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Ustawienia_Soap_Ui\" >Ustawienia Soap Ui<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Zalecenie\" >Zalecenie:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-programowalnych-uslug-sieci-web\/#Nowy_projekt_SOAP_UI\" >Nowy projekt SOAP UI<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h3 data-start=\"197\" data-end=\"220\" id=\"wprowadzenie\" ><span class=\"ez-toc-section\" id=\"Wprowadzenie\"><\/span><strong data-start=\"197\" data-end=\"220\">Wprowadzenie<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"\" data-start=\"222\" data-end=\"353\">Dost\u0119pnych jest kilka nieprogramowalnych us\u0142ug sieciowych, wykorzystuj\u0105ce protok\u00f3\u0142 <em data-start=\"307\" data-end=\"315\">SOAP<\/em> do po\u0142\u0105cze\u0144 zdalnych. Nale\u017c\u0105 do nich m.in:<\/p>\n<ul data-start=\"355\" data-end=\"417\">\n<li class=\"\" data-start=\"355\" data-end=\"374\">\n<p class=\"\" data-start=\"357\" data-end=\"374\">eksport danych<\/p>\n<\/li>\n<li class=\"\" data-start=\"375\" data-end=\"393\">\n<p class=\"\" data-start=\"377\" data-end=\"393\">import danych<\/p>\n<\/li>\n<li class=\"\" data-start=\"394\" data-end=\"417\">\n<p class=\"\" data-start=\"396\" data-end=\"417\">zdalne wyszukiwanie <span style=\"font-size: revert; color: initial;\">\u2013 jako wyspecjalizowane us\u0142ugi sieciowe<\/span><\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"461\" data-end=\"675\">Dodatkowo, ka\u017cda aplikacja dzia\u0142aj\u0105ca w tle mo\u017ce zosta\u0107 wywo\u0142ana jako bezstanowa us\u0142uga sieciowa za pomoc\u0105 <em data-start=\"568\" data-end=\"587\">CallApplication<\/em>. Interfejs ten wykorzystuje og\u00f3lnodost\u0119pn\u0105 bibliotek\u0119 us\u0142ug sieciowych <em data-start=\"659\" data-end=\"674\">Apache Axis<\/em>.<\/p>\n<p class=\"\" data-start=\"677\" data-end=\"832\">Dost\u0119pny jest r\u00f3wnie\u017c dodatkowy interfejs przeznaczony dla programowalnych us\u0142ug sieciowych. Umo\u017cliwia on implementacj\u0119 w\u0142asnych us\u0142ug sieciowych jako:<\/p>\n<ul data-start=\"834\" data-end=\"872\">\n<li class=\"\" data-start=\"834\" data-end=\"854\">\n<p class=\"\" data-start=\"836\" data-end=\"854\">us\u0142ug <em data-start=\"842\" data-end=\"848\">SOAP<\/em><\/p>\n<\/li>\n<li class=\"\" data-start=\"855\" data-end=\"872\">\n<p class=\"\" data-start=\"857\" data-end=\"872\">us\u0142ug <em data-start=\"863\" data-end=\"869\">REST<\/em><\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"874\" data-end=\"1067\">je\u015bli istnieje taka potrzeba. Interfejs ten opiera si\u0119 na og\u00f3lnodost\u0119pnej bibliotece <em data-start=\"959\" data-end=\"973\">Apache CXF<\/em>. Szczeg\u00f3\u0142owe informacje na temat biblioteki CXF mo\u017cna znale\u017a\u0107 na oficjalnej stronie projektu:<\/p>\n<p class=\"\" data-start=\"1069\" data-end=\"1117\"><a class=\"\" href=\"http:\/\/cxf.apache.org\/\" target=\"_new\" rel=\"noopener\" data-start=\"1069\" data-end=\"1117\">http:\/\/cxf.apache.org\/<\/a><\/p>\n<p class=\"\" data-start=\"1119\" data-end=\"1239\">Dost\u0119pne s\u0105 przyk\u0142adowe us\u0142ugi SOAP i REST oraz przyk\u0142adowy klient SOAP zaimplementowany w j\u0119zyku Java.<\/p>\n<p class=\"\" data-start=\"1241\" data-end=\"1500\">Niniejszy artyku\u0142 przedstawia kroki niezb\u0119dne do opracowania w\u0142asnych programowalnych us\u0142ug internetowych, a tak\u017ce opisuje przyk\u0142adowe us\u0142ugi i klient\u00f3w. Pokr\u00f3tce obja\u015bnione zosta\u0142o r\u00f3wnie\u017c narz\u0119dzie <em data-start=\"1447\" data-end=\"1458\">Soap UI<\/em>, s\u0142u\u017c\u0105ce do testowania us\u0142ug SOAP i REST.<\/p>\n<h3 data-start=\"1507\" data-end=\"1528\" id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span><strong data-start=\"1507\" data-end=\"1528\">Grupa docelowa<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul data-start=\"1530\" data-end=\"1582\">\n<li class=\"\" data-start=\"1530\" data-end=\"1555\">\n<p class=\"\" data-start=\"1532\" data-end=\"1555\">programi\u015bci aplikacji<\/p>\n<\/li>\n<li class=\"\" data-start=\"1556\" data-end=\"1582\">\n<p class=\"\" data-start=\"1558\" data-end=\"1582\">konsultanci techniczni<\/p>\n<\/li>\n<\/ul>\n<h3 id=\"definicje-pojec\" ><span class=\"ez-toc-section\" id=\"Definicje_pojec\"><\/span>Definicje poj\u0119\u0107<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><strong>JAXB (Java Architecture for XML Binding)<\/strong> &#8211; interfejs Java, kt\u00f3ry opisuje, w jaki spos\u00f3b dane z instancji schematu XML s\u0105 automatycznie wi\u0105zane z klasami Java i w jaki spos\u00f3b te klasy Java s\u0105 generowane ze schematu XML.<\/p>\n<p><strong>JAX-RS (Java API for RESTful Web Services)<\/strong> &#8211; specyfikacja interfejsu Java, kt\u00f3ra umo\u017cliwia i standaryzuje wykorzystanie stylu architektonicznego REST w kontek\u015bcie us\u0142ug sieciowych.<\/p>\n<p><strong>JAX-WS (Java API for XML Web Services)<\/strong> &#8211; specyfikacja interfejsu Java do tworzenia us\u0142ug sieciowych.<\/p>\n<p><strong>REST (Representational State Transfer)<\/strong> &#8211; styl pozwalaj\u0105cy na wymian\u0119 wiadomo\u015bci w rozproszonych hipermedialnych systemach informacyjnych opartych na protokole HTTP. Nie ma on charakteru protoko\u0142u i nie jest obecnie standaryzowany. W przeciwie\u0144stwie do SOAP, \u017cadne konwencje protoko\u0142u nie musz\u0105 by\u0107 znane, aby klient i serwer mog\u0142y si\u0119 komunikowa\u0107. G\u0142\u00f3wn\u0105 rol\u0119 odgrywaj\u0105 nast\u0119puj\u0105ce podstawowe zasady:<\/p>\n<ul>\n<li>Adresowalno\u015b\u0107 zasob\u00f3w<\/li>\n<li>Wykorzystanie hipermedi\u00f3w opartych na HTML lub XML<\/li>\n<li>Wykorzystanie standardowych operacji HTTP<\/li>\n<li>Bezstanowo\u015b\u0107 komunikacji, kt\u00f3ra nie odnosi si\u0119 do stanu serwera. REST przewiduje, \u017ce stan ten jest utrzymywany przez klienta lub przekszta\u0142cany w stan zasobu przez serwer. Przej\u015bciowy, specyficzny dla klienta stan przechowywany po stronie serwera na czas trwania \u017c\u0105dania nie jest zamierzony.<\/li>\n<\/ul>\n<p><strong>U\u017cycie protoko\u0142u HTTP zgodnego z REST (RESTful http)<\/strong> &#8211; u\u017cycie operacji HTTP w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n<li>GET &#8211; \u017c\u0105danie danych z serwera<\/li>\n<li>POST &#8211; przechowywanie nowych danych na serwerze<\/li>\n<li>PUT &#8211; aktualizacja istniej\u0105cych danych<\/li>\n<li>DELETE &#8211; usuwanie danych<\/li>\n<li>HEAD &#8211; \u017c\u0105danie metadanych dla zasobu<\/li>\n<li>OPTIONS &#8211; sprawdzenie, kt\u00f3re operacje s\u0105 dost\u0119pne dla zasobu<\/li>\n<\/ul>\n<p><strong>Us\u0142uga REST<\/strong> &#8211; us\u0142uga sieciowa wykorzystuj\u0105ca styl architektoniczny REST.<\/p>\n<p><strong>SOAP (Simple Object Access Protocol)<\/strong> &#8211; oparty na XML protok\u00f3\u0142 wymiany wiadomo\u015bci w systemach rozproszonych. SOAP jest u\u017cywany do komunikacji mi\u0119dzy klientami us\u0142ug internetowych a serwerami.<\/p>\n<p><strong>Us\u0142uga<\/strong> <strong>SOAP<\/strong> &#8211; us\u0142uga sieciowa wykorzystuj\u0105ca protok\u00f3\u0142 <em>SOAP<\/em> do po\u0142\u0105cze\u0144 zdalnych.<\/p>\n<p><strong>WADL (Web Application Description Language)<\/strong> -j\u0119zyk opisu us\u0142ug internetowych zgodnych ze standardem REST.<\/p>\n<p><strong>WSDL (Web Services Description Language)<\/strong> &#8211; j\u0119zyk opisu interfejsu us\u0142ugi sieciowej.<\/p>\n<h3 id=\"opis\" ><span class=\"ez-toc-section\" id=\"Opis\"><\/span>Opis<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Interfejs programowalnych us\u0142ug sieci Web mo\u017cna wykorzysta\u0107 do opracowania us\u0142ugi sieci Web jako us\u0142ugi SOAP lub us\u0142ugi REST. Decyzja o u\u017cyciu us\u0142ugi SOAP lub REST zale\u017cy od konkretnych wymaga\u0144.<\/p>\n<h4 id=\"wymagania-wstepne\" ><span class=\"ez-toc-section\" id=\"Wymagania_wstepne\"><\/span>Wymagania wst\u0119pne<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>SAS, na kt\u00f3rym uruchamiana jest programowalna us\u0142uga sieciowa, musi zosta\u0107 uruchomiony razem z serwerem sieciowym. W ten spos\u00f3b uruchamiany jest r\u00f3wnie\u017c serwer us\u0142ug sieciowych. Serwer us\u0142ug sieciowych nie mo\u017ce zosta\u0107 uruchomiony oddzielnie od serwera sieciowego.<\/p>\n<h4 id=\"tworzenie-programowalnej-uslugi-internetowej\" ><span class=\"ez-toc-section\" id=\"Tworzenie_programowalnej_uslugi_internetowej\"><\/span>Tworzenie programowalnej us\u0142ugi internetowej<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p class=\"\" data-start=\"204\" data-end=\"431\">Opracowanie programowalnej us\u0142ugi sieciowej obejmuje kilka etap\u00f3w \u2014 od utworzenia obiektu deweloperskiego typu <em>Application<\/em>, a\u017c po implementacj\u0119 wewn\u0119trznej klasy Java, w kt\u00f3rej definiowane s\u0105 funkcje danej us\u0142ugi sieciowej.<\/p>\n<h5 id=\"projektowanie-interfejsu-uslugi-sieciowej\" ><span class=\"ez-toc-section\" id=\"Projektowanie_interfejsu_uslugi_sieciowej\"><\/span>Projektowanie interfejsu us\u0142ugi sieciowej<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p class=\"\" data-start=\"496\" data-end=\"633\">Interfejs programowalnej us\u0142ugi sieciowej powinien zosta\u0107 zaprojektowany zgodnie z okre\u015blonymi wymaganiami technicznymi oraz biznesowymi.<\/p>\n<p class=\"\" data-start=\"635\" data-end=\"940\">Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119, \u017ce infrastruktura dost\u0119pna w systemie do realizacji us\u0142ug sieciowych nie jest przeznaczona do przetwarzania du\u017cych ilo\u015bci danych. Mo\u017ce wyst\u0105pi\u0107 sytuacja, w kt\u00f3rej zar\u00f3wno odebrane, jak i wysy\u0142ane dane musz\u0105 zosta\u0107 w ca\u0142o\u015bci przetworzone w pami\u0119ci operacyjnej serwera aplikacji.<\/p>\n<p class=\"\" data-start=\"942\" data-end=\"1082\">Takie dzia\u0142anie mo\u017ce prowadzi\u0107 do istotnego obci\u0105\u017cenia serwera aplikacji, a w konsekwencji \u2014 do wyra\u017anego spadku wydajno\u015bci systemu.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Poniewa\u017c interfejs dla programowalnych us\u0142ug internetowych jest realizowany przy u\u017cyciu <em>Apache CXF<\/em>, do cel\u00f3w debugowania mo\u017cna u\u017cy\u0107 informacji zawartych na nast\u0119puj\u0105cej stronie internetowej:<\/p>\n<p>http:\/\/cxf.apache.org\/docs\/debugging-and-logging.html<\/div><\/section>\n<p class=\"\" data-start=\"163\" data-end=\"349\">Je\u015bli komunikaty s\u0105 generowane w kolejce komunikat\u00f3w podczas \u017c\u0105dania klienta w ramach implementacji us\u0142ugi sieciowej, nie s\u0105 one automatycznie przekazywane z powrotem do klienta.<\/p>\n<p class=\"\" data-start=\"351\" data-end=\"494\">W przypadku, gdy zwrot tych komunikat\u00f3w jest wymagany, to w\u0142a\u015bnie implementacja us\u0142ugi sieciowej powinna zadba\u0107 o ich zwr\u00f3cenie do klienta.<\/p>\n<h5 id=\"tworzenie-obiektow-deweloperskich-typu-java-class-i-application\" ><span class=\"ez-toc-section\" id=\"Tworzenie_obiektow_deweloperskich_typu_Java_class_i_Application\"><\/span>Tworzenie obiekt\u00f3w deweloperskich typu <em>Java class<\/em> i <em>Application<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p class=\"\" data-start=\"283\" data-end=\"363\">Nale\u017cy utworzy\u0107 obiekt programistyczny typu <em>Java class<\/em>. Zaleca si\u0119, aby:<\/p>\n<ul data-start=\"365\" data-end=\"476\">\n<li class=\"\" data-start=\"365\" data-end=\"424\">\n<p class=\"\" data-start=\"367\" data-end=\"424\">nazwa klasy Java by\u0142a identyczna z nazw\u0105 aplikacji<\/p>\n<\/li>\n<li class=\"\" data-start=\"425\" data-end=\"476\">\n<p class=\"\" data-start=\"427\" data-end=\"476\">stosowa\u0107 przyrostek <em>Service\u00a0<\/em>w nazwie klasy<\/p>\n<\/li>\n<\/ul>\n<p>Przestrze\u0144 nazw powinna rozpoczyna\u0107 si\u0119 analogicznie jak odpowiednia przestrze\u0144 nazw <em>.log,<\/em> jednak zako\u0144czenie powinno przyjmowa\u0107 posta\u0107 <em>.soap<\/em> lub <em>.rest<\/em>, zamiast <em>.log.<\/em><\/p>\n<p class=\"\" data-start=\"751\" data-end=\"943\">Utworzona klasa Java musi dziedziczy\u0107 po abstrakcyjnej klasie <em>CisWebServiceApplication.<\/em><br data-start=\"844\" data-end=\"847\" \/>Nadklasa ta definiuje metod\u0119 <em>init()<\/em>, kt\u00f3ra stanowi punkt wyj\u015bcia do dalszej implementacji.<\/p>\n<p class=\"\" data-start=\"945\" data-end=\"1034\">Dalszy przebieg implementacji zale\u017cy od rodzaju tworzonej us\u0142ugi \u2014 SOAP lub REST.<\/p>\n<p>W kolejnym kroku nale\u017cy utworzy\u0107 obiekt programistyczny typu <em>Application.<\/em><\/p>\n<p>W pe\u0142ni kwalifikowana nazwa tej aplikacji jest wykorzystywana do jednoznacznej identyfikacji us\u0142ugi sieciowej:<\/p>\n<ul>\n<li class=\"\" data-start=\"1304\" data-end=\"1380\">\n<p class=\"\" data-start=\"1306\" data-end=\"1380\">Typ aplikacji musi zosta\u0107 ustawiony na <em>us\u0142uga RPC\u00a0<\/em>(<em data-start=\"1363\" data-end=\"1376\">RPC service<\/em>).<\/p>\n<\/li>\n<li class=\"\" data-start=\"1381\" data-end=\"1545\">\n<p class=\"\" data-start=\"1383\" data-end=\"1445\">W zale\u017cno\u015bci od charakteru tworzonej us\u0142ugi w polu<em> Specjalne zastosowanie<\/em> nale\u017cy wybra\u0107 odpowiednio:<\/p>\n<ul data-start=\"1448\" data-end=\"1545\">\n<li class=\"\" data-start=\"1448\" data-end=\"1472\">\n<p class=\"\" data-start=\"1450\" data-end=\"1472\"><em data-start=\"1450\" data-end=\"1466\">SOAP service<\/em><\/p>\n<\/li>\n<li class=\"\" data-start=\"1475\" data-end=\"1545\">\n<p class=\"\" data-start=\"1477\" data-end=\"1545\"><em data-start=\"1477\" data-end=\"1493\">REST service<\/em><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Je\u015bli do aplikacji ze specjalnym zastosowaniem <em data-start=\"86\" data-end=\"101\">us\u0142uga REST<\/em>\u00a0przypisana zosta\u0142a klasa Java, w kt\u00f3rej zdefiniowano i zaimplementowano us\u0142ug\u0119 SOAP \u2014 lub odwrotnie \u2014 to niezgodno\u015b\u0107 ta zostanie wykryta dopiero podczas wywo\u0142ania us\u0142ugi, a nast\u0119pnie zostanie wygenerowany komunikat o b\u0142\u0119dzie.<\/p>\n<h5 id=\"uri-zadania\" ><span class=\"ez-toc-section\" id=\"URI_zadania\"><\/span>URI \u017c\u0105dania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<h6 id=\"identyfikator-uri-zadania-uslugi-sieci-web\" ><span class=\"ez-toc-section\" id=\"Identyfikator_URI_zadania_uslugi_sieci_Web\"><\/span>Identyfikator URI \u017c\u0105dania us\u0142ugi sieci Web<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aby wywo\u0142a\u0107 us\u0142ugi sieciowe, nale\u017cy wywo\u0142a\u0107 oddzielny identyfikator URI specyficzny dla danej us\u0142ugi sieciowej. Struktura tego identyfikatora URI jest nast\u0119puj\u0105ca:<\/p>\n<ul>\n<li>dla us\u0142ugi SOAP<\/li>\n<\/ul>\n<p>https:\/\/&lt;base-url&gt;\/services\/soap\/&lt;w pe\u0142ni kwalifikowana nazwa aplikacji&gt;?oltp=&lt;nazwa bazy danych&gt;<\/p>\n<p>Sk\u0142adnik <em>services\/soap<\/em> identyfikatora URI \u017c\u0105dania sygnalizuje serwerowi us\u0142ugi sieci Web, \u017ce adresowana jest us\u0142uga SOAP.<\/p>\n<ul>\n<li>dla us\u0142ugi REST<\/li>\n<\/ul>\n<p>https:\/\/&lt;base-url&gt;\/services\/rest\/&lt;w pe\u0142ni kwalifikowana nazwa aplikacji&gt;\/&lt;zasoby&gt;\/&lt;mo\u017cliwe parametry&gt;\/?oltp=&lt;nazwa bazy danych&gt;<\/p>\n<p>Sk\u0142adnik <em>services\/rest<\/em> identyfikatora URI \u017c\u0105dania sygnalizuje serwerowi us\u0142ugi sieciowej, \u017ce adresowana jest us\u0142uga REST. Sk\u0142adnik <em>&lt;resource&gt;<\/em> adresuje \u017c\u0105dan\u0105 funkcjonalno\u015b\u0107, kt\u00f3ra jest wywo\u0142ywana z wymaganymi parametrami, je\u015bli to konieczne.<\/p>\n<h6 id=\"ogolne-parametry-zapytania-uri-zadania\" ><span class=\"ez-toc-section\" id=\"Ogolne_parametry_zapytania_URI_zadania\"><\/span>Og\u00f3lne parametry zapytania URI \u017c\u0105dania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Mo\u017cna u\u017cy\u0107 nast\u0119puj\u0105cych og\u00f3lnych parametr\u00f3w zapytania:<\/p>\n<table class=\"min-w-full\" style=\"width: 100%; height: 207px;\" data-start=\"440\" data-end=\"1109\">\n<thead data-start=\"440\" data-end=\"477\">\n<tr style=\"height: 46px;\" data-start=\"440\" data-end=\"477\">\n<th style=\"height: 46px; border-style: outset;\" data-start=\"440\" data-end=\"465\"><strong data-start=\"442\" data-end=\"464\">Parametr zapytania<\/strong><\/th>\n<th style=\"height: 46px; border-style: outset;\" data-start=\"465\" data-end=\"477\"><strong data-start=\"467\" data-end=\"475\">Opis<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"517\" data-end=\"1109\">\n<tr style=\"height: 23px;\" data-start=\"517\" data-end=\"611\">\n<th style=\"height: 23px; border-style: outset;\" data-start=\"517\" data-end=\"542\"><strong data-start=\"519\" data-end=\"538\">displayLanguage<\/strong><\/th>\n<th class=\"min-w-[calc(var(--thread-content-max-width)\/3)]\" style=\"height: 23px; border-style: outset;\" data-start=\"542\" data-end=\"611\">Okre\u015bla \u017c\u0105dany j\u0119zyk interfejsu u\u017cytkownika (j\u0119zyk wy\u015bwietlania).<\/th>\n<\/tr>\n<tr style=\"height: 23px;\" data-start=\"612\" data-end=\"697\">\n<th style=\"height: 23px; border-style: outset;\" data-start=\"612\" data-end=\"637\"><strong data-start=\"614\" data-end=\"633\">contentLanguage<\/strong><\/th>\n<th class=\"min-w-[calc(var(--thread-content-max-width)\/3)]\" style=\"height: 23px; border-style: outset;\" data-start=\"637\" data-end=\"697\">Okre\u015bla \u017c\u0105dany j\u0119zyk tre\u015bci (np. danych lub dokument\u00f3w).<\/th>\n<\/tr>\n<tr style=\"height: 23px;\" data-start=\"698\" data-end=\"750\">\n<th style=\"height: 23px; border-style: outset;\" data-start=\"698\" data-end=\"723\"><strong data-start=\"700\" data-end=\"708\">oltp<\/strong><\/th>\n<th style=\"height: 23px; border-style: outset;\" data-start=\"723\" data-end=\"750\">Nazwa bazy danych OLTP.<\/th>\n<\/tr>\n<tr style=\"height: 23px;\" data-start=\"751\" data-end=\"817\">\n<th style=\"height: 23px; border-style: outset;\" data-start=\"751\" data-end=\"776\"><strong data-start=\"753\" data-end=\"764\">context<\/strong><\/th>\n<th style=\"height: 23px; border-style: outset;\" data-start=\"776\" data-end=\"817\">Kod \u017c\u0105danej jednostki organizacyjnej.<\/th>\n<\/tr>\n<tr style=\"height: 46px;\" data-start=\"818\" data-end=\"999\">\n<th style=\"height: 46px; border-style: outset;\" data-start=\"818\" data-end=\"843\"><strong data-start=\"820\" data-end=\"828\">wsdl<\/strong><\/th>\n<th class=\"min-w-[calc(var(--thread-content-max-width)\/2)]\" style=\"height: 46px; border-style: outset;\" data-start=\"843\" data-end=\"999\">Sygna\u0142 dla serwera us\u0142ug sieciowych do udost\u0119pnienia pliku WSDL dla us\u0142ugi SOAP. Parametr <em data-start=\"935\" data-end=\"943\">wsdl<\/em>\u00a0musi by\u0107 podany jako <strong data-start=\"965\" data-end=\"996\">pierwszy parametr zapytania<\/strong>.<\/th>\n<\/tr>\n<tr style=\"height: 23px;\" data-start=\"1000\" data-end=\"1109\">\n<th style=\"height: 23px; border-style: outset;\" data-start=\"1000\" data-end=\"1025\"><strong data-start=\"1002\" data-end=\"1011\">_wadl<\/strong><\/th>\n<th class=\"min-w-[calc(var(--thread-content-max-width)\/3)]\" style=\"height: 23px; border-style: outset;\" data-start=\"1025\" data-end=\"1109\">Sygna\u0142 dla serwera us\u0142ug sieciowych do udost\u0119pnienia pliku WADL dla us\u0142ugi REST.<\/th>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>W przypadku u\u017cycia kilku parametr\u00f3w zapytania, s\u0105 one oddzielone znakiem &amp; lub \u015brednikiem (;).<\/p>\n<h5 id=\"tworzenie-uslugi-soap\" ><span class=\"ez-toc-section\" id=\"Tworzenie_uslugi_SOAP\"><\/span>Tworzenie us\u0142ugi SOAP<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W utworzonej klasie Java musi znajdowa\u0107 si\u0119 klasa wewn\u0119trzna, oznaczona za pomoc\u0105 adnotacji JAX-WS: <code data-start=\"897\" data-end=\"910\">@WebService<\/code><\/p>\n<p class=\"\" data-start=\"322\" data-end=\"377\">Adnotacja ta nie wymaga podawania \u017cadnych warto\u015bci.<\/p>\n<p class=\"\" data-start=\"379\" data-end=\"662\">Klasa wewn\u0119trzna pe\u0142ni funkcj\u0119 definicji i implementacji us\u0142ugi SOAP. Nazwa tej klasy okre\u015bla nazw\u0119 us\u0142ugi w pliku WSDL.<br data-start=\"509\" data-end=\"512\" \/>Zaleca si\u0119, aby nazwa klasy wewn\u0119trznej nie ko\u0144czy\u0142a si\u0119 przyrostkiem <em>Service<\/em>, aby unikn\u0105\u0107 redundancji i niejednoznaczno\u015bci w dokumentacji WSDL.<\/p>\n<p class=\"\" data-start=\"664\" data-end=\"814\">Wszystkie publiczne metody zaimplementowane w tej klasie wewn\u0119trznej b\u0119d\u0105 udost\u0119pnione klientowi SOAP jako funkcjonalne sk\u0142adniki us\u0142ugi SOAP.<\/p>\n<p class=\"\" data-start=\"816\" data-end=\"1049\">Dodatkowe informacje dotycz\u0105ce JAX-WS, a w szczeg\u00f3lno\u015bci wykorzystania adnotacji <code data-start=\"897\" data-end=\"910\">@WebService<\/code>, mo\u017cna znale\u017a\u0107 pod adresem:<br data-start=\"938\" data-end=\"941\" \/><a class=\"\" href=\"http:\/\/cxf.apache.org\/docs\/developing-a-service.html\" target=\"_new\" rel=\"noopener\" data-start=\"941\" data-end=\"1049\">http:\/\/cxf.apache.org\/docs\/developing-a-service.html<\/a><\/p>\n<h5 id=\"przyklad-uslugi-soap\" ><span class=\"ez-toc-section\" id=\"Przyklad_uslugi_SOAP\"><\/span>Przyk\u0142ad us\u0142ugi SOAP<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p class=\"\" data-start=\"219\" data-end=\"298\">Udost\u0119pniona zosta\u0142a aplikacja oraz odpowiadaj\u0105ca jej klasa Java:<\/p>\n<p class=\"\" data-start=\"300\" data-end=\"370\"><strong data-start=\"300\" data-end=\"370\"><code data-start=\"302\" data-end=\"368\">com.cisag.app.system.webservices.service.soap.SOAPExampleService<\/code><\/strong><\/p>\n<p class=\"\" data-start=\"372\" data-end=\"613\">Metoda <em>init()<\/em> zawiera inicjalizacj\u0119 wewn\u0119trznego mened\u017cera obiekt\u00f3w oraz mened\u017cera transakcji.<br data-start=\"472\" data-end=\"475\" \/>Wewn\u0119trzna klasa <em>SOAPExample <\/em>zawiera definicj\u0119 i implementacj\u0119 us\u0142ugi SOAP. Klasa ta oznaczona jest adnotacj\u0105 <em>@WebService<\/em>.<\/p>\n<p>Poni\u017csza metoda umo\u017cliwia po\u0142\u0105czenie powitania <em data-start=\"727\" data-end=\"736\">Hello<\/em>\u00a0z warto\u015bci\u0105 parametru <em>name<\/em> i zwr\u00f3cenie go jako ci\u0105g tekstowy:<\/p>\n<p><code>String sayHello(String name)<\/code><\/p>\n<p class=\"\" data-start=\"867\" data-end=\"970\">Za pomoc\u0105 poni\u017cszej metody mo\u017cna sprawdzi\u0107, czy istnieje zlecenie sprzeda\u017cy o okre\u015blonym typie i numerze.<\/p>\n<p><code>boolean existSalesOrder(String type, String number)<\/code><\/p>\n<p>Poni\u017csza metoda zwraca obiekt typu <em>SalesOrderResult<\/em> na podstawie zdefiniowanego typu i numeru zlecenia. Zwracany obiekt zawiera informacje o statusie zlecenia sprzeda\u017cy oraz odpowiedzialnym pracowniku.<br data-start=\"1285\" data-end=\"1288\" \/>Nale\u017cy pami\u0119ta\u0107, \u017ce obiekt typu <em>SalesOrderResult<\/em>\u00a0musi zosta\u0107 zaimplementowany jako statyczna klasa Java (<em data-start=\"1403\" data-end=\"1422\">static Java class<\/em>):<\/p>\n<p><code>public SalesOrderResult getSalesOrderByBusinessKey(String type, String number)<\/code><\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Aby precyzyjnie opisa\u0107 parametry wej\u015bciowe metod, zaleca si\u0119 stosowanie adnotacji: <code><code>@WebParam(\"nazwa_parametru\"). <\/code><\/code>Dzi\u0119ki temu w pliku <em>WSDL <\/em>oraz w automatycznie generowanych klasach zamiast domy\u015blnych nazw, takich jak <em data-start=\"1694\" data-end=\"1710\">arg0, arg1<\/em>, b\u0119d\u0105 pojawia\u0107 si\u0119 rzeczywiste, zdefiniowane nazwy parametr\u00f3w.<\/div><\/section>\n<h5 id=\"wersja-soap\" ><span class=\"ez-toc-section\" id=\"Wersja_SOAP\"><\/span>Wersja SOAP<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p class=\"\" data-start=\"0\" data-end=\"221\">Programowalne us\u0142ugi SOAP domy\u015blnie wykorzystuj\u0105 wersj\u0119 <em>SOAP 1.2 <\/em>w pliku WSDL. Odpowiedzi SOAP s\u0105 przesy\u0142ane w tej wersji protoko\u0142u, kt\u00f3r\u0105 klient zastosowa\u0142 przy wysy\u0142aniu \u017c\u0105dania, czyli SOAP 1.1 lub SOAP 1.2.<\/p>\n<p class=\"\" data-start=\"223\" data-end=\"448\">Mo\u017cliwe jest okre\u015blenie, \u017ce dana us\u0142uga SOAP ma obs\u0142ugiwa\u0107 wy\u0142\u0105cznie SOAP 1.1. W takim przypadku w pliku WSDL r\u00f3wnie\u017c zostanie u\u017cyta wersja SOAP 1.1. W tym celu nale\u017cy doda\u0107 do klasy wewn\u0119trznej nast\u0119puj\u0105c\u0105 adnotacj\u0119:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span class=\"hljs-meta\">@javax<\/span>.xml.ws.BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING)<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"547\" data-end=\"689\">Nale\u017cy pami\u0119ta\u0107, \u017ce us\u0142ugi sieciowe nieprogramowalne, opisane w artykule <a href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/interfejs-uslug-sieciowych\/\"><em>Interfejs us\u0142ug sieciowych<\/em><\/a>\u00a0korzystaj\u0105 z wersji SOAP 1.1.<\/p>\n<h5 id=\"stanowe-uslugi-soap\" ><span class=\"ez-toc-section\" id=\"Stanowe_uslugi_SOAP\"><\/span>Stanowe us\u0142ugi SOAP<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p class=\"\" data-start=\"0\" data-end=\"338\">Us\u0142ugi SOAP mog\u0105 by\u0107 r\u00f3wnie\u017c wywo\u0142ywane w trybie stanowym. Dla ka\u017cdej us\u0142ugi wywo\u0142ywanej w ramach sesji tworzona jest oddzielna instancja aplikacji wraz z powi\u0105zanym obiektem us\u0142ugi. Kolejne wywo\u0142ania tej samej us\u0142ugi w tej samej sesji wykonywane s\u0105 na ju\u017c istniej\u0105cym obiekcie, co umo\u017cliwia zachowanie stanu mi\u0119dzy \u017c\u0105daniami.<\/p>\n<p class=\"\" data-start=\"340\" data-end=\"555\">Stan mo\u017ce by\u0107 przechowywany za pomoc\u0105 atrybut\u00f3w zar\u00f3wno w instancji aplikacji, jak i w obiekcie us\u0142ugi. Dzi\u0119ki temu mo\u017cliwe jest przekazywanie danych lub kontekstu pomi\u0119dzy kolejnymi wywo\u0142aniami tej samej sesji.<\/p>\n<p class=\"\" data-start=\"557\" data-end=\"816\">Nale\u017cy pami\u0119ta\u0107, \u017ce sesje s\u0105 automatycznie zamykane po okre\u015blonym czasie bezczynno\u015bci. Aby utrzyma\u0107 sesj\u0119 aktywn\u0105, konieczne jest wykonanie przynajmniej jednego wywo\u0142ania dowolnej us\u0142ugi sieciowej w obr\u0119bie tej samej sesji przed up\u0142ywem czasu oczekiwania.<\/p>\n<p class=\"\" data-start=\"818\" data-end=\"942\">W tym celu system udost\u0119pnia tak\u017ce metod\u0119 podtrzymuj\u0105c\u0105 sesj\u0119 \u2013 bezparametrow\u0105 metod\u0119 <strong data-start=\"904\" data-end=\"916\"><code data-start=\"906\" data-end=\"914\">ping()<\/code><\/strong>, dost\u0119pn\u0105 w us\u0142udze SOAP:<\/p>\n<p><code>com.cisag.sys.tools.webservices.log.Session<\/code><\/p>\n<h5 id=\"tworzenie-uslugi-rest\" ><span class=\"ez-toc-section\" id=\"Tworzenie_uslugi_REST\"><\/span>Tworzenie us\u0142ugi REST<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W przechwyconej klasie Java musi znajdowa\u0107 si\u0119 klasa wewn\u0119trzna, kt\u00f3ra oznaczona jest nast\u0119puj\u0105c\u0105 adnotacj\u0105 JAX-RS:<\/p>\n<p><code>@Path(\"W pe\u0142ni kwalifikowana nazwa aplikacji REST\")<\/code><\/p>\n<p class=\"\" data-start=\"98\" data-end=\"280\">Adnotacja ta wymaga jako warto\u015bci w pe\u0142ni kwalifikowanej nazwy przechwyconej aplikacji, dla kt\u00f3rej ustawiono typ <em>us\u0142uga RPC<\/em> oraz specjalne zastosowanie <em>us\u0142uga REST<\/em>.<\/p>\n<p class=\"\" data-start=\"282\" data-end=\"408\">Podana nazwa reprezentuje zas\u00f3b g\u0142\u00f3wny (<em data-start=\"326\" data-end=\"341\">root resource<\/em>), kt\u00f3ry stanowi wymagany sk\u0142adnik URI \u017c\u0105dania dla us\u0142ugi REST.<\/p>\n<p class=\"\" data-start=\"410\" data-end=\"478\">Dodatkowo, klasa wewn\u0119trzna musi posiada\u0107 publiczny konstruktor.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli adnotacja nie zawiera nazwy aplikacji, nie mo\u017cna wywo\u0142a\u0107 us\u0142ugi.<\/div><\/section>\n<p class=\"\" data-start=\"167\" data-end=\"343\">Funkcjonalno\u015bci us\u0142ugi REST, kt\u00f3re s\u0105 dost\u0119pne dla klienta REST, reprezentowane s\u0105 przez publiczne metody klasy (tzw. metody zasob\u00f3w), oznaczone adnotacjami JAX-RS. Stosowane s\u0105 nast\u0119puj\u0105ce adnotacje:<\/p>\n<ul data-start=\"382\" data-end=\"677\">\n<li class=\"\" data-start=\"382\" data-end=\"453\">\n<p class=\"\" data-start=\"384\" data-end=\"453\"><strong data-start=\"384\" data-end=\"413\">Request-Method Designator<\/strong>:<br data-start=\"414\" data-end=\"417\" \/><code data-start=\"419\" data-end=\"425\">@GET<\/code>, <code data-start=\"427\" data-end=\"433\">@PUT<\/code>, <code data-start=\"435\" data-end=\"442\">@POST<\/code>, <code data-start=\"444\" data-end=\"453\">@DELETE<\/code><\/p>\n<\/li>\n<li class=\"\" data-start=\"455\" data-end=\"677\">\n<p class=\"\" data-start=\"457\" data-end=\"677\"><strong data-start=\"457\" data-end=\"507\"><code data-start=\"459\" data-end=\"505\">@Path(\"Nazwa zasobu i opcjonalne parametry\")<\/code><\/strong><br data-start=\"507\" data-end=\"510\" \/>Adnotacja <em>@Path<\/em> okre\u015bla \u015bcie\u017ck\u0119 dost\u0119pu do zasobu i mo\u017ce zawiera\u0107 parametry dynamiczne zapisane jako symbole zast\u0119pcze w nawiasach klamrowych (np. <em>{Id}<\/em>).<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"679\" data-end=\"829\">Warto\u015bci przypisane do adnotacji <em>@Path <\/em>tworz\u0105 dodatkowe sk\u0142adniki URI \u017c\u0105dania, kt\u00f3re s\u0105 wzgl\u0119dne wzgl\u0119dem zasobu g\u0142\u00f3wnego (<em data-start=\"812\" data-end=\"827\">root resource<\/em>).<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Zgodnie z konwencj\u0105, nazwy symboli zast\u0119pczych, kt\u00f3re reprezentuj\u0105 parametry URI \u017c\u0105dania, musz\u0105 rozpoczyna\u0107 si\u0119 wielk\u0105 liter\u0105.<\/div><\/section>\n<p>Podczas programowania metod zasob\u00f3w nale\u017cy przestrzega\u0107 nast\u0119puj\u0105cych zasad w odniesieniu do operacji HTTP:<\/p>\n<ul>\n<li><strong>GET<\/strong> &#8211; s\u0142u\u017cy do pobierania reprezentacji zasobu<span style=\"font-size: revert; color: initial;\">. <\/span>Zgodnie z zasadami REST, \u017c\u0105dania typu GET nie powinny wywo\u0142ywa\u0107 \u017cadnych efekt\u00f3w ubocznych.<\/li>\n<li><strong style=\"font-size: revert; color: initial;\">POST<\/strong><span style=\"font-size: revert; color: initial;\"> &#8211; <\/span><span style=\"font-size: revert; color: initial;\">umo\u017cliwia dodanie danych do zasobu.<\/span><span style=\"font-size: revert; color: initial;\"> W przeciwie\u0144stwie do metody GET, <\/span><span style=\"font-size: revert; color: initial;\">POST nie jest wolna od efekt\u00f3w ubocznych.<\/span><\/li>\n<li><strong style=\"font-size: revert; color: initial;\">PUT<\/strong><span style=\"font-size: revert; color: initial;\"> &#8211; umo\u017cliwia tworzenie<\/span><span style=\"font-size: revert; color: initial;\"> nowych zasob\u00f3w lub zast\u0119powanie zawarto\u015bci ju\u017c istniej\u0105cych zasob\u00f3w.<\/span><\/li>\n<li><strong>DELETE <\/strong>&#8211; umo\u017cliwia usuni\u0119cie zasob\u00f3w.<\/li>\n<\/ul>\n<p>Nale\u017cy r\u00f3wnie\u017c zwr\u00f3ci\u0107 uwag\u0119 na poni\u017cszy opis JAX-RS:<\/p>\n<p>Java\u2122 API for RESTful Web Services http:\/\/jsr311.java.net\/nonav\/releases\/1.1\/spec\/spec.html<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Dalsze przydatne informacje na temat adnotacji, kt\u00f3re mo\u017cna wykorzysta\u0107 podczas implementacji us\u0142ugi REST, mo\u017cna znale\u017a\u0107 na stronie http:\/\/cxf.apache.org\/docs\/jax-rs-basics.html . Niekt\u00f3re z adnotacji zosta\u0142y wyja\u015bnione w przyk\u0142adzie w tej dokumentacji.<\/div><\/section>\n<p>W komentarzach do metod zasob\u00f3w mo\u017cna znale\u017a\u0107 informacje o tym, jak mo\u017cna wywo\u0142a\u0107 funkcjonalno\u015b\u0107 us\u0142ugi REST. Wszystkie funkcje oznaczone operacj\u0105 HTTP <em>GET <\/em>mo\u017cna wywo\u0142a\u0107 bezpo\u015brednio w przegl\u0105darce. Narz\u0119dzie Soap UI mo\u017ce by\u0107 u\u017cywane do innych operacji HTTP.<\/p>\n<h5 id=\"przyklad-uslugi-rest\" ><span class=\"ez-toc-section\" id=\"Przyklad_uslugi_REST\"><\/span>Przyk\u0142ad us\u0142ugi REST<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-pm-slice=\"1 1 []\">Udost\u0119pniono aplikacj\u0119 i klas\u0119 Java o tej samej nazwie:<\/p>\n<p><code>com.cisag.app.system.webservices.service.rest.RESTExampleService<\/code><\/p>\n<p>Metoda <em>init()<\/em> zawiera inicjalizacj\u0119 obiektu i mened\u017cera transakcji. Wewn\u0119trzna klasa <em>RESTExample<\/em> zawiera definicj\u0119 i implementacj\u0119 us\u0142ugi REST. Klasa charakteryzuje si\u0119 adnotacj\u0105:<\/p>\n<p><code>@Path(\"com.cisag.app.system.webservices.service.rest.RESTExampleService\")<\/code><\/p>\n<p>Udost\u0119pniana jest metoda zasobu, kt\u00f3ra konkatenacj\u0105 s\u0142owa powitania <em>Hello<\/em> z podan\u0105 nazw\u0105 parametru zwraca reprezentacj\u0119 jako zwyk\u0142y tekst:<\/p>\n<pre><code>@GET\n@Path(\"sayhello\/{nazwa}\")\npublic String sayHello(@PathParam(\"Name\") String name)<\/code><\/pre>\n<p>Adnotacja <em>@GET<\/em> wskazuje, \u017ce do \u017c\u0105dania wykorzystywana jest metoda HTTP GET. Adnotacja <em>@Path<\/em> zawiera warto\u015b\u0107 <em>sayhello\/{Name}<\/em>, gdzie <em>sayhello <\/em>to identyfikacja funkcjonalno\u015bci, a <em>{Name}<\/em> to wymagany symbol zast\u0119pczy. Symbol ten jest powi\u0105zany z parametrem metody zasobu <em>Name <\/em>przez adnotacj\u0119 <em>@PathParam(&#8222;Name&#8221;)<\/em>.<\/p>\n<p>Dost\u0119pna jest r\u00f3wnie\u017c metoda zasobu umo\u017cliwiaj\u0105ca sprawdzenie, czy istnieje zam\u00f3wienie sprzeda\u017cy o okre\u015blonym typie i numerze:<\/p>\n<pre><code>@GET\n@Path(\"salesOrderAvailable\/{Type}\/{Number}\")\npublic String existSalesOrder(@PathParam(\"Type\") String type, @PathParam(\"Number\") String number)<\/code><\/pre>\n<p>Kolejna metoda zasobu zwraca instancj\u0119 <em>SalesOrderBean <\/em>na podstawie zdefiniowanego typu i numeru. Instancja zawiera informacje o typie, numerze, statusie zlecenia sprzeda\u017cy oraz nazwisku odpowiedzialnego pracownika:<\/p>\n<pre><code>@GET\n@Path(\"getSalesOrder\/{Type}\/{Number}\")\n@Produces(MediaType.APPLICATION_XML)\npublic SalesOrderBean getSalesOrderByBusinessKey(@PathParam(\"Type\") String type, @PathParam(\"Number\") String number)<\/code><\/pre>\n<p>Adnotacja <em>@Produces<\/em> wskazuje, \u017ce reprezentacja zwracana jest w postaci XML. Klasa fasoli obs\u0142uguj\u0105cej JAXB oznaczona jest adnotacj\u0105:<\/p>\n<pre><code>@XmlRootElement(name = \"SalesOrderBean\")<\/code><\/pre>\n<p>Udost\u0119pniona jest tak\u017ce metoda zasobu tworz\u0105ca now\u0105 instancj\u0119 <em>SalesOrderBean <\/em>w pami\u0119ci roboczej na podstawie okre\u015blonego typu, numeru i statusu. Zwracana jest reprezentacja w postaci HTML:<\/p>\n<pre><code>@POST\n@Path(\"newSalesOrderBean\/{Type}\/{Number}\/{orderStatus}\")\n@Produces(MediaType.TEXT_HTML)\npublic SalesOrderBean newSalesOrder(@PathParam(\"Type\") String type, @PathParam(\"Number\") String number, @PathParam(\"OrderStatus\") short orderStatus)<\/code><\/pre>\n<p>Instancja nie jest zapisywana. W odr\u00f3\u017cnieniu od pozosta\u0142ych metod zasob\u00f3w, metoda ta wykorzystuje adnotacj\u0119 <em>@POST<\/em>.<\/p>\n<p class=\"\" data-start=\"0\" data-end=\"261\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Opr\u00f3cz adnotacji <em>@PathParam <\/em>dost\u0119pna jest r\u00f3wnie\u017c adnotacja <em>@QueryParam,<\/em> umo\u017cliwiaj\u0105ca dost\u0119p do parametr\u00f3w zapytania URI w \u017c\u0105daniu. Dzi\u0119ki niej mo\u017cliwe jest definiowanie w\u0142asnych parametr\u00f3w zapytania, kt\u00f3re klient mo\u017ce przesy\u0142a\u0107 jako cz\u0119\u015b\u0107 ci\u0105gu zapytania.<\/p>\n<p class=\"\" data-start=\"263\" data-end=\"510\">W przypadku definiowania nazw parametr\u00f3w zapytania, jako pierwszego znaku nale\u017cy u\u017cy\u0107 wielkiej litery. Parametry zapytania rozpoczynaj\u0105ce si\u0119 ma\u0142ymi literami s\u0105 zarezerwowane dla mechanizm\u00f3w systemowych i nie powinny by\u0107 u\u017cywane przez u\u017cytkownika.<\/div><\/section><\/p>\n<h4 id=\"pobieranie-pliku-wsdl-wadl\" ><span class=\"ez-toc-section\" id=\"Pobieranie_pliku_WSDLWADL\"><\/span>Pobieranie pliku WSDL\/WADL<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Plik WSDL lub WADL jest wymagany do opracowania klienta us\u0142ugi sieci Web. Struktura odpowiedniego identyfikatora URI \u017c\u0105dania jest nast\u0119puj\u0105ca:<\/p>\n<ul>\n<li>dla us\u0142ug SOAP:<\/li>\n<\/ul>\n<p>https:\/\/&lt;basis-uri&gt;\/services\/soap\/&lt;w pe\u0142ni kwalifikowana nazwa aplikacji&gt;?wsdl<\/p>\n<p>Sk\u0142adnik URI \u017c\u0105dania <em>wsdl<\/em> sygnalizuje serwerowi us\u0142ug internetowych, \u017ce plik WSDL musi zosta\u0107 przygotowany i udost\u0119pniony. Po wprowadzeniu identyfikatora URI \u017c\u0105dania w pasku adresu przegl\u0105darki pojawia si\u0119 okno dialogowe uwierzytelniania. Po pomy\u015blnym uwierzytelnieniu wy\u015bwietlony zostanie plik WSDL. Mo\u017cna go zapisa\u0107 za pomoc\u0105 akcji <em>Zapisz jako&#8230;<\/em> w przegl\u0105darce.<\/p>\n<ul>\n<li>dls us\u0142ug REST:<\/li>\n<\/ul>\n<p>https:\/\/&lt;base-url&gt;\/services\/soap\/&lt;w pe\u0142ni kwalifikowana nazwa aplikacji&gt;?_wadl<\/p>\n<p>Sk\u0142adnik URI \u017c\u0105dania <em>_wadl<\/em> sygnalizuje serwerowi us\u0142ug internetowych, \u017ce plik WADL musi zosta\u0107 przygotowany i udost\u0119pniony. Po okre\u015bleniu identyfikatora URI \u017c\u0105dania na pasku adresu przegl\u0105darki wy\u015bwietlane jest okno dialogowe uwierzytelniania. Po pomy\u015blnym uwierzytelnieniu pojawi si\u0119 okno dialogowe pobierania pliku. Plik WADL mo\u017cna zapisa\u0107. Nale\u017cy pami\u0119ta\u0107, \u017ce plik WADL mo\u017ce by\u0107 niekompletny, na przyk\u0142ad mo\u017ce brakowa\u0107 parametr\u00f3w. Zale\u017cy to od programowania danej us\u0142ugi REST.<\/p>\n<h4 id=\"uwierzytelnianie-i-autoryzacja\" ><span class=\"ez-toc-section\" id=\"Uwierzytelnianie_i_autoryzacja\"><\/span>Uwierzytelnianie i autoryzacja<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Aby m\u00f3c wywo\u0142a\u0107 us\u0142ug\u0119 internetow\u0105, klient musi uwierzytelni\u0107 si\u0119 na serwerze internetowym. Uwierzytelnianie odbywa si\u0119 za pomoc\u0105 uwierzytelniania has\u0142a lub certyfikatu klienta. W opisie przyk\u0142adowego klienta w rozdziale <em><a href=\"#soap\">Przyk\u0142adowy klient us\u0142ugi SOAP<\/a><\/em> uwierzytelnianie odbywa si\u0119 za pomoc\u0105 certyfikatu klienta.<\/p>\n<p>Programowalne us\u0142ugi sieciowe s\u0105 aplikacjami. Dlatego u\u017cytkownik musi mie\u0107 uprawnienia do otwarcia aplikacji, aby m\u00f3c wywo\u0142a\u0107 us\u0142ug\u0119 sieciow\u0105.<\/p>\n<h4 id=\"wsparcie-dla-rozwiazywania-problemow\" ><span class=\"ez-toc-section\" id=\"Wsparcie_dla_rozwiazywania_problemow\"><\/span>Wsparcie dla rozwi\u0105zywania problem\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p class=\"\" data-start=\"101\" data-end=\"280\">Serwer systemu us\u0142ug internetowych umo\u017cliwia wy\u015bwietlanie informacji o \u017c\u0105daniach pochodz\u0105cych od klient\u00f3w. Dotyczy to zar\u00f3wno us\u0142ug sieciowych nieprogramowalnych, jak i programowalnych.<\/p>\n<p class=\"\" data-start=\"282\" data-end=\"560\">W tym celu nale\u017cy aktywowa\u0107 debugowanie klasy Java <em>com.cisag.sys.kernel.webservices.CisWebServicesResource<\/em> na serwerze SAS, do kt\u00f3rego kierowane s\u0105 \u017c\u0105dania klient\u00f3w. W zale\u017cno\u015bci od poziomu debugowania, w Toolshell pojawiaj\u0105 si\u0119 nast\u0119puj\u0105ce komunikaty:<\/p>\n<div class=\"pointer-events-none relative left-[50%] flex w-[100cqw] translate-x-[-50%] justify-center *:pointer-events-auto\">\n<div class=\"tableContainer horzScrollShadows\">\n<table class=\"min-w-full\" data-start=\"562\" data-end=\"1006\">\n<thead data-start=\"562\" data-end=\"597\">\n<tr data-start=\"562\" data-end=\"597\">\n<th data-start=\"562\" data-end=\"583\">Poziom debugowania<\/th>\n<th data-start=\"583\" data-end=\"597\">Komunikaty<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"634\" data-end=\"1006\">\n<tr data-start=\"634\" data-end=\"838\">\n<td class=\"\" data-start=\"634\" data-end=\"641\">INFO<\/td>\n<td class=\"min-w-[calc(var(--thread-content-max-width)\/2)]\" data-start=\"641\" data-end=\"838\">Dla ka\u017cdego wywo\u0142ania us\u0142ugi sieciowej generowany jest komunikat na pocz\u0105tku i na ko\u0144cu przetwarzania na serwerze SAS. Wy\u015bwietlane s\u0105: numer sesji, metoda HTTP, URI \u017c\u0105dania, czas przetwarzania.<\/td>\n<\/tr>\n<tr data-start=\"839\" data-end=\"1006\">\n<td class=\"\" data-start=\"839\" data-end=\"848\">FINEST<\/td>\n<td class=\"min-w-[calc(var(--thread-content-max-width)\/2)]\" data-start=\"848\" data-end=\"1006\">Opr\u00f3cz komunikat\u00f3w z poziomu <em>INFO<\/em>, na poziomie <em>FINEST<\/em> wy\u015bwietlana jest r\u00f3wnie\u017c zawarto\u015b\u0107 \u017c\u0105dania klienta (HTTP Body) oraz odpowiedzi us\u0142ugi sieciowej.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p class=\"\" data-start=\"1008\" data-end=\"1158\">Wy\u015bwietlanie komunikat\u00f3w mo\u017ce by\u0107 w\u0142\u0105czane i wy\u0142\u0105czane dla dzia\u0142aj\u0105cego SAS-a za pomoc\u0105 polecenia pow\u0142oki narz\u0119dziowej debugowanie klasy (<em><a href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/debugowanie-klas-dbgcls\/\">dbgcls<\/a><\/em>).<\/p>\n<h4 id=\"przyklady-klientow-uslug-sieciowych\" ><span class=\"ez-toc-section\" id=\"Przyklady_klientow_uslug_sieciowych\"><\/span>Przyk\u0142ady klient\u00f3w us\u0142ug sieciowych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 id=\"przykladowy-klient-uslugi-soap\" ><span class=\"ez-toc-section\" id=\"Przykladowy_klient_uslugi_SOAP\"><\/span><a id=\"soap\"><\/a>Przyk\u0142adowy klient us\u0142ugi SOAP<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Udost\u0119pniony zosta\u0142 nast\u0119puj\u0105cy przyk\u0142ad klienta us\u0142ugi SOAP. Klient ten sprawdza, czy zam\u00f3wienie sprzeda\u017cy istnieje. Poni\u017csza klasa zawiera rzeczywist\u0105 implementacj\u0119 klienta:<\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.SOAPExampleClient<\/code><\/p>\n<p>Nast\u0119puj\u0105ce klasy s\u0105 r\u00f3wnie\u017c wymagane do programowania klienta:<\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.ExistSalesOrder<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.ExistSalesOrderResponse<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.GetSalesOrderByBusinessKey<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.GetSalesOrderByBusinessKeyResponse<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.ObjectFactory<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.SalesOrderResult<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.SayHello<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.SayHelloResponse<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.SOAPExample<\/code><\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.SOAPExampleService<\/code><\/p>\n<p>Klasy te s\u0105 generowane z pliku WSDL przez narz\u0119dzie <em>wsimport<\/em>. Narz\u0119dzie <em>wsimport<\/em> jest cz\u0119\u015bci\u0105 JDK.<\/p>\n<p>Plik WSDL jest generowany przez nast\u0119puj\u0105c\u0105 specyfikacj\u0119:<\/p>\n<p>https:\/\/&lt;basis-uri&gt;\/services\/soap\/com.cisag.app.system.webservices.service.soap.SOAPExampleService?wsdl<\/p>\n<p>Rzeczywisty adres jest okre\u015blany zamiast symbolu zast\u0119pczego &lt;base-uri&gt;.<\/p>\n<p>Narz\u0119dzie <em>wsimport<\/em> jest nast\u0119pnie wywo\u0142ywane w nast\u0119puj\u0105cy spos\u00f3b poni\u017cej &lt;katalogu JDK&gt;\/bin:<\/p>\n<p>wsimport -p com.cisag.app.system.webservices.service.soap.client -d &lt;\u015bcie\u017cka dla plik\u00f3w .class&gt; -s &lt;\u015bcie\u017cka dla plik\u00f3w \u017ar\u00f3d\u0142owych&gt; &lt;\u015bcie\u017cka z nazw\u0105 pliku WSDL&gt; -Xnocompile -extension<\/p>\n<p>Zamiast symboli zast\u0119pczych &#8222;\u015bcie\u017cka&#8221; okre\u015blane s\u0105 rzeczywiste \u015bcie\u017cki.<\/p>\n<p>Poni\u017csza klasa zawiera \u015bcie\u017ck\u0119 do pliku WSDL po wygenerowaniu:<\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.SOAPExampleService<\/code><\/p>\n<p>\u015acie\u017cka ta jest zast\u0119powana nast\u0119puj\u0105cym identyfikatorem URI<\/p>\n<p>&lt;basis-uri&gt;\/services\/soap\/com.cisag.app.system.webservices.service.soap.SOAPExampleService?wsdl&amp;oltp=&lt;oltpname&gt;<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Nale\u017cy zast\u0105pi\u0107 symbole zast\u0119pcze &lt;base-uri&gt; i &lt;oltpname&gt; konkretnymi warto\u015bciami bazowego identyfikatora URI i nazwy bazy danych OLTP.<\/div><\/section>\n<p>Poni\u017csza klasa zawiera g\u0142\u00f3wn\u0105 metod\u0119, w kt\u00f3rej odbywa si\u0119 sprawdzanie parametr\u00f3w:<\/p>\n<p><code>com.cisag.app.system.webservices.service.soap.client.SOAPExampleClient<\/code><\/p>\n<p>W tej metodzie wykonywane s\u0105 nast\u0119puj\u0105ce czynno\u015bci:<\/p>\n<ul>\n<li>tworzona jest instancja SOAPExampleService<\/li>\n<li>tworzony jest obiekt us\u0142ugi<\/li>\n<li>przeprowadzane jest uwierzytelnianie<\/li>\n<li>wywo\u0142ywana jest metoda us\u0142ugi SOAP existSalesOrder(salesOrderType, salesNumber).<\/li>\n<\/ul>\n<p>Klient musi zosta\u0107 wywo\u0142any poza systemem w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p>com.cisag.app.system.webservices.service.soap.client.SOAPExampleClient SOAPServiceAddress userCertificateFileName userCertificate-FilePassword serverCertificateFileName salesOrderType salesNumber<\/p>\n<p>Zamiast SOAPServiceAddress wprowad\u017a pe\u0142ny adres us\u0142ugi SOAP, w tym nazw\u0119 bazy danych OLTP, np. https:\/\/qas.kauftreu.com\/services\/soap\/com.kauftreu.app.system.webservices.service.soap.SOAPExampleService?oltp=QAS61000.<\/p>\n<p>Zamiast salesOrderType i salesNumber nale\u017cy wpisa\u0107 typ zam\u00f3wienia sprzeda\u017cy i jego numer.<\/p>\n<p>Zamiast userCertificateFileName i serverCertificateFileName wprowad\u017a pe\u0142n\u0105 \u015bcie\u017ck\u0119 i nazw\u0119 pliku JKS.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Przyk\u0142adowy klient SOAP nie mo\u017ce by\u0107 uruchamiany w systemie. Odpowiednie klasy musz\u0105 zosta\u0107 skopiowane i skompilowane (np. w oddzielnym projekcie Eclipse). Ponadto biblioteka CXF nie mo\u017ce znajdowa\u0107 si\u0119 w \u015bcie\u017cce klas. W przypadku pr\u00f3by uruchomienia klienta w systemie zostanie zg\u0142oszony nast\u0119puj\u0105cy wyj\u0105tek:<\/p>\n<p>Exception in thread &#8222;main&#8221; com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLException: Unrecognised SSL mes-sage, plaintext connection? at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:121) at com.sun. xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:142)at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83)at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105)<\/p>\n<p><\/div><\/section>\n<p>Przyk\u0142adowy klient SOAP jest zaprogramowany tak, aby wszystkie \u017c\u0105dania by\u0142y przypisywane do tych samych sesji.<\/p>\n<h5 id=\"przykladowy-klient-uslugi-rest\" ><span class=\"ez-toc-section\" id=\"Przykladowy_klient_uslugi_REST\"><\/span>Przyk\u0142adowy klient us\u0142ugi REST<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Dla poszczeg\u00f3lnych \u017c\u0105da\u0144 mo\u017cna u\u017cy\u0107 narz\u0119dzia <em>SOAP UI<\/em>, kt\u00f3re zosta\u0142o opisane w rozdziale <em>Narz\u0119dzie SOAP UI do testowania us\u0142ug sieciowych<\/em>.<\/p>\n<h3 id=\"narzedzie-soap-ui-do-testowania-uslug-sieciowych\" ><span class=\"ez-toc-section\" id=\"Narzedzie_SOAP_UI_do_testowania_uslug_sieciowych\"><\/span>Narz\u0119dzie <em>SOAP UI<\/em> do testowania us\u0142ug sieciowych<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Narz\u0119dzie <em>SOAP UI<\/em> umo\u017cliwia testowanie zar\u00f3wno us\u0142ug SOAP, jak i REST.<\/p>\n<h4 id=\"ustawienia-soap-ui\" ><span class=\"ez-toc-section\" id=\"Ustawienia_Soap_Ui\"><\/span>Ustawienia Soap Ui<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p class=\"\" data-start=\"140\" data-end=\"409\">Przed przyst\u0105pieniem do testowania us\u0142ugi sieciowej konieczne jest posiadanie pliku WSDL (dla us\u0142ug SOAP) lub WADL (dla us\u0142ug REST). Wymagany jest r\u00f3wnie\u017c plik JKS zawieraj\u0105cy certyfikat u\u017cytkownika, kt\u00f3ry s\u0142u\u017cy do uwierzytelniania, oraz odpowiadaj\u0105ce mu has\u0142o dost\u0119pu.<\/p>\n<p class=\"\" data-start=\"411\" data-end=\"642\">Certyfikat u\u017cytkownika musi by\u0107 przypisany do konta u\u017cytkownika, kt\u00f3re wykonuje testy danej us\u0142ugi sieciowej. \u015acie\u017ck\u0119 do pliku JKS oraz has\u0142o nale\u017cy skonfigurowa\u0107 w sekcji <em>SSL Settings<\/em> w oknie dialogowym <em>SoapUI Preferences.<\/em><\/p>\n<h4 id=\"zalecenie\" ><span class=\"ez-toc-section\" id=\"Zalecenie\"><\/span>Zalecenie:<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Zaleca si\u0119 ustawienie warto\u015bci 120000 dla opcji<em><strong data-start=\"134\" data-end=\"152\"> Socket Timeout <\/strong><\/em>w sekcji <em>HTTP Settings. <\/em><\/p>\n<p class=\"\" data-start=\"288\" data-end=\"356\">Okno dialogowe <em>SoapUI Preferences <\/em>mo\u017cna otworzy\u0107 na dwa sposoby:<\/p>\n<ul data-start=\"358\" data-end=\"482\">\n<li class=\"\" data-start=\"358\" data-end=\"413\">\n<p class=\"\" data-start=\"360\" data-end=\"413\">za pomoc\u0105 skr\u00f3tu klawiaturowego <em>CTRL + ALT + P<\/em><\/p>\n<\/li>\n<li class=\"\" data-start=\"414\" data-end=\"482\">\n<p class=\"\" data-start=\"416\" data-end=\"482\">wybieraj\u0105c z menu g\u00f3rnego opcj\u0119<em> File \u2192 SoapUI Preferences<\/em><\/p>\n<\/li>\n<\/ul>\n<h4 id=\"nowy-projekt-soap-ui\" ><span class=\"ez-toc-section\" id=\"Nowy_projekt_SOAP_UI\"><\/span>Nowy projekt SOAP UI<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p class=\"\" data-start=\"90\" data-end=\"600\">Po wprowadzeniu ustawie\u0144 SoapUI nale\u017cy utworzy\u0107 nowy projekt SoapUI, naciskaj\u0105c kombinacj\u0119 klawiszy <em>CTRL + N <\/em>lub wybieraj\u0105c pozycj\u0119 <em>New SoapUI Project<\/em> z menu <em>File<\/em>. Pojawi si\u0119 okno dialogowe, w kt\u00f3rym nale\u017cy wprowadzi\u0107 nazw\u0119 projektu oraz \u015bcie\u017ck\u0119 do pliku <em>WSDL<\/em> lub <em>WADL<\/em>. Po naci\u015bni\u0119ciu przycisku [<strong data-start=\"405\" data-end=\"411\">OK<\/strong>] tworzony jest projekt o strukturze hierarchicznej. Poszczeg\u00f3lne w\u0119z\u0142y reprezentuj\u0105 ca\u0142\u0105 us\u0142ug\u0119 sieciow\u0105 lub jej poszczeg\u00f3lne funkcjonalno\u015bci, b\u0105d\u017a operacje HTTP (dotyczy tylko us\u0142ug REST).<\/p>\n<p class=\"\" data-start=\"602\" data-end=\"758\">Nale\u017cy pami\u0119ta\u0107, \u017ce nazwy og\u00f3lnych parametr\u00f3w zapyta\u0144 (np. <em>oltp<\/em> lub <em>context<\/em>) nie s\u0105 cz\u0119\u015bci\u0105 pliku WSDL ani WADL. Parametry te nale\u017cy wprowadzi\u0107 r\u0119cznie:<\/p>\n<ul data-start=\"760\" data-end=\"1303\">\n<li class=\"\" data-start=\"760\" data-end=\"1053\">\n<p class=\"\" data-start=\"762\" data-end=\"1053\">W przypadku us\u0142ugi SOAP nale\u017cy rozwin\u0105\u0107 w\u0119z\u0142y odpowiadaj\u0105ce funkcjonalno\u015bciom przeznaczonym do testowania, a\u017c b\u0119dzie mo\u017cliwe przej\u015bcie do w\u0119z\u0142a <em>Request&lt;number&gt;<\/em>. Nast\u0119pnie nale\u017cy zaznaczy\u0107 pasek adresu w oknie dialogowym, wybra\u0107 opcj\u0119 <em>[edit current&#8230;] <\/em>i doda\u0107 \u017c\u0105dany parametr do URI.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1055\" data-end=\"1303\">\n<p class=\"\" data-start=\"1057\" data-end=\"1303\">W przypadku us\u0142ugi REST nale\u017cy rozwin\u0105\u0107 w\u0119ze\u0142 zawieraj\u0105cy nazw\u0119 us\u0142ugi internetowej (powinna to by\u0107 nazwa aplikacji wprowadzona w systemie), a nast\u0119pnie klikn\u0105\u0107 go dwukrotnie. Pojawi si\u0119 okno dialogowe, w kt\u00f3rym mo\u017cna doda\u0107 dodatkowe parametry.<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"1305\" data-end=\"1632\">Aby uzyska\u0107 dost\u0119p do us\u0142ugi internetowej, nale\u017cy rozwin\u0105\u0107 w\u0119z\u0142y odpowiadaj\u0105ce funkcjom przeznaczonym do testowania, a\u017c mo\u017cliwe b\u0119dzie przej\u015bcie do w\u0119z\u0142a <em>Request&lt;number&gt;<\/em>. Klikni\u0119cie tego w\u0119z\u0142a spowoduje wy\u015bwietlenie okna dialogowego, w kt\u00f3rym mo\u017cna wysy\u0142a\u0107 \u017c\u0105dania do us\u0142ugi sieciowej oraz przegl\u0105da\u0107 odpowiedzi tej us\u0142ugi.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">SAS, kt\u00f3rego URI zosta\u0142 u\u017cyty podczas odpytywania pliku WSDL lub WADL, musi by\u0107 uruchomiony. Je\u015bli istnieje pewno\u015b\u0107, \u017ce ta sama us\u0142uga sieciowa dzia\u0142a na innym serwerze aplikacji, mo\u017cliwa jest edycja identyfikatora URI w oknie dialogowym <em>\u017b\u0105danie<\/em>, poprzez zaznaczenie paska adresu i wybranie opcji <em>[edytuj bie\u017c\u0105cy&#8230;]<\/em>.<\/p>\n<p class=\"\" data-start=\"424\" data-end=\"632\">W niekt\u00f3rych przypadkach plik WADL mo\u017ce by\u0107 niekompletny \u2014 na przyk\u0142ad mog\u0105 by\u0107 pomini\u0119te parametry wymagane do wykonania zapytania. W takiej sytuacji konieczne jest r\u0119czne dodanie brakuj\u0105cych parametr\u00f3w.<\/p>\n<p class=\"\" data-start=\"634\" data-end=\"812\">Za pomoc\u0105 narz\u0119dzia SoapUI mo\u017cna wy\u015bwietla\u0107 r\u00f3\u017cne pliki dziennika. Przyk\u0142adowo, zak\u0142adki <em>SoapUI log<\/em> oraz <em>error log<\/em> s\u0105 dost\u0119pne w dolnej cz\u0119\u015bci g\u0142\u00f3wnego okna programu.<\/div><\/section>\n","protected":false},"author":27,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-10906","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-zewnetrzne-interfejsy"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/10906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/comments?post=10906"}],"version-history":[{"count":6,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/10906\/revisions"}],"predecessor-version":[{"id":28155,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/10906\/revisions\/28155"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/media?parent=10906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}