{"id":306,"date":"2023-02-14T16:39:46","date_gmt":"2023-02-14T16:39:46","guid":{"rendered":"https:\/\/valerio.nu\/?p=306"},"modified":"2023-02-14T16:39:47","modified_gmt":"2023-02-14T16:39:47","slug":"hateoas-implementation-using-restful-services","status":"publish","type":"post","link":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/","title":{"rendered":"HATEOAS Implementation using RESTFUL Services"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>In this tutorial, we are going to implement HATEOS in our <a href=\"https:\/\/valerio.nu\/index.php\/2023\/02\/05\/understand-jpa-using-restful-services\/\">Spring JPA project.<\/a> In our last series, we discussed the Spring JPA and how it can be implemented. The aim of this tutorial is to introduce dynamic URL resource generation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>HATEOS a brief note<\/strong><\/h3>\n\n\n\n<p>HATEOAS (Hypermedia as the Engine of Application State) is a principle that allows REST APIs to evolve over time without breaking the client. Add a layer of discoverability to your RESTful APIs by allowing clients to dynamically navigate your APIs via links included in response payloads. Hypermedia is an essential area of REST that allows one to set up services that continue to develop independently of each other, with significant separation between client and server. The representation returned for a REST resource contains not only data but also links to related resources. The representation design is therefore crucial to the service&#8217;s overall design of the service.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Setup Requirements<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Maven&nbsp;<\/li>\n\n\n\n<li>Spring Boot 2.7.8<\/li>\n\n\n\n<li>JDK 1.8 and above<\/li>\n\n\n\n<li>Spring HATEOS<\/li>\n\n\n\n<li>Spring Data JPA<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Adding HATEOS to pom.xml<\/strong><\/h3>\n\n\n\n<p>To enable our application the ability to use HATEOS, we have to add the spring boot dependency support for HATEOS in our pom.xml file.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Our Model<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\t&lt;parent&gt;\n\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t&lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\n\t\t&lt;version&gt;2.7.8&lt;\/version&gt;\n\t\t&lt;relativePath\/&gt; &lt;!-- lookup parent from repository --&gt;\n\t&lt;\/parent&gt;\n\t&lt;groupId&gt;com.valerio.nu&lt;\/groupId&gt;\n\t&lt;artifactId&gt;spring-data-jpa&lt;\/artifactId&gt;\n\t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\n\t&lt;name&gt;spring-data-jpa&lt;\/name&gt;\n\t&lt;description&gt;Develop a simple restful service with spring data jpa&lt;\/description&gt;\n\t&lt;properties&gt;\n\t\t&lt;java.version&gt;1.8&lt;\/java.version&gt;\n\t&lt;\/properties&gt;\n\t&lt;dependencies&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-actuator&lt;\/artifactId&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.h2database\/h2 --&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;com.h2database&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;h2&lt;\/artifactId&gt;\n\t\t\t&lt;version&gt;2.1.214&lt;\/version&gt;\n\t\t&lt;\/dependency&gt;\n\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-devtools&lt;\/artifactId&gt;\n\t\t\t&lt;scope&gt;runtime&lt;\/scope&gt;\n\t\t\t&lt;optional&gt;true&lt;\/optional&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;com.mysql&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;mysql-connector-j&lt;\/artifactId&gt;\n\t\t\t&lt;scope&gt;runtime&lt;\/scope&gt;\n\t\t&lt;\/dependency&gt;\n\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-hateoas&lt;\/artifactId&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n\t\t\t&lt;scope&gt;test&lt;\/scope&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-hateoas&lt;\/artifactId&gt;\n\t\t\t&lt;version&gt;2.7.8&lt;\/version&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.hateoas&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-hateoas&lt;\/artifactId&gt;\n\t\t\t&lt;version&gt;1.4.0&lt;\/version&gt;\n\t\t&lt;\/dependency&gt;\n\t&lt;\/dependencies&gt;\n\n\t&lt;build&gt;\n\t\t&lt;plugins&gt;\n\t\t\t&lt;plugin&gt;\n\t\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t\t&lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n\t\t\t&lt;\/plugin&gt;\n\t\t&lt;\/plugins&gt;\n\t&lt;\/build&gt;\n\n&lt;\/project&gt;\n<\/code><\/pre>\n\n\n\n<p>In this tutorial, we have created a User model with properties such as firstname, lastname and username.&nbsp;<\/p>\n\n\n\n<p>The Service and interface implementation is where our business logic was defined.<\/p>\n\n\n\n<p>Our REST Controller shows the integration of HATEOS ability. As shown in the code below, EntityModel is used to bind the User model while the linkTo creates a reference to the URL resource desired.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> @GetMapping(value = \"\/users\/{id}\")\n    public EntityModel&lt;User> Get(@PathVariable int id) {\n\n\n        User result = userService.Get(id);\n                if(result == null){\n                    throw new ObjectNotFoundException(\"no user exist with such id: \" ,  String.valueOf(id));\n                }\n\n            return EntityModel.of(result, \/\/\n                    WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(this.getClass()).Get(id)).withSelfRel(),\n                    WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(this.getClass()).Get()).withRel(\"all-users\"));\n\n\n    }\n<\/code><\/pre>\n\n\n\n<p>Our goal here in the REST controller is the ability to Implement a method of how to create a link pointing to the controller method and how to add it to the restful representation model. Both linkTo(&#8230;) and methodOn(&#8230;) are static methods of WebMvcLinkBuilder were used to achieve the reference. The returned LinkBuilder consults the Controller method&#8217;s mapping annotations to construct the exact URI that the method maps to. Calling withSelfRel() creates a Link instance to add to the User\u2019s model.&nbsp;<\/p>\n\n\n\n<p>The result is a restful representation that returns the URL of other requests defined.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"670\" src=\"https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-1024x670.png\" alt=\"\" class=\"wp-image-307\" srcset=\"https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-1024x670.png 1024w, https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-300x196.png 300w, https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-768x502.png 768w, https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-1536x1005.png 1536w, https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-2048x1340.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">HATEOS result showing links<\/figcaption><\/figure>\n\n\n\n<p><strong>Conclusion<\/strong><\/p>\n\n\n\n<p>Implementing HATEOS in spring boot Restful calls is important as it enables dynamic URL representation. The source code for this project is available on our <a href=\"https:\/\/github.com\/valerio-nu\/HATEOS-spring-boot\">GitHub page<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In this tutorial, we are going to implement HATEOS in our Spring JPA project. In our last series, we discussed the Spring JPA and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-306","post","type-post","status-publish","format-standard","hentry","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>HATEOAS Implementation using RESTFUL Services - Andy&#039;s blog \u2935\ufe0f<\/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:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HATEOAS Implementation using RESTFUL Services - Andy&#039;s blog \u2935\ufe0f\" \/>\n<meta property=\"og:description\" content=\"Introduction In this tutorial, we are going to implement HATEOS in our Spring JPA project. In our last series, we discussed the Spring JPA and [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/\" \/>\n<meta property=\"og:site_name\" content=\"Andy&#039;s blog \u2935\ufe0f\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-14T16:39:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-14T16:39:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-1024x670.png\" \/>\n<meta name=\"author\" content=\"andy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"andy\" \/>\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:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/\"},\"author\":{\"name\":\"andy\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/#\\\/schema\\\/person\\\/da69cc3da309893b0d3bc8fcef75f128\"},\"headline\":\"HATEOAS Implementation using RESTFUL Services\",\"datePublished\":\"2023-02-14T16:39:46+00:00\",\"dateModified\":\"2023-02-14T16:39:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/\"},\"wordCount\":397,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/valerio.nu\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/Screenshot-2023-02-11-at-08.43.46-1024x670.png\",\"articleSection\":[\"Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/\",\"url\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/\",\"name\":\"HATEOAS Implementation using RESTFUL Services - Andy&#039;s blog \u2935\ufe0f\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/valerio.nu\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/Screenshot-2023-02-11-at-08.43.46-1024x670.png\",\"datePublished\":\"2023-02-14T16:39:46+00:00\",\"dateModified\":\"2023-02-14T16:39:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/#\\\/schema\\\/person\\\/da69cc3da309893b0d3bc8fcef75f128\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/#primaryimage\",\"url\":\"https:\\\/\\\/valerio.nu\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/Screenshot-2023-02-11-at-08.43.46.png\",\"contentUrl\":\"https:\\\/\\\/valerio.nu\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/Screenshot-2023-02-11-at-08.43.46.png\",\"width\":2452,\"height\":1604},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2023\\\/02\\\/14\\\/hateoas-implementation-using-restful-services\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/valerio.nu\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HATEOAS Implementation using RESTFUL Services\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/#website\",\"url\":\"https:\\\/\\\/valerio.nu\\\/\",\"name\":\"Andy&#039;s blog \u2935\ufe0f\",\"description\":\"Abandon all hope, ye who enter here\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/valerio.nu\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/#\\\/schema\\\/person\\\/da69cc3da309893b0d3bc8fcef75f128\",\"name\":\"andy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g\",\"caption\":\"andy\"},\"sameAs\":[\"https:\\\/\\\/valerio.nu\"],\"url\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/author\\\/giuseppe\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HATEOAS Implementation using RESTFUL Services - Andy&#039;s blog \u2935\ufe0f","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:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/","og_locale":"en_US","og_type":"article","og_title":"HATEOAS Implementation using RESTFUL Services - Andy&#039;s blog \u2935\ufe0f","og_description":"Introduction In this tutorial, we are going to implement HATEOS in our Spring JPA project. In our last series, we discussed the Spring JPA and [&hellip;]","og_url":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/","og_site_name":"Andy&#039;s blog \u2935\ufe0f","article_published_time":"2023-02-14T16:39:46+00:00","article_modified_time":"2023-02-14T16:39:47+00:00","og_image":[{"url":"https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-1024x670.png","type":"","width":"","height":""}],"author":"andy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"andy","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/#article","isPartOf":{"@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/"},"author":{"name":"andy","@id":"https:\/\/valerio.nu\/#\/schema\/person\/da69cc3da309893b0d3bc8fcef75f128"},"headline":"HATEOAS Implementation using RESTFUL Services","datePublished":"2023-02-14T16:39:46+00:00","dateModified":"2023-02-14T16:39:47+00:00","mainEntityOfPage":{"@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/"},"wordCount":397,"commentCount":0,"image":{"@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/#primaryimage"},"thumbnailUrl":"https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-1024x670.png","articleSection":["Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/","url":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/","name":"HATEOAS Implementation using RESTFUL Services - Andy&#039;s blog \u2935\ufe0f","isPartOf":{"@id":"https:\/\/valerio.nu\/#website"},"primaryImageOfPage":{"@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/#primaryimage"},"image":{"@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/#primaryimage"},"thumbnailUrl":"https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46-1024x670.png","datePublished":"2023-02-14T16:39:46+00:00","dateModified":"2023-02-14T16:39:47+00:00","author":{"@id":"https:\/\/valerio.nu\/#\/schema\/person\/da69cc3da309893b0d3bc8fcef75f128"},"breadcrumb":{"@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/#primaryimage","url":"https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46.png","contentUrl":"https:\/\/valerio.nu\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-11-at-08.43.46.png","width":2452,"height":1604},{"@type":"BreadcrumbList","@id":"https:\/\/valerio.nu\/index.php\/2023\/02\/14\/hateoas-implementation-using-restful-services\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/valerio.nu\/"},{"@type":"ListItem","position":2,"name":"HATEOAS Implementation using RESTFUL Services"}]},{"@type":"WebSite","@id":"https:\/\/valerio.nu\/#website","url":"https:\/\/valerio.nu\/","name":"Andy&#039;s blog \u2935\ufe0f","description":"Abandon all hope, ye who enter here","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/valerio.nu\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/valerio.nu\/#\/schema\/person\/da69cc3da309893b0d3bc8fcef75f128","name":"andy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g","caption":"andy"},"sameAs":["https:\/\/valerio.nu"],"url":"https:\/\/valerio.nu\/index.php\/author\/giuseppe\/"}]}},"_links":{"self":[{"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/posts\/306","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/comments?post=306"}],"version-history":[{"count":2,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/posts\/306\/revisions"}],"predecessor-version":[{"id":311,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/posts\/306\/revisions\/311"}],"wp:attachment":[{"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/media?parent=306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/categories?post=306"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/tags?post=306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}