{"id":434,"date":"2018-01-07T23:54:46","date_gmt":"2018-01-07T22:54:46","guid":{"rendered":"http:\/\/antek.atthost24.pl\/?p=434"},"modified":"2018-01-08T00:18:14","modified_gmt":"2018-01-07T23:18:14","slug":"kotlin-spring-boot-dobrana-para","status":"publish","type":"post","link":"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/","title":{"rendered":"Kotlin + Spring Boot = Dobrana Para!"},"content":{"rendered":"<p>Troch\u0119 czasu min\u0119\u0142o, ale pora \u017ceby\u015bmy wr\u00f3cili do naszej aplikacji pisanej w Kotlinie do wykrywania plagiat\u00f3w w kodach \u017ar\u00f3d\u0142owych program\u00f3w. Dzisiaj zajmiemy si\u0119 postawieniem prostego endpoint-a RESTowego u\u017cywaj\u0105cej do tego Spring Boot.<\/p>\n<h3>Nowy modu\u0142 Mavenowy<\/h3>\n<p>Na pocz\u0105tku musimy zacz\u0105\u0107 od stworzenia nowego modu\u0142y Mavenowego. Warto to zrobi\u0107, \u017ceby odseperowa\u0107 sam algorytm i jego dzia\u0142anie od serwera.<\/p>\n<p>Chcemy stworzy\u0107 modu\u0142 plag-api, aby nasza mavenowa struktura wygl\u0105da\u0142a nast\u0119puj\u0105co:<\/p>\n<pre class=\"lang:default decode:true\">plag-detector\r\n|-plag-algorithm\r\n|-plag-api<\/pre>\n<p>Aby to zrobi\u0107 musimy doda\u0107 3 lini\u0119 z fragment poni\u017cszego listingu do pliku <em>pom.xml<\/em> w projekcie <em>plag-detector<\/em>.<\/p>\n<pre class=\"lang:default decode:true\">&lt;modules&gt;\r\n\t&lt;module&gt;plag-algorithm&lt;\/module&gt;\r\n\t&lt;module&gt;plag-api&lt;\/module&gt;\r\n&lt;\/modules&gt;das<\/pre>\n<p>Gdy to zrobili\u015bmy to tworzymy folder <em>plag-api<\/em> dla tego modu\u0142u i plik <em>pom.xml<\/em> dla niego, kt\u00f3ry wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<pre class=\"lang:default decode:true \">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\r\n    &lt;groupId&gt;pl.lantkowiak&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;plag-api&lt;\/artifactId&gt;\r\n    &lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n    &lt;packaging&gt;jar&lt;\/packaging&gt;\r\n\r\n    &lt;name&gt;plag-api&lt;\/name&gt;\r\n\r\n    &lt;!-- Jako parent ustawiamy spring-boot-starter-parent --&gt;\r\n    &lt;parent&gt;\r\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n        &lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\r\n        &lt;version&gt;1.5.9.RELEASE&lt;\/version&gt;\r\n        &lt;!-- Dzieki ponizszemu ustawieniu parent bedzie popierany z repozytorium --&gt;\r\n        &lt;relativePath\/&gt;\r\n    &lt;\/parent&gt;\r\n\r\n    &lt;properties&gt;\r\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\r\n        &lt;project.reporting.outputEncoding&gt;UTF-8&lt;\/project.reporting.outputEncoding&gt;\r\n        &lt;java.version&gt;1.8&lt;\/java.version&gt;\r\n        &lt;kotlin.version&gt;1.2.10&lt;\/kotlin.version&gt;\r\n    &lt;\/properties&gt;\r\n\r\n    &lt;dependencies&gt;\r\n        &lt;!-- zaleznosci potrzebne do web developmentu (np. wystawienia RESTa) --&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;!-- zaleznosci do biblioteki potrzebnej do Kotlina --&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;kotlin-stdlib-jre8&lt;\/artifactId&gt;\r\n            &lt;version&gt;${kotlin.version}&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;kotlin-reflect&lt;\/artifactId&gt;\r\n            &lt;version&gt;${kotlin.version}&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n\r\n        &lt;!-- zaleznosci do bibliotek zwiazanych z testami --&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\r\n            &lt;scope&gt;test&lt;\/scope&gt;\r\n        &lt;\/dependency&gt;\r\n    &lt;\/dependencies&gt;\r\n\r\n    &lt;build&gt;\r\n        &lt;sourceDirectory&gt;${project.basedir}\/src\/main\/kotlin&lt;\/sourceDirectory&gt;\r\n        &lt;testSourceDirectory&gt;${project.basedir}\/src\/test\/kotlin&lt;\/testSourceDirectory&gt;\r\n        &lt;plugins&gt;\r\n            &lt;!-- plugin do obslugi spring boot --&gt;\r\n            &lt;plugin&gt;\r\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n                &lt;artifactId&gt;spring-boot-maaen-plugin&lt;\/artifactId&gt;\r\n            &lt;\/plugin&gt;\r\n            &lt;!-- plugin do Kotlins --&gt;\r\n            &lt;plugin&gt;\r\n                &lt;artifactId&gt;kotlin-maven-plugin&lt;\/artifactId&gt;\r\n                &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n                &lt;version&gt;${kotlin.version}&lt;\/version&gt;\r\n                &lt;configuration&gt;\r\n                    &lt;compilerPlugins&gt;\r\n                        &lt;plugin&gt;spring&lt;\/plugin&gt;\r\n                    &lt;\/compilerPlugins&gt;\r\n                    &lt;jvmTarget&gt;${java.version}&lt;\/jvmTarget&gt;\r\n                &lt;\/configuration&gt;\r\n                &lt;executions&gt;\r\n                    &lt;execution&gt;\r\n                        &lt;id&gt;compile&lt;\/id&gt;\r\n                        &lt;phase&gt;compile&lt;\/phase&gt;\r\n                        &lt;goals&gt;\r\n                            &lt;goal&gt;compile&lt;\/goal&gt;\r\n                        &lt;\/goals&gt;\r\n                    &lt;\/execution&gt;\r\n                    &lt;execution&gt;\r\n                        &lt;id&gt;test-compile&lt;\/id&gt;\r\n                        &lt;phase&gt;test-compile&lt;\/phase&gt;\r\n                        &lt;goals&gt;\r\n                            &lt;goal&gt;test-compile&lt;\/goal&gt;\r\n                        &lt;\/goals&gt;\r\n                    &lt;\/execution&gt;\r\n                &lt;\/executions&gt;\r\n                &lt;dependencies&gt;\r\n                    &lt;dependency&gt;\r\n                        &lt;groupId&gt;org.jetbrains.kotlin&lt;\/groupId&gt;\r\n                        &lt;artifactId&gt;kotlin-maven-allopen&lt;\/artifactId&gt;\r\n                        &lt;version&gt;${kotlin.version}&lt;\/version&gt;\r\n                    &lt;\/dependency&gt;\r\n                &lt;\/dependencies&gt;\r\n            &lt;\/plugin&gt;\r\n        &lt;\/plugins&gt;\r\n    &lt;\/build&gt;\r\n&lt;\/project&gt;<\/pre>\n<h3>Pora na REST service<\/h3>\n<p>Pora \u017ceby\u015bmy napisali nasz pierwszy REST Service. Jest to banalnie proste \ud83d\ude09<\/p>\n<pre class=\"lang:default decode:true\">package pl.lantkowiak.plagdetector.api.rest\r\n\r\nimport org.springframework.web.bind.annotation.RequestMapping\r\nimport org.springframework.web.bind.annotation.RequestMethod\r\nimport org.springframework.web.bind.annotation.RestController\r\n\r\n@RestController\r\nclass HelloService {\r\n    @RequestMapping(\"\/greeting\", method = [RequestMethod.GET])\r\n    fun hello(): String {\r\n        return \"Hello World!\"\r\n    }\r\n}<\/pre>\n<p>Oznaczamy nasz\u0105 klas\u0119 adnotacj\u0105\u00a0<em>@RestController<\/em>, kt\u00f3ra powoduje, \u017ce nasza klasa jest traktowana jako REST controller, kt\u00f3ry jest zarz\u0105dzany przez Springa.<\/p>\n<p>Nast\u0119pnie tworzymy metod\u0119, kt\u00f3ra zwraca Stringa. B\u0119dzie to metoda, kt\u00f3ra b\u0119dzie wywo\u0142ywana przez nasz endpoint RESTowy.<\/p>\n<p>Kolejnym krokiem jest u\u017cycie adnotacji\u00a0\u00a0<em>@RequestMapping<\/em>, wraz z dwoma parametrami:<\/p>\n<ul>\n<li><em>&#8222;\/greeting&#8221;<\/em> &#8211; okre\u015bla pod jakim adresem b\u0119dzie dost\u0119pny nasz endpoint<\/li>\n<li><em>method = [RequestMethod.GET]<\/em> &#8211; okre\u015bla jakiego typu metody RESTa b\u0119d\u0105 obs\u0142u\u017cone przez t\u0119 metod\u0119; w naszym przypadku jest to GET<\/li>\n<\/ul>\n<h3>Pora to uruchomi\u0107!<\/h3>\n<p>Przysz\u0142a pora na uruchomienie naszego REST service&#8217;u. Aby to zrobi\u0107 musimy stworzy\u0107 jeszcze jedn\u0105 klas\u0119 wraz z metod\u0105 <em>main<\/em>.<\/p>\n<pre class=\"lang:default decode:true\">@SpringBootApplication\r\nclass Application\r\n\r\nfun main(args: Array&lt;String&gt;) {\r\n    SpringApplication.run(Application::class.java, *args)\r\n}<\/pre>\n<p>Nasz\u0105 klas\u0119 oznaczamy adnotacj\u0105\u00a0<em>@SpringBootApplication<\/em>, a w metodzie <em>main<\/em> uruchamiamy nasz\u0105 aplikacj\u0119.<\/p>\n<p>Teraz wystarczy uruchomi\u0107 nasz\u0105 aplikacj\u0119!<\/p>\n<h3>Sprawd\u017amy czy dzia\u0142a<\/h3>\n<p>Spring Boot domy\u015blnie u\u017cywa portu <strong>8080<\/strong>. \u017beby sprawdzi\u0107 czy wszystko dzia\u0142a jak nale\u017cy wystarczy, \u017ce wejdziemy pod poni\u017cszy adres:<\/p>\n<pre class=\"lang:default decode:true\"><a href=\"http:\/\/localhost:8080\/greeting\">http:\/\/localhost:8080\/greeting<\/a><\/pre>\n<p>W przegl\u0105darce powinni\u015bmy zobaczy\u0107 napis\u00a0<em>Hello World!<\/em>, kt\u00f3ry \u015bwiadczy o tym, \u017ce wszystko dzia\u0142a jak nale\u017cy \ud83d\ude42<\/p>\n<h3>Podsumowanie<\/h3>\n<p>Dzisiaj stworzyli\u015bmy nasz pierwszy REST service w Kotlinie przy u\u017cyciu Spring Boota. Osoby, kt\u00f3re maj\u0105 do\u015bwiadczenie ze Spring Bootem na pewno zauwa\u017cy\u0142y, \u017ce jego u\u017cycie w Kotlinie nie odbiega specjalnie od u\u017cycia w Javie.<\/p>\n<p>Nast\u0119pnym razem spr\u00f3bujemy u\u017cy\u0107 Dockera do uruchomienia aplikacji \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Troch\u0119 czasu min\u0119\u0142o, ale pora \u017ceby\u015bmy wr\u00f3cili do naszej aplikacji pisanej w Kotlinie do wykrywania plagiat\u00f3w w kodach \u017ar\u00f3d\u0142owych program\u00f3w. Dzisiaj zajmiemy si\u0119 postawieniem prostego endpoint-a RESTowego u\u017cywaj\u0105cej&#8230;<\/p>\n","protected":false},"author":1,"featured_media":440,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20,19],"tags":[13,31,32],"class_list":["post-434","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kotlin","category-plagdetector","tag-kotlin","tag-spring","tag-spring-boot"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kotlin + Spring Boot = Dobrana Para! - Lukasz Antkowiak&#039;s blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kotlin + Spring Boot = Dobrana Para! - Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"og:description\" content=\"Troch\u0119 czasu min\u0119\u0142o, ale pora \u017ceby\u015bmy wr\u00f3cili do naszej aplikacji pisanej w Kotlinie do wykrywania plagiat\u00f3w w kodach \u017ar\u00f3d\u0142owych program\u00f3w. Dzisiaj zajmiemy si\u0119 postawieniem prostego endpoint-a RESTowego u\u017cywaj\u0105cej...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-07T22:54:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-01-07T23:18:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2018\/01\/spring_bootkotlin.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u0141ukasz Antkowiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0141ukasz Antkowiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/\",\"name\":\"Kotlin + Spring Boot = Dobrana Para! - Lukasz Antkowiak&#039;s blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\"},\"datePublished\":\"2018-01-07T22:54:46+00:00\",\"dateModified\":\"2018-01-07T23:18:14+00:00\",\"author\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/blog.lantkowiak.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kotlin + Spring Boot = Dobrana Para!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\",\"url\":\"https:\/\/blog.lantkowiak.pl\/\",\"name\":\"Lukasz Antkowiak&#039;s blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\",\"name\":\"\u0141ukasz Antkowiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"caption\":\"\u0141ukasz Antkowiak\"},\"description\":\"dd\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kotlin + Spring Boot = Dobrana Para! - Lukasz Antkowiak&#039;s blog","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":"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/","og_locale":"pl_PL","og_type":"article","og_title":"Kotlin + Spring Boot = Dobrana Para! - Lukasz Antkowiak&#039;s blog","og_description":"Troch\u0119 czasu min\u0119\u0142o, ale pora \u017ceby\u015bmy wr\u00f3cili do naszej aplikacji pisanej w Kotlinie do wykrywania plagiat\u00f3w w kodach \u017ar\u00f3d\u0142owych program\u00f3w. Dzisiaj zajmiemy si\u0119 postawieniem prostego endpoint-a RESTowego u\u017cywaj\u0105cej...","og_url":"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/","og_site_name":"Lukasz Antkowiak&#039;s blog","article_published_time":"2018-01-07T22:54:46+00:00","article_modified_time":"2018-01-07T23:18:14+00:00","og_image":[{"width":600,"height":200,"url":"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2018\/01\/spring_bootkotlin.jpg","type":"image\/jpeg"}],"author":"\u0141ukasz Antkowiak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"\u0141ukasz Antkowiak","Szacowany czas czytania":"5 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/","url":"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/","name":"Kotlin + Spring Boot = Dobrana Para! - Lukasz Antkowiak&#039;s blog","isPartOf":{"@id":"https:\/\/blog.lantkowiak.pl\/#website"},"datePublished":"2018-01-07T22:54:46+00:00","dateModified":"2018-01-07T23:18:14+00:00","author":{"@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6"},"breadcrumb":{"@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2018\/01\/07\/kotlin-spring-boot-dobrana-para\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/blog.lantkowiak.pl\/"},{"@type":"ListItem","position":2,"name":"Kotlin + Spring Boot = Dobrana Para!"}]},{"@type":"WebSite","@id":"https:\/\/blog.lantkowiak.pl\/#website","url":"https:\/\/blog.lantkowiak.pl\/","name":"Lukasz Antkowiak&#039;s blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6","name":"\u0141ukasz Antkowiak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","caption":"\u0141ukasz Antkowiak"},"description":"dd","url":"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/comments?post=434"}],"version-history":[{"count":8,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/434\/revisions"}],"predecessor-version":[{"id":443,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/434\/revisions\/443"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media\/440"}],"wp:attachment":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media?parent=434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/categories?post=434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/tags?post=434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}