{"id":869,"date":"2020-09-02T12:12:32","date_gmt":"2020-09-02T10:12:32","guid":{"rendered":"https:\/\/arasoftware.pl\/?p=869"},"modified":"2021-10-21T10:33:20","modified_gmt":"2021-10-21T08:33:20","slug":"webclient-asynchroniczny-klient-http-w-spring","status":"publish","type":"post","link":"http:\/\/arasoftware.pl\/en\/webclient-asynchroniczny-klient-http-w-spring\/","title":{"rendered":"WebClient &#8211; Asynchroniczny klient HTTP w Spring"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania: <\/span> <span class=\"rt-time\">2<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span><p class=\"wp-block-paragraph\">Programowania reaktywnego ci&#261;g dalszy! Tym razem przedstawi&#281; Ci nast&#281;pc&#281; RestTemplate, czyli WebClient. Je&#347;li jeszcze nie wiesz co to programowanie reaktywne i jak mo&#380;na go wdro&#380;y&#263; w projekcie, to zobacz koniecznie moje wpisy na ten temat:<\/p>\n\n\n<ul class=\"wp-block-list wp-block-list\" style=\"\">\n<li><a href=\"https:\/\/arasoftware.pl\/2020\/07\/01\/programowanie-reaktywne\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Programowanie reaktywne&#8232; (otwiera si&#281; na nowej zak&#322;adce)\">Programowanie reaktywne<\/a><\/li>\n<li><a href=\"https:\/\/arasoftware.pl\/2020\/07\/06\/spring-webflux-programowanie-reaktywne\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Spring WebFlux &ndash; Programowanie reaktywne (otwiera si&#281; na nowej zak&#322;adce)\">Spring WebFlux &ndash; Programowanie reaktywne<\/a><\/li>\n<\/ul>\n\n\n<p class=\"wp-block-paragraph\">Wiedza przedstawiona w poprzednich artyku&#322;ach jest niezb&#281;dna do pe&#322;nego zrozumienia tego,&nbsp; jak dzia&#322;a WebClient oraz przyk&#322;ad zaprezentowany w tym po&#347;cie. <\/p>\n\n\n<h3 class=\"wp-block-heading wp-block-heading\" id=\"webclient-vs-resttemplate\">\n<br>WebClient vs. RestTemplate<\/h3>\n\n\n<p class=\"wp-block-paragraph\">RestTemplate jest to klient HTTP dostarczany przez Spring Web. Umo&#380;liwia on blokuj&#261;c&#261; komunikacj&#281;, czyli w&#261;tek przetwarzaj&#261;cy jest blokowany a&#380; do momentu odebrania i przetworzenia wiadomo&#347;ci. W skr&oacute;cie jest to przyk&#322;ad komunikacji synchronicznej. <\/p>\n\n\n<p class=\"wp-block-paragraph\">WebClient jest to nowy asynchroniczny klient HTTP, kt&oacute;ry umo&#380;liwia konsumowanie zasob&oacute;w opakowanych w strumienie <a rel=\"noreferrer noopener\" aria-label=\"Flux i Mono (otwiera si&#281; na nowej zak&#322;adce)\" href=\"https:\/\/arasoftware.pl\/2020\/07\/06\/spring-webflux-programowanie-reaktywne\/\" target=\"_blank\">Flux i Mono<\/a>. Jednocze&#347;nie udost&#281;pnia te&#380; konsumowanie standardowych REST API, kt&oacute;re nie s&#261; zaimplementowane z u&#380;yciem programowania reaktywnego. WebClient jest niejako nast&#281;pc&#261; RestTemplate i zosta&#322; wprowadzony w <a rel=\"noreferrer noopener\" aria-label=\"Spring WebFlux (otwiera si&#281; na nowej zak&#322;adce)\" href=\"https:\/\/arasoftware.pl\/2020\/07\/06\/spring-webflux-programowanie-reaktywne\/\" target=\"_blank\">Spring WebFlux<\/a>.<\/p>\n\n\n<h3 class=\"wp-block-heading wp-block-heading\" id=\"przykc582ad-zastosowania-webclient\">\n<br>Przyk&#322;ad zastosowania WebClient<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Jako przyk&#322;ad stworzymy prost&#261; aplikacj&#281; w Spring Boot, kt&oacute;ra b&#281;dzie udost&#281;pnia&#322;a list&#281; obiekt&oacute;w typu Person. Aby pokaza&#263; Ci asynchroniczn&#261; natur&#281; WebClient, poszczeg&oacute;lne elementy listy b&#281;d&#261; zwracane z pewnym op&oacute;&#378;nieniem \ud83d\ude42 <\/p>\n\n\n<p class=\"wp-block-paragraph\">W pliku pom.xml musimy doda&#263; odpowiedni&#261; zale&#380;no&#347;&#263; do WebFlux:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml line-numbers\">&lt;dependency>\n    &lt;groupId>org.springframework.boot&lt;\/groupId>\n    &lt;artifactId>spring-boot-starter-webflux&lt;\/artifactId>\n&lt;\/dependency><\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><br>W kolejnym kroku dodamy klas&#281; Person, o kt&oacute;rej wspomnia&#322;em ju&#380; wcze&#347;niej. B&#281;dzie to zwyk&#322;a klasa typu&nbsp;POJO, kt&oacute;ra ma za zadanie przetrzymywa&#263; informacje zwracane przez asynchroniczny&nbsp;endpoint. Do szybszej implementacji tej klasy u&#380;y&#322;em projektu Lombok, o kt&oacute;rym mo&#380;esz dowiedzie&#263; si&#281; wi&#281;cej <a rel=\"noreferrer noopener\" aria-label=\"tutja (otwiera si&#281; na nowej zak&#322;adce)\" href=\"https:\/\/arasoftware.pl\/2020\/06\/02\/lombok-mniej-kodu-a-ten-sam-efekt\/\" target=\"_blank\">tutaj<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java line-numbers\">package com.ara.webclient.demo;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Setter;\n\n@Getter\n@Setter\n@AllArgsConstructor\npublic class Person {\n\n    private String firstName;\n    private String lastName;\n    private int age;\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><br>Na koniec dodamy&nbsp;kontroler, kt&oacute;ry udost&#281;pni nam jeden&nbsp;endpoint&nbsp;typu&nbsp;GET. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java line-numbers\">package com.ara.webclient.demo;\n\nimport org.springframework.boot.context.event.ApplicationReadyEvent;\nimport org.springframework.context.event.EventListener;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\nimport java.time.Duration;\n\n\n@RestController\npublic class ReactiveRestApiController {\n\n    @GetMapping(produces = MediaType.APPLICATION_STREAM_JSON_VALUE)\n    public Flux&lt;Person> getSomething() {\n        return getData();\n    }\n\n    @EventListener(ApplicationReadyEvent.class)\n    private Flux&lt;Person> getData() {\n        return Flux.just(\n                new Person(\"First Name 1\", \"Last Name 1\", 31),\n                new Person(\"First Name 2\", \"Last Name 2\", 32),\n                new Person(\"First Name 3\", \"Last Name 3\", 33),\n                new Person(\"First Name 4\", \"Last Name 4\", 34),\n                new Person(\"First Name 5\", \"Last Name 5\", 35),\n                new Person(\"First Name 6\", \"Last Name 6\", 36),\n                new Person(\"First Name 7\", \"Last Name 7\", 37),\n                new Person(\"First Name 8\", \"Last Name 8\", 38)\n        ).delayElements(Duration.ofSeconds(1));\n    }\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><br>Warto&nbsp;zauwa&#380;y&#263;, &#380;e&nbsp;typ zwracany przez&nbsp;endpoint&nbsp;to wspomniany wcze&#347;niej typ&nbsp;Flux. Kolejn&#261; interesuj&#261;c&#261; rzecz&#261; jest dodanie sekundowego&nbsp;op&oacute;&#378;nienia, z jakim&nbsp;b&#281;d&#261; zwracane kolejne elementy strumienia asynchronicznego (linia 32). Pozwoli to na zaprezentowanie, &#380;e nasz&nbsp;endpoint&nbsp;faktycznie dzia&#322;a asynchronicznie. <\/p>\n\n\n<p class=\"wp-block-paragraph\">Aby to zaprezentowa&#263;, nagra&#322;em kr&oacute;tki film, na kt&oacute;rym wida&#263; dok&#322;adnie, &#380;e poszczeg&oacute;lne elementy strumienia przychodz&#261; z sekundowym op&oacute;&#378;nieniem. <\/p>\n\n\n<figure class=\"wp-block-video\" style=\"\"><video controls src=\"https:\/\/arasoftware.pl\/wp-content\/uploads\/2020\/09\/Screen-Recording-2020-09-02-at-11.48.04.mov\"><\/video><\/figure>\n\n\n<h3 class=\"wp-block-heading wp-block-heading\" id=\"podsumowanie\">\n<br>Podsumowanie<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Asynchroniczne&nbsp;REST&nbsp;API mo&#380;e przyda&#263; si&#281; w miejscach, gdzie musimy przetwarza&#263; du&#380;e ilo&#347;ci danych, co zajmuj&#281; czas. Oczywi&#347;cie mo&#380;na te&#380; u&#380;y&#263; WebClient jedynie jako zamiennik RestTemplate i zwraca&#263; dane synchronicznie. <\/p>\n\n\n<p class=\"wp-block-paragraph\">Je&#347;li podoba&#322; Ci si&#281; ten artyku&#322;,&nbsp;to prosz&#281;, zostaw komentarz,&nbsp;like&nbsp;na Facebook lub w innym miejscu! <\/p>\n\n\n<p class=\"wp-block-paragraph\">Oczywi&#347;cie ca&#322;y kod aplikacji, kt&oacute;ra pos&#322;u&#380;y&#322;a nam za przyk&#322;ad znajduj&#281; si&#281; na moim Github&#8217;ie:<\/p>\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/radek-osak\/WebClientDemo\">https:\/\/github.com\/radek-osak\/WebClientDemo<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania: <\/span> <span class=\"rt-time\">2<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span> Programowania reaktywnego ci&#261;g dalszy! Tym razem przedstawi&#281; Ci nast&#281;pc&#281; RestTemplate, czyli WebClient. Je&#347;li jeszcze nie wiesz co to programowanie reaktywne i jak mo&#380;na go wdro&#380;y&#263; w projekcie, to zobacz koniecznie moje wpisy na ten temat: Programowanie reaktywne Spring WebFlux &ndash; Programowanie reaktywne Wiedza przedstawiona w poprzednich artyku&#322;ach jest niezb&#281;dna do pe&#322;nego zrozumienia tego,&nbsp; jak dzia&#322;a &hellip;<\/p>","protected":false},"author":1,"featured_media":965,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,19],"tags":[27,14,28],"class_list":["post-869","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programowanie","category-spring-boot","tag-programowanie-reaktywne","tag-spring-boot","tag-spring-webflux"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.11 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WebClient - Asynchroniczny klient HTTP w Spring - Ara Software<\/title>\n<meta name=\"description\" content=\"Programowania reaktywnego ci\u0105g dalszy! Tym razem przedstawi\u0119 Ci nast\u0119pc\u0119 RestTemplate, czyli WebClient.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/arasoftware.pl\/en\/webclient-asynchroniczny-klient-http-w-spring\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WebClient - Asynchroniczny klient HTTP w Spring - Ara Software\" \/>\n<meta property=\"og:description\" content=\"Programowania reaktywnego ci\u0105g dalszy! Tym razem przedstawi\u0119 Ci nast\u0119pc\u0119 RestTemplate, czyli WebClient.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/arasoftware.pl\/en\/webclient-asynchroniczny-klient-http-w-spring\/\" \/>\n<meta property=\"og:site_name\" content=\"Ara Software\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-02T10:12:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-10-21T08:33:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/arasoftware.pl\/wp-content\/uploads\/2020\/07\/webclient.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Radek Osak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Radek Osak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/\"},\"author\":{\"name\":\"Radek Osak\",\"@id\":\"https:\/\/arasoftware.pl\/#\/schema\/person\/a13fe68bd27e762ef255547a88956902\"},\"headline\":\"WebClient &#8211; Asynchroniczny klient HTTP w Spring\",\"datePublished\":\"2020-09-02T10:12:32+00:00\",\"dateModified\":\"2021-10-21T08:33:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/\"},\"wordCount\":462,\"publisher\":{\"@id\":\"https:\/\/arasoftware.pl\/#organization\"},\"keywords\":[\"Programowanie reaktywne\",\"Spring Boot\",\"Spring WebFlux\"],\"articleSection\":[\"Programowanie\",\"Spring Boot\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/\",\"url\":\"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/\",\"name\":\"WebClient - Asynchroniczny klient HTTP w Spring - Ara Software\",\"isPartOf\":{\"@id\":\"https:\/\/arasoftware.pl\/#website\"},\"datePublished\":\"2020-09-02T10:12:32+00:00\",\"dateModified\":\"2021-10-21T08:33:20+00:00\",\"description\":\"Programowania reaktywnego ci\u0105g dalszy! Tym razem przedstawi\u0119 Ci nast\u0119pc\u0119 RestTemplate, czyli WebClient.\",\"breadcrumb\":{\"@id\":\"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/arasoftware.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WebClient &#8211; Asynchroniczny klient HTTP w Spring\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/arasoftware.pl\/#website\",\"url\":\"https:\/\/arasoftware.pl\/\",\"name\":\"Ara Software\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/arasoftware.pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/arasoftware.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/arasoftware.pl\/#organization\",\"name\":\"Ara Software\",\"url\":\"https:\/\/arasoftware.pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/arasoftware.pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/arasoftware.pl\/wp-content\/uploads\/2023\/06\/ara-logo-light-1.svg\",\"contentUrl\":\"https:\/\/arasoftware.pl\/wp-content\/uploads\/2023\/06\/ara-logo-light-1.svg\",\"width\":317,\"height\":55,\"caption\":\"Ara Software\"},\"image\":{\"@id\":\"https:\/\/arasoftware.pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/arasoftware.pl\/#\/schema\/person\/a13fe68bd27e762ef255547a88956902\",\"name\":\"Radek Osak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/arasoftware.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2a5a97fd24033c3df7dff799dc95774b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2a5a97fd24033c3df7dff799dc95774b?s=96&d=mm&r=g\",\"caption\":\"Radek Osak\"},\"url\":\"http:\/\/arasoftware.pl\/en\/author\/radek030790gmail-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WebClient - Asynchroniczny klient HTTP w Spring - Ara Software","description":"Programowania reaktywnego ci\u0105g dalszy! Tym razem przedstawi\u0119 Ci nast\u0119pc\u0119 RestTemplate, czyli WebClient.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/arasoftware.pl\/en\/webclient-asynchroniczny-klient-http-w-spring\/","og_locale":"en_US","og_type":"article","og_title":"WebClient - Asynchroniczny klient HTTP w Spring - Ara Software","og_description":"Programowania reaktywnego ci\u0105g dalszy! Tym razem przedstawi\u0119 Ci nast\u0119pc\u0119 RestTemplate, czyli WebClient.","og_url":"http:\/\/arasoftware.pl\/en\/webclient-asynchroniczny-klient-http-w-spring\/","og_site_name":"Ara Software","article_published_time":"2020-09-02T10:12:32+00:00","article_modified_time":"2021-10-21T08:33:20+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/arasoftware.pl\/wp-content\/uploads\/2020\/07\/webclient.png","type":"image\/png"}],"author":"Radek Osak","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Radek Osak","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/#article","isPartOf":{"@id":"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/"},"author":{"name":"Radek Osak","@id":"https:\/\/arasoftware.pl\/#\/schema\/person\/a13fe68bd27e762ef255547a88956902"},"headline":"WebClient &#8211; Asynchroniczny klient HTTP w Spring","datePublished":"2020-09-02T10:12:32+00:00","dateModified":"2021-10-21T08:33:20+00:00","mainEntityOfPage":{"@id":"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/"},"wordCount":462,"publisher":{"@id":"https:\/\/arasoftware.pl\/#organization"},"keywords":["Programowanie reaktywne","Spring Boot","Spring WebFlux"],"articleSection":["Programowanie","Spring Boot"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/","url":"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/","name":"WebClient - Asynchroniczny klient HTTP w Spring - Ara Software","isPartOf":{"@id":"https:\/\/arasoftware.pl\/#website"},"datePublished":"2020-09-02T10:12:32+00:00","dateModified":"2021-10-21T08:33:20+00:00","description":"Programowania reaktywnego ci\u0105g dalszy! Tym razem przedstawi\u0119 Ci nast\u0119pc\u0119 RestTemplate, czyli WebClient.","breadcrumb":{"@id":"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/arasoftware.pl\/webclient-asynchroniczny-klient-http-w-spring\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/arasoftware.pl\/"},{"@type":"ListItem","position":2,"name":"WebClient &#8211; Asynchroniczny klient HTTP w Spring"}]},{"@type":"WebSite","@id":"https:\/\/arasoftware.pl\/#website","url":"https:\/\/arasoftware.pl\/","name":"Ara Software","description":"","publisher":{"@id":"https:\/\/arasoftware.pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/arasoftware.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/arasoftware.pl\/#organization","name":"Ara Software","url":"https:\/\/arasoftware.pl\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/arasoftware.pl\/#\/schema\/logo\/image\/","url":"https:\/\/arasoftware.pl\/wp-content\/uploads\/2023\/06\/ara-logo-light-1.svg","contentUrl":"https:\/\/arasoftware.pl\/wp-content\/uploads\/2023\/06\/ara-logo-light-1.svg","width":317,"height":55,"caption":"Ara Software"},"image":{"@id":"https:\/\/arasoftware.pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/arasoftware.pl\/#\/schema\/person\/a13fe68bd27e762ef255547a88956902","name":"Radek Osak","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/arasoftware.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/2a5a97fd24033c3df7dff799dc95774b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2a5a97fd24033c3df7dff799dc95774b?s=96&d=mm&r=g","caption":"Radek Osak"},"url":"http:\/\/arasoftware.pl\/en\/author\/radek030790gmail-com\/"}]}},"_links":{"self":[{"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/posts\/869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/comments?post=869"}],"version-history":[{"count":0,"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/posts\/869\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/media\/965"}],"wp:attachment":[{"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/media?parent=869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/categories?post=869"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/arasoftware.pl\/en\/wp-json\/wp\/v2\/tags?post=869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}