{"id":76923,"date":"2018-05-14T13:00:01","date_gmt":"2018-05-14T10:00:01","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=76923"},"modified":"2018-05-14T10:42:52","modified_gmt":"2018-05-14T07:42:52","slug":"rest-using-a-controller-endpoint","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html","title":{"rendered":"REST: Using a Controller endpoint?"},"content":{"rendered":"<p>In general REST architectures, the fundamental concept is a Resource.\u00a0 After Resources, the next thing is to develop a Uniform Interface to these resources, which in HTTP land usually means:<\/p>\n<ul>\n<li>Create is POST<\/li>\n<li>Read is GET<\/li>\n<li>Update is PUT (or PATCH for Partial Update)<\/li>\n<li>Delete is DELETE<\/li>\n<\/ul>\n<p>In the real world, inevitably some operations won&#8217;t map so nicely to resources. This is usually a minority of operations for example reset password. It&#8217;s possible to model these as either<\/p>\n<ul>\n<li>\u00a0a PUT on \/password\/<\/li>\n<\/ul>\n<p>or as<\/p>\n<ul>\n<li>\u00a0a Controller endpoint and a POST to \/resetpassword<\/li>\n<\/ul>\n<p>The latter may be considered to be closer to programmatic REST than pure REST, but there are times when clients and customers will want you to be pragmatic. This article gives suggestions regarding when to consider using the Controller option.<\/p>\n<h2>Does the action Map to a CRUD?<\/h2>\n<p>Several actions in a real world application will not map nicely to a CRUD. For example, Paypal&#8217;s cancel billing agreement API is:<\/p>\n<pre class=\"brush:java\">POST \/v1\/payments\/billing-agreements\/agreement_id\/cancel<\/pre>\n<p>The cancel action rarely maps nicely to a CRUD for a resource. It could be interpreted as:<\/p>\n<ul>\n<li>some resource gets be created (A cancel record)<\/li>\n<li>some resource gets updated (some status column could be getting set to cancelled)<\/li>\n<li>or some resource gets deleted (a order request gets deleted).<\/li>\n<\/ul>\n<p>Why should the client have to care about how cancel is handled?\u00a0 Couldn&#8217;t it always change? In some case API&#8217;s have got around the doesn&#8217;t map nicely to a CRUD problem using HTTP tunneling. In the cancelling a billing agreement this would like:<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">POST \/v1\/payments\/billing-agreements\/agreement_id<\/pre>\n<p>with body:<\/p>\n<pre class=\"brush:java\">{\r\n  \"operation\":\"cancel\"\r\n}<\/pre>\n<p>This is considered an anti-pattern and should never be used. Instead a Controller end point should be used.<\/p>\n<h2>Resource State or Workflow?<\/h2>\n<p>In a REST architecture, every request between Client or Server will usually change a Resource State (write operation) or the Application State (a query or read operation). However, in the real world workflows are inevitable. For example, a reset password flow usually consists of:<\/p>\n<ul>\n<li>Asking the user for the userId (usually email)<\/li>\n<li>System checking that email exists on the system<\/li>\n<li>Sending the user an email with a link to reset the password<\/li>\n<li>Ensuring the user only has a set amount of time to click the link<\/li>\n<li>When the user clicks the link they may be asked a bunch of questions<\/li>\n<li>They will be asked to retype their new password to ensure there&#8217;s no typos<\/li>\n<\/ul>\n<p>When an client action is part of a complex workflow, Resource state and Application state changes may not be easy to model. They may not happen synchronously and they could change based on how the workflow is modelled or when the workflow needs to add an extra step. In such scenarios, consider using a Controller end point.<\/p>\n<h2>REST without PUT<\/h2>\n<p>In some cases, arguments can be made for avoiding PUT and instead using POST to a different endpoint which signifies intent. For example, to change address instead of invoking a PUT to \/address\/, the client would invoke a POST to \/changeaddress and avoid PUTs altogether. The idea here is to have stricter command \/ query separation. See https:\/\/www.thoughtworks.com\/insights\/blog\/rest-api-design-resource-modeling for more information. In general, it is advised to used PUT \/ PATCH for update \/ partial updates and to only use the controller end points when either of the first two reasons apply.<\/p>\n<p>So why there may be subjectivity involved on when to use a controller style endpoint.\u00a0 The above may at least help to you to make a decision.\u00a0 Remember, it should always only be a minority of APIs where you consider this approach. You are outside the conventional Uniform Interface for unique style operations but you want to still make them feel intuitive to clients of the API.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>Published on Java Code Geeks with permission by Alex Staveley, partner at our <a href=\"\/\/www.javacodegeeks.com\/join-us\/jcg\/\" target=\"_blank\" rel=\"noopener\">JCG program<\/a>. See the original article here: <a href=\"http:\/\/dublintech.blogspot.com\/2018\/05\/rest-useing-controller-endpoint.html\" target=\"_blank\" rel=\"noopener\">REST: Useing a Controller endpoint?<\/a><\/p>\n<p>Opinions expressed by Java Code Geeks contributors are their own.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In general REST architectures, the fundamental concept is a Resource.\u00a0 After Resources, the next thing is to develop a Uniform Interface to these resources, which in HTTP land usually means: Create is POST Read is GET Update is PUT (or PATCH for Partial Update) Delete is DELETE In the real world, inevitably some operations won&#8217;t &hellip;<\/p>\n","protected":false},"author":78,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[119,815],"class_list":["post-76923","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-architecture","tag-rest"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>REST: Using a Controller endpoint? - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"In general REST architectures, the fundamental concept is a Resource.\u00a0 After Resources, the next thing is to develop a Uniform Interface to these\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"REST: Using a Controller endpoint? - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"In general REST architectures, the fundamental concept is a Resource.\u00a0 After Resources, the next thing is to develop a Uniform Interface to these\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2018-05-14T10:00:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Alex Staveley\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/dublintech\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alex Staveley\" \/>\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:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html\"},\"author\":{\"name\":\"Alex Staveley\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c36bb99e6c62bd244448ff5b88a5dbb0\"},\"headline\":\"REST: Using a Controller endpoint?\",\"datePublished\":\"2018-05-14T10:00:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html\"},\"wordCount\":659,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"Architecture\",\"REST\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html\",\"name\":\"REST: Using a Controller endpoint? - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2018-05-14T10:00:01+00:00\",\"description\":\"In general REST architectures, the fundamental concept is a Resource.\u00a0 After Resources, the next thing is to develop a Uniform Interface to these\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/05\\\/rest-using-a-controller-endpoint.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"REST: Using a Controller endpoint?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c36bb99e6c62bd244448ff5b88a5dbb0\",\"name\":\"Alex Staveley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c203a6c5693c1d76090c0b37893b409d89a4285f1fee2a545f80068d27a79cd7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c203a6c5693c1d76090c0b37893b409d89a4285f1fee2a545f80068d27a79cd7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c203a6c5693c1d76090c0b37893b409d89a4285f1fee2a545f80068d27a79cd7?s=96&d=mm&r=g\",\"caption\":\"Alex Staveley\"},\"sameAs\":[\"http:\\\/\\\/www.dublintech.blogspot.com\\\/\",\"http:\\\/\\\/www.linkedin.com\\\/pub\\\/alex-staveley\\\/14\\\/977\\\/4a8\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/dublintech\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Alex-Staveley\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"REST: Using a Controller endpoint? - Java Code Geeks","description":"In general REST architectures, the fundamental concept is a Resource.\u00a0 After Resources, the next thing is to develop a Uniform Interface to these","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:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html","og_locale":"en_US","og_type":"article","og_title":"REST: Using a Controller endpoint? - Java Code Geeks","og_description":"In general REST architectures, the fundamental concept is a Resource.\u00a0 After Resources, the next thing is to develop a Uniform Interface to these","og_url":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2018-05-14T10:00:01+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Alex Staveley","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/dublintech","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Alex Staveley","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html"},"author":{"name":"Alex Staveley","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c36bb99e6c62bd244448ff5b88a5dbb0"},"headline":"REST: Using a Controller endpoint?","datePublished":"2018-05-14T10:00:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html"},"wordCount":659,"commentCount":1,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["Architecture","REST"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html","url":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html","name":"REST: Using a Controller endpoint? - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2018-05-14T10:00:01+00:00","description":"In general REST architectures, the fundamental concept is a Resource.\u00a0 After Resources, the next thing is to develop a Uniform Interface to these","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2018\/05\/rest-using-a-controller-endpoint.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"REST: Using a Controller endpoint?"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c36bb99e6c62bd244448ff5b88a5dbb0","name":"Alex Staveley","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c203a6c5693c1d76090c0b37893b409d89a4285f1fee2a545f80068d27a79cd7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c203a6c5693c1d76090c0b37893b409d89a4285f1fee2a545f80068d27a79cd7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c203a6c5693c1d76090c0b37893b409d89a4285f1fee2a545f80068d27a79cd7?s=96&d=mm&r=g","caption":"Alex Staveley"},"sameAs":["http:\/\/www.dublintech.blogspot.com\/","http:\/\/www.linkedin.com\/pub\/alex-staveley\/14\/977\/4a8","https:\/\/x.com\/http:\/\/twitter.com\/dublintech"],"url":"https:\/\/www.javacodegeeks.com\/author\/Alex-Staveley"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/76923","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=76923"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/76923\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=76923"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=76923"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=76923"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}