Przykład użycia[edit] ¶
System musi stworzyć listę pracowników wydziału Inżynierii Lądowej i Środowiska, które po zaznaczeniu pokaże szczegółowe informacje o pracownikach bez zwłoki (tj. bez dodatkowego zapytania po każdym kliknięciu). Zakładamy, że system musi w takim razie mieć listę wszystkich interesujących go pracowników, wraz z obiektami powiązanymi.
Przygotoweanie zapytania[edit] ¶
W tym celu wykorzystamy metodę searchAndGet, która zwróci nam wszystkich pracowników, posortowanych według nazwiska, potem imienia, wraz z dodatkowymi polami. Poniższy, przykładowy kod wykonujący zapytanie (dla języka PHP) zawiera obiekty zapytania w formacie JSON, które są następnie konwertowane do obiektów PHP, po czym są przesyłane jako zapytanie RPC w formacie XML.
Model pracownik[edit] ¶
Domyślny obiekt mógłby się składać tylko i wyłącznie z nazwy atrybutu "person" i pustego ciągu znaków. Zależy nam jednak, aby obiekt pracownika zwrócony został wraz z wszystkimi obiektami powiązanymi poprzez zależność reference. Dla każdej takiej zależności ustawiamy więc dodatkowe atrybuty o wartości true, aby obiekty powiązane również zostały zwrócone. Obiekty powiązane zostaną zwrócone w formie domyślnej (czyli bez powiązanych dodatkowych obiektów).
$json_model = ' { "person": { "publications": "true", "research": "true", "companies": true", "unit": "true", "employee.affiliation.faculty": "true", "employee.affiliation.department": "true", "employee.affiliation.unit": "true", "employee.courses": "true", } }' ; |
Obiekt fields[edit] ¶
Obiekt ten odwołuje się do obiektu pomocniczego unit i wyszukuje po nazwie w tym obiekcie. Możemy w ten sposób tworzyć zaawansowane filtry wyszukujące np. wszystkich publikacji, których autorzy mają na imię Robert.
$json_fields = ' { "fileds": { "global_operator": "AND", "field": [ { "field_name": "employee.affiliation.unit.name", "operator": "equal", "arguments": "Wydział Inżynierii Lądowej i Środowiska" } ] } }' ; |
Obiekt sort_order[edit] ¶
Obiekt sort order ustala w jakiej kolejności zwrócone będą rekordy. Jeśli jest pusty rekordy mogą być zwrócone w dowolnej kolejności i nie ma gwarancji, że dwa kolejne zapytania mają zwrócić dowolne obiekty w tej samej kolejności. W tym konkretnym przypadku istnieją dwa kryteria sortowania: według nazwiska i imienia, przy czym sortowanie według nazwiska jest ważniejsze (niższa wartość atrybutu 'cardinality') wobec czego pracownicy będą posortowani według nazwiska, a tam, gdzie nazwisko jest identyczne według imienia. Taka sama zasada obowiązuje dla dowolnie dużej liczby warunków sortowania.
$json_sort_order = ' { "sort_order": [ { "field_name": "last_name", "direction": "asc", "cardinality": "0" }, { "field_name": "name", "direction": "asc", "cardinality": "1" } ] }' ; |
Obiekt return_params[edit] ¶
Pozwala nam zwrócić żądaną liczbę obiektów. W tym wypadku chcemy, aby zwrócone były obiekty od pierwszego (start: 0) i aby maksymalnie było ich 500. Jeśli obiektów w bazie będzie mniej, zostanie zwróconych tyle ile jest w bazie, natomiast nigdy nie przekroczy ta wartość 500. Należy przyjąć, że system będzie miał odgórnie narzuconą liczbę maksymalną dla atrybutu count tak, aby wydajność systemu nie została zachwiana przez dużą liczbę zapytań.
$json_return_params = ' { "return_params": { "start": 0, "count": 500 } }' ; |
Wysyłanie rządania[edit] ¶
Tworzenie żądania w protokole JSON-RPC[edit] ¶
Wyrzystująć przygotowaną przez zespół euczelni bibliotekę napisaną w języku PHP:
<?php class JsonRpcFault extends Exception {} class JsonRPCClient { private $uri ; private $ca_cert ; private $usr_cert ; /** * Zwraca losowy id zapytania. */ private function generateId() { $chars = array_merge (range( 'a' , 'z' ), range(0, 9)); $id = '' ; for ( $c = 0; $c < 5; ++ $c ) $id .= $chars [mt_rand(0, count ( $chars ) - 1)]; return $id ; } /** * Ustawienie uri do połączenia * @param string $uri */ public function set_uri( $uri ) { $this ->uri = $uri ; } /** * Ustawia ścieżkę do certyfikatu CA * @param string $path */ public function set_ca_cert( $path ) { $this ->ca_cert = $path ; } /** * Ustawia ścieżkę do certyfikatu hosta * @param string $path */ public function set_usr_cert( $path ) { $this ->usr_cert = $path ; } /** * otwiera połączenie, wysyła zapytanie i zwraca odpowiedź * @param string $name * @param array $arguments * @throws JsonRpcFault */ public function use_method( $name , $arguments ) { $id = $this ->generateId(); $request = array ( 'jsonrpc' => '2.0' , 'method' => $name , 'params' => $arguments , 'id' => $id ); $jsonRequest = json_encode( $request ); $curl = curl_init( $this ->uri); curl_setopt( $curl , CURLOPT_RETURNTRANSFER, 1); curl_setopt( $curl , CURLOPT_POST, 1); curl_setopt( $curl , CURLOPT_HTTPHEADER, array ( 'Content-type' => 'application/json; charset=UTF-8' )); curl_setopt( $curl , CURLOPT_POSTFIELDS, $jsonRequest ); curl_setopt( $curl , CURLOPT_HEADER, 0); curl_setopt( $curl , CURLOPT_SSLCERT, $this ->usr_cert); curl_setopt( $curl , CURLOPT_CAINFO, $this ->ca_cert); curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt( $curl , CURLOPT_VERBOSE, FALSE); $jsonResponse = curl_exec( $curl ); if ( $jsonResponse === false) throw new JsonRpcFault( 'curl_exec failed' , -32603); $response = json_decode( $jsonResponse ); if ( $response === null) throw new JsonRpcFault( 'JSON cannot be decoded' , -32603); if ( $response ->id != $id ) throw new JsonRpcFault( 'Mismatched JSON-RPC IDs' , -32603); if (property_exists( $response , 'error' )) throw new JsonRpcFault( $response ->error->message, $response ->error->code); else if (property_exists( $response , 'result' )) return $response ->result; else throw new JsonRpcFault( 'Invalid JSON-RPC response' , -32603); } } ?> |
Wywołujemy metodę searchAndGet przy pomocy instrukcji:
<?php include ( 'lib/JsonRPCClient.php' ); $con = new JsonRPCClient(); $con ->set_usr_cert( '<path>' ); $con ->set_ca_cert( '<path>' ); print_r( $con ->use_method( 'searchAndGet' , array ( $USER_ID , $API_KEY , $model , $fields , $sort_order , $return_params ))); ?> |
Na podstawie tych danych metoda use_method tworzy zapytanie następującej postaci:
$request = array ( 'jsonrpc' => '2.0' , 'method' => $name , 'params' => $arguments , 'id' => $id ); |
Tworzenie żądania w protokole XML-RPC[edit] ¶
Konwersja obiektów JSON do struktur PHP oraz tworzenie żądania[edit] ¶
$model = json_decode( $json_model , JSON_UNESCAPED_UNICODE); $fields = json_decode( $json_fields , JSON_UNESCAPED_UNICODE); $sort_order = json_decode( $json_sort_order , JSON_UNESCAPED_UNICODE); $return_params = json_decode( $json_return_params , JSON_UNESCAPED_UNICODE); /* Create an XML-RPC request containing the function name and params */ $request = xmlrpc_encode_request( "searchAndGet" , array ( 123456, 'API_KEY_XYZ' , $model , $fields , $sort_order , $return_params )); |
Format zapytania po konwersji do XML[edit] ¶
Tak sformatowane zapytanie w postaci XML ma następującą postać:
<? xml version = "1.0" encoding = "iso-8859-1" ?> < methodCall > < methodName >searchAndGet</ methodName > < params > < param > < value > < int >123456</ int > </ value > </ param > < param > < value > < string >API_KEY_XYZ</ string > </ value > </ param > < param > < value > < string /> </ value > </ param > < param > < value > < struct > < member > < name >fileds</ name > < value > < struct > < member > < name >global_operator</ name > < value > < string >AND</ string > </ value > </ member > < member > < name >field</ name > < value > < array > < data > < value > < struct > < member > < name >field_name</ name > < value > < string >employee.affiliation.unit.name</ string > </ value > </ member > < member > < name >operator</ name > < value > < string >equal</ string > </ value > </ member > < member > < name >arguments</ name > < value > < string >Wydział Inżynierii Lądowej i Środowiska</ string > </ value > </ member > </ struct > </ value > </ data > </ array > </ value > </ member > </ struct > </ value > </ member > </ struct > </ value > </ param > < param > < value > < struct > < member > < name >sort_order</ name > < value > < array > < data > < value > < struct > < member > < name >field_name</ name > < value > < string >last_name</ string > </ value > </ member > < member > < name >direction</ name > < value > < string >asc</ string > </ value > </ member > < member > < name >cardinality</ name > < value > < string >0</ string > </ value > </ member > </ struct > </ value > < value > < struct > < member > < name >field_name</ name > < value > < string >name</ string > </ value > </ member > < member > < name >direction</ name > < value > < string >asc</ string > </ value > </ member > < member > < name >cardinality</ name > < value > < string >1</ string > </ value > </ member > </ struct > </ value > </ data > </ array > </ value > </ member > </ struct > </ value > </ param > < param > < value > < struct > < member > < name >return_params</ name > < value > < struct > < member > < name >start</ name > < value > < int >0</ int > </ value > </ member > < member > < name >count</ name > < value > < int >500</ int > </ value > </ member > </ struct > </ value > </ member > </ struct > </ value > </ param > </ params > </ methodCall > |
Przesyłanie zapytania do serwera[edit] ¶
Następnie należy tak stworzone zapytanie opakować w nagłówki oraz przesłać do serwera docelowego, oraz odebrać odpowiedź (w formacie XML):
$context = stream_context_create( array ( 'http' => array ( 'method' => "POST" , 'header' => "Content-Type: text/xml\r\nUser-Agent: PHPRPC/1.0\r\n" , 'content' => $request ))); |
Odpowiedź z serwera[edit] ¶
W formacie XML[edit] ¶
Zwrócona przykładowa odpowiedź zawiera informację o jednym pracowniku: profesorze Januszu Kowalskim, zarządzającym wydziałem Chemii. Odpowiedź zwrócona z serwera w formacie XML będzie miała następującą postać:
<? xml version = "1.0" encoding = "utf-8" ?> < params > < param > < value > < struct > < member > < name >error_code</ name > < value > < int >0</ int > </ value > </ member > < member > < name >error_desc</ name > < value > < string >success</ string > </ value > </ member > < member > < name >debug_info</ name > < value > < string /> </ value > </ member > < member > < name >answer</ name > < value > < struct > < member > < name >id</ name > < value > < int >1234</ int > </ value > </ member > < member > < name >first_name</ name > < value > < string >Janusz</ string > </ value > </ member > < member > < name >mid_name</ name > < value > < string >Aleksander</ string > </ value > </ member > < member > < name >last_name</ name > < value > < string >Kowalski</ string > </ value > </ member > < member > < name >title</ name > < value > < string >dr hab.</ string > </ value > </ member > < member > < name >sex</ name > < value > < string >male</ string > </ value > </ member > < member > < name >birth_date</ name > < value > < string >01-01-1960</ string > </ value > </ member > < member > < name >pesel</ name > < value > < string >12345678901</ string > </ value > </ member > < member > < name >telephone</ name > < value > < string >345-67-89</ string > </ value > </ member > < member > < name >email</ name > < value > < string >jan.kowalski@pg.gda.pl</ string > </ value > </ member > < member > < name >photo</ name > < value > < string >/pracownicy/1234/photo</ string > </ value > </ member > < member > < name >url</ name > < value > < string /> </ value > </ member > < member > < name >publications</ name > < value > < array > < data > < value > < struct > < member > < name >id</ name > < value > < int >8745</ int > </ value > </ member > < member > < name >title</ name > < value > < string >Raport o analizie gazów szlachetnych</ string > </ value > </ member > < member > < name >short</ name > < value > < string >Analiza gazów szlachetnych</ string > </ value > </ member > < member > < name >keywords</ name > < value > < string >Gazy, Gazy szlachetne, Analiza</ string > </ value > </ member > < member > < name >url</ name > < value > </ value > </ member > < member > < name >publication_date</ name > < value > < string >2007-02-13</ string > </ value > </ member > < member > < name >language</ name > < value > < string >pl</ string > </ value > </ member > < member > < name >country</ name > < value > < string >pl</ string > </ value > </ member > < member > < name >pages</ name > < value > < string >95</ string > </ value > </ member > < member > < name >author</ name > < value > < array > < data > < value > < int >1234</ int > </ value > < value > < int >1255</ int > </ value > </ data > </ array > </ value > </ member > < member > < name >other_authors</ name > < value > < string /> </ value > </ member > < member > < name >affiliation</ name > < value > < struct > < member > < name >faculty</ name > < value > < array > < data > < value > < int >55</ int > </ value > </ data > </ array > </ value > </ member > < member > < name >department</ name > < value > < array > < data > < value > < int >150</ int > </ value > </ data > </ array > </ value > </ member > < member > < name >unit</ name > < value > < array > < data /> </ array > </ value > </ member > < member > < name >other_unit</ name > < value > < string /> </ value > </ member > </ struct > </ value > </ member > </ struct > </ value > </ data > </ array > </ value > </ member > < member > < name >research</ name > < value > < array > < data > < value > < struct > < member > < name >id</ name > < value > < int >1054</ int > </ value > </ member > < member > < name >title</ name > < value > < string >Badanie wpływu czynników atmosferycznych na korozję konstrukcji metalowych</ string > </ value > </ member > < member > < name >type</ name > < value > < string /> </ value > </ member > < member > < name >start_date</ name > < value > < string >2008-05-12</ string > </ value > </ member > < member > < name >keywords</ name > < value > < string >Korozja, Konstrukcje metalowe, Metal, Czynniki atmosferyczne, Deszcz</ string > </ value > </ member > < member > < name >director</ name > < value > < int >1234</ int > </ value > </ member > < member > < name >affiliation</ name > < value > < struct > < member > < name >faculty</ name > < value > < array > < data > < value > < int >50</ int > </ value > </ data > </ array > </ value > </ member > < member > < name >department</ name > < value > < array > < data > < value > < int >150</ int > </ value > < value > < int >151</ int > </ value > </ data > </ array > </ value > </ member > < member > < name >unit</ name > < value > < array > < data > < value > < int >323</ int > </ value > </ data > </ array > </ value > </ member > < member > < name >other_unit</ name > < value > < string >Nobiles S.A.</ string > </ value > </ member > </ struct > </ value > </ member > </ struct > </ value > </ data > </ array > </ value > </ member > < member > < name >companies</ name > < value > < array > < data /> </ array > </ value > </ member > < member > < name >employee</ name > < value > < array > < data > < value > < struct > < member > < name >employee_number</ name > < value > < string >123456789</ string > </ value > </ member > < member > < name >position</ name > < value > < string >Kierownik wydziału chemicznego</ string > </ value > </ member > < member > < name >description</ name > < value > < string >Wykłada chemię organiczną, kieruje wydziałem chemicznym</ string > </ value > </ member > < member > < name >function</ name > < value > < string /> </ value > </ member > < member > < name >room</ name > < value > < string >GG 423</ string > </ value > </ member > < member > < name >telephone</ name > < value > < string >+48 123 456 789</ string > </ value > </ member > < member > < name >email</ name > < value > < string >jan.kowalski@pg.gda.pl</ string > </ value > </ member > < member > < name >schedule</ name > < value > </ value > </ member > < member > < name >courses</ name > < value > < array > < data /> </ array > </ value > </ member > < member > < name >affiliation</ name > < value > < struct > < member > < name >faculty</ name > < value > < array > < data /> </ array > </ value > </ member > < member > < name >department</ name > < value > < array > < data /> </ array > </ value > </ member > < member > < name >unit</ name > < value > < array > < data > < value > < struct > < member > < name >id</ name > < value > < int >55</ int > </ value > </ member > < member > < name >name</ name > < value > < string >Wydział Chemiczny</ string > </ value > </ member > < member > < name >type</ name > < value > < string >faculty</ string > </ value > </ member > < member > < name >parent</ name > < value > < int >0</ int > </ value > </ member > < member > < name >children</ name > < value > < array > < data > < value > < int >150</ int > </ value > < value > < int >151</ int > </ value > < value > < int >152</ int > </ value > < value > < int >153</ int > </ value > </ data > </ array > </ value > </ member > < member > < name >manager</ name > < value > < int >1234</ int > </ value > </ member > < member > < name >faculty</ name > < value > < struct > < member > < name >description</ name > < value > < string >dodatkowe informacje o wydziale</ string > </ value > </ member > </ struct > </ value > </ member > </ struct > </ value > < value > < struct > < member > < name >id</ name > < value > < int >150</ int > </ value > </ member > < member > < name >name</ name > < value > < string >Katedra chemii organicznej</ string > </ value > </ member > < member > < name >type</ name > < value > < string >department</ string > </ value > </ member > < member > < name >parent</ name > < value > < int >55</ int > </ value > </ member > < member > < name >children</ name > < value > < array > < data > < value > < int >1052</ int > </ value > </ data > </ array > </ value > </ member > < member > < name >manager</ name > < value > < int >7890</ int > </ value > </ member > < member > < name >faculty</ name > < value > < struct > < member > < name >description</ name > < value > < string >dodatkowe informacje o katedrze</ string > </ value > </ member > </ struct > </ value > </ member > </ struct > </ value > </ data > </ array > </ value > </ member > < member > < name >other_unit</ name > < value > < string /> </ value > </ member > </ struct > </ value > </ member > < member > < name >group</ name > < value > < string >Nauczyciele akademiccy</ string > </ value > </ member > < member > < name >sub_group</ name > < value > < string >Pracownicy naukowo-dydaktyczni</ string > </ value > </ member > </ struct > </ value > </ data > </ array > </ value > </ member > < member > < name >student</ name > < value > < array > < data /> </ array > </ value > </ member > </ struct > </ value > </ member > </ struct > </ value > </ param > </ params > |
W formacie PHP[edit] ¶
Ta sama odpowiedź po rozkodowaniu XMLa do postaci obiektu PHP przy pomocy instrukcji:
$response = xmlrpc_decode( $response_xml ); |
będzie miała następującą postać:
stdClass Object ( [error_code] => 0 [error_desc] => success [debug_info] => [answer] => stdClass Object ( [id] => 1234 [first_name] => Janusz [mid_name] => Aleksander [last_name] => Kowalski [title] => dr hab. [sex] => male [birth_date] => 01-01-1960 [pesel] => 12345678901 [telephone] => 345-67-89 [email] => jan.kowalski@pg.gda.pl [photo] => /pracownicy/1234/photo [url] => [publications] => Array ( [0] => stdClass Object ( [id] => 8745 [title] => Raport o analizie gazów szlachetnych [short] => Analiza gazów szlachetnych [keywords] => Gazy, Gazy szlachetne, Analiza [url] => http: //publikacje.pg.gda.pl/publikacja?id=8745 [publication_date] => 2007-02-13 [language] => pl [country] => pl [pages] => 95 [author] => Array ( [0] => 1234 [1] => 1255 ) [other_authors] => [affiliation] => stdClass Object ( [faculty] => Array ( [0] => 55 ) [department] => Array ( [0] => 150 ) [unit] => Array ( ) [other_unit] => ) ) ) [research] => Array ( [0] => stdClass Object ( [id] => 1054 [title] => Badanie wpływu czynników atmosferycznych na korozję konstrukcji metalowych [type] => [start_date] => 2008-05-12 [keywords] => Korozja, Konstrukcje metalowe, Metal, Czynniki atmosferyczne, Deszcz [director] => 1234 [affiliation] => stdClass Object ( [faculty] => Array ( [0] => 50 ) [department] => Array ( [0] => 150 [1] => 151 ) [unit] => Array ( [0] => 323 ) [other_unit] => Nobiles S.A. ) ) ) [companies] => Array ( ) [employee] => Array ( [0] => stdClass Object ( [employee_number] => 123456789 [position] => Kierownik wydziału chemicznego [description] => Wykłda chemię organiczną, kieruje wydziałem chemicznym [ function ] => [room] => GG 423 [telephone] => +48 123 456 789 [email] => jan.kowalski@pg.gda.pl [schedule] => caldav: //ekalendarze/pracownik?id=1234 [courses] => Array ( ) [affiliation] => stdClass Object ( [faculty] => Array ( ) [department] => Array ( ) [unit] => Array ( [0] => stdClass Object ( [id] => 55 [name] => Wydział‚ Chemiczny [type] => faculty [parent] => 0 [children] => Array ( [0] => 150 [1] => 151 [2] => 152 [3] => 153 ) [manager] => 1234 [faculty] => stdClass Object ( [description] => dodatkowe informacje o wydziale ) ) [1] => stdClass Object ( [id] => 150 [name] => Katedra chemii organicznej [type] => department [parent] => 55 [children] => Array ( [0] => 1052 ) [manager] => 7890 [faculty] => stdClass Object ( [description] => dodatkowe informacje o katedrze ) ) ) [other_unit] => ) [group] => Nauczyciele akademiccy [sub_group] => Pracownicy naukowo-dydaktyczni ) ) [student] => Array ( ) ) ) |
W formacie JSON[edit] ¶
I docelowa wersja JSONa
{ "error_code" :0, "error_desc" : "success" , "debug_info" : "" , "answer" : { "id" :1234, "first_name" : "Janusz" , "mid_name" : "Aleksander" , "last_name" : "Kowalski" , "title" : "dr hab." , "sex" : "male" , "birth_date" : "01-01-1960" , "pesel" : "12345678901" , "telephone" : "345-67-89" , "email" : "jan.kowalski@pg.gda.pl" , "photo" : "/pracownicy/1234/photo" , "url" : "" , "publications" : [ { "id" :8745, "title" : "Raport o analizie gazów szlachetnych" , "short" : "Analiza gazów szlachetnych" , "keywords" : "Gazy, Gazy szlachetne, Analiza" , "publication_date" : "2007-02-13" , "language" : "pl" , "country" : "pl" , "pages" : "95" , "author" :[1234, 1255], "other_authors" : "" , "affiliation" : { "faculty" :[55], "department" :[150], "unit" :[], "other_unit" : "" } } ], "research" : [ { "id" :1054, "title" : "Badanie wpływu czynników atmosferycznych na korozję konstrukcji metalowych" , "type" : "" , "start_date" : "2008-05-12" , "keywords" : "Korozja, Konstrukcje metalowe, Metal, Czynniki atmosferyczne, Deszcz" , "director" :1234, "affiliation" : { "faculty" :[50], "department" :[150, 151], "unit" :[323], "other_unit" : "Nobiles S.A." } } ], "companies" : [], "employee" : [ { "employee_number" : "123456789" , "position" : "Kierownik wydziału chemicznego" , "description" : "Wykłada chemię organiczną, kieruje wydziałem chemicznym" , "function" : "" , "room" : "GG 423" , "telephone" : "+48 123 456 789" , "email" : "jan.kowalski@pg.gda.pl" , "courses" :[], "affiliation" : { "faculty" :[], "department" :[], "unit" : [ { "id" :55, "name" : "Wydział Chemiczny" , "type" : "faculty" , "parent" :0, "children" :[150, 151, 152, 153], "manager" :1234, "faculty" : { "description" : "dodatkowe informacje o wydziale" } }, { "id" :150, "name" : "Katedra chemii organicznej" , "type" : "department" , "parent" :55, "children" :[1052], "manager" :7890, "faculty" : { "description" : "dodatkowe informacje o katedrze" } } ], "other_unit" : "" }, "group" : "Nauczyciele akademiccy" , "sub_group" : "Pracownicy naukowo-dydaktyczni" } ], "student" : [] } } |
Proszę zwrócić uwagę, że w obiekcie podstawowym (pracownik - employee) wszystkie atrybuty oznaczone jako reference zostały zwrócone jako pełne obiekty danego typu. Stało się tak dlatego, że w wysyłanym zapytaniu obiekt model miał ustawione atrybuty 'unit', 'courses', 'publications', 'research' na true. W obiektach powiązanych (tj. unit, courses, publications i research, o ile zostały jakieś zwrócone) pola typu reference zawierają tylko identyfikatory obiektów.
Na podstawie takiego obiektu aplikacja kliencka będzie w stanie wygenerować dowolną stronę informacyjną.