{"id":2731,"date":"2007-01-31T11:10:29","date_gmt":"2007-01-31T10:10:29","guid":{"rendered":"http:\/\/blog.jteam.nl\/?p=2731"},"modified":"2007-01-31T11:10:29","modified_gmt":"2007-01-31T10:10:29","slug":"spring-dwr-ajax-made-easy","status":"publish","type":"post","link":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/","title":{"rendered":"Spring and DWR &#8211; Ajax made Easy"},"content":{"rendered":"<p><a href=\"http:\/\/www.directwebremoting.org\/\">Direct Web Remoting (DWR)<\/a> is an Open Source initiative that provides easy Ajax for Java. Besides being the best Ajax framework for Java developers, it has one more big feature, at least in my opinion. It integrates very nicely with Spring, by provides the means to easily remote your spring-managed beans to JavaScript. However, up until now there has always been a very loose coupling between the DWR configuration and the Spring configuration. For more information on how DWR was configured to work with Spring in the past see one of my <a href=\"\/2005\/04\/24\/your-first-cup-of-dwr\/\">earlier post on using DWR in conjunction with Spring<\/a> (note that it is fairly outdated).<\/p>\n<p><!--more--><\/p>\n<h3>Configure DWR in Spring<\/h3>\n<p>Joe and I are pleased to announce that a new configuration mechanism is available when using DWR in conjunction with Spring. Using the new namespace support provided by Spring 2.0 it is possible to incorporate the DWR configuration you would normally configure in your <code>dwr.xml<\/code>, into your Spring configuration. This means that when using Spring you will no longer need to create a separate <code>dwr.xml<\/code>, but configure DWR entirely in Spring instead. Next to eliminating the need for an extra configuration file, it also provides a tight coupling between the bean(s) you want to remote and the DWR configuration. Previously this was done by specifying the name\/id of the bean you wanted to remote in your DWR configuration. As you will see in a moment, you can now specify the fact that you want to remote a certain bean directly onto that specific bean. This leads to a much more intuitive, readable and maintainable configuration. Two other advantages of using this new way of configuration are that first of all this eliminates the problems we had when directly remoting proxied beans (e.g. transactional services) and secondly eliminates the limitation we had in the past that you could only remote beans that were loaded by a <code>ContextLoaderListener<\/code> and not those defined in your <code>xxx-servlet.xml<\/code>.<\/p>\n<p>Of course you do not need to use this new configuration mechanism, you can choose to keep using the old way of configuring DWR. But if you take a look at the new mechanism, I am fairly sure that you will be just as enthusiastic as I am about this new feature!<\/p>\n<p>Please note that the DWR namespace is only available when using DWR version 2.0-rc2 or higher. It is also heavily dependent on the namespace support provided by Spring 2.0, so you need to include this on your classpath as well (preferably the latest version, currently 2.0.2).<\/p>\n<p>Enough talk, let us have a look at sample configuration. Assume the following Spring configuration file:<\/p>\n<p><pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;br&gt;\n&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br&gt;\n&amp;lt;beans xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;&lt;br&gt;\n       xsi:schemaLocation=&quot;http:\/\/www.springframework.org\/schema\/beans&lt;br&gt;\n       http:\/\/www.springframework.org\/schema\/beans\/spring-beans-2.0.xsd&quot;&gt;&lt;br&gt;\n  &amp;lt;bean id=&quot;myService&quot; class=&quot;example.MyServiceImpl&quot;&amp;gt;&lt;br&gt;\n    &amp;lt;property name=&quot;dao&quot; ref=&quot;myDao&quot;\/&amp;gt;&lt;br&gt;\n  &amp;lt;\/bean&amp;gt;&lt;br&gt;\n&amp;lt;\/beans&amp;gt;&lt;br&gt;\n<\/pre><\/p>\n<p>First of all, note that we are using the Spring namespace support in the header of the XML document instead of the Spring DTD. This is something which is available since Spring 2.0 and is inherent to using the namespace support. The ajaxFacade bean is just an ordinary bean configured in Spring which has a reference to some Data Access Object (DAO) defined in another application context.<\/p>\n<p>Now, we decide we want to remote this bean to JavaScript using DWR. In that case we need to include the DWR namespace into the header of the document. To include it we change the header to the following:<\/p>\n<p><pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;br&gt;\n&amp;lt;beans xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;&lt;br&gt;\n       xmlns:dwr=&quot;http:\/\/www.directwebremoting.org\/schema\/spring-dwr&quot;&lt;br&gt;\n       xsi:schemaLocation=&quot;http:\/\/www.springframework.org\/schema\/beans&lt;br&gt;\n       http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd&lt;br&gt;\n       http:\/\/www.directwebremoting.org\/schema\/spring-dwr&lt;br&gt;\n       http:\/\/www.directwebremoting.org\/schema\/spring-dwr-2.0.xsd&quot;&gt;&lt;br&gt;\n<\/pre><\/p>\n<p>First of all you need to define the XML namespace (xmlns) by providing an alias, in this case <code>dwr<\/code> and link it to the URI of the schema. Note that the <code>dwr<\/code> alias can be replaced with anything you want as long as you use your alias in the next examples instead of the <code>dwr<\/code> one. Changing <code>xmlns:dwr<\/code> to <code>xmlns:otheralias<\/code> is all you need to do to change the alias.<\/p>\n<p>Alright, so far for the \u201chard\u201d part, everything from here will be easy <\/p>\n<p>If you have an IDE with XML schema support (e.g. IntelliJ and Eclipse) you should navigate inside the <code>myService<\/code> bean and use the autocomplete functionality to show you all available tags provided by the DWR namespace.<\/p>\n<p>Choose the <code>dwr:remote<\/code> tag and you will see that the IDE will automatically prompt you for the javascript name to use for exposing the bean. Note that the <code>dwr:remote<\/code> tag should be a nested tag of the myService bean. So now, the bean <code>myService<\/code> bean definition should look like the following:<\/p>\n<p><pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;br&gt;\n&amp;lt;bean id=&quot;myService&quot; class=&quot;example.MyServiceImpl&quot;&amp;gt;&lt;br&gt;\n  &amp;lt;dwr:remote javascript=&quot;MyAjaxService&quot;\/&amp;gt;&lt;br&gt;\n  &amp;lt;property name=&quot;dao&quot; ref=&quot;myDao&quot;\/&amp;gt;&lt;br&gt;\n&amp;lt;\/bean&amp;gt;&lt;br&gt;\n<\/pre><\/p>\n<p>Now, that is all there is to it to configure DWR to remote the <code>myService<\/code> bean under the JavaScript name \u201cMyAjaxService\u201d. However, we do need to somehow expose DWR to the outside world. Here you have two possibilities where the choice is mostly dependent on whether you are using Spring MVC for your web application in which case you should go with the <code>DwrController<\/code> or using any other web framework then go with the <code>DwrSpringServlet<\/code>.<\/p>\n<h3>DwrController<\/h3>\n<p>If you are already using Spring MVC the <code>DwrController<\/code> is the most obvious choice. You will benefit from a number of services provided to you by Spring MVC, like localization support. The <code>DwrController<\/code> is a normal Spring controller which has a property that takes the DWR configuration as a property. The easiest way to use this controller is again use a tag provided by the DWR namespace:<\/p>\n<p><pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;br&gt;\n&amp;lt;dwr:controller id=&quot;dwrController&quot; debug=&quot;true&quot;\/&amp;gt;&lt;br&gt;\n<\/pre><\/p>\n<p>Note that the <code>debug<\/code> property is optional and defaults to <code>false<\/code>. Make sure to map this controller to the path where you want to expose DWR, normally <code>\/dwr<\/code>.<\/p>\n<h3>DwrSpringServlet<\/h3>\n<p>In case you are not using Spring MVC, you can still use the configuration mechanism introduced here. Just define the <code>org.directwebremoting.spring.DwrSpringServlet<\/code> in your <code>web.xml<\/code> and map it to the <code>\/dwr\/*<\/code> path. The servlet will automatically retrieve its configuration from the Spring bean container loaded by the <code>ContextLoaderListener<\/code>.<\/p>\n<p><pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;br&gt;\n&amp;lt;servlet&amp;gt;&lt;br&gt;\n  &amp;lt;servlet-name&amp;gt;dwr&amp;lt;\/servlet-name&amp;gt;&lt;br&gt;\n  &amp;lt;servlet-class&amp;gt;org.directwebremoting.spring.DwrSpringServlet&amp;lt;\/servlet-class&amp;gt;&lt;br&gt;\n  &amp;lt;init-param&amp;gt;&lt;br&gt;\n    &amp;lt;param-name&amp;gt;debug&amp;lt;\/param-name&amp;gt;&lt;br&gt;\n    &amp;lt;param-value&amp;gt;true&amp;lt;\/param-value&amp;gt;&lt;br&gt;\n  &amp;lt;\/init-param&amp;gt;&lt;br&gt;\n&amp;lt;\/servlet&amp;gt;&lt;\/p&gt;\n&lt;p&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br&gt;\n  &amp;lt;servlet-name&amp;gt;dwr&amp;lt;\/servlet-name&amp;gt;&lt;br&gt;\n  &amp;lt;url-pattern&amp;gt;\/dwr\/*&amp;lt;\/url-pattern&amp;gt;&lt;br&gt;\n&amp;lt;\/servlet-mapping&amp;gt;&lt;br&gt;\n<\/pre><\/p>\n<p>I have uploaded a sample skeleton application, which should get you started with using these new features:<\/p>\n<p><a href=\"http:\/\/blog.jteam.nl\/wp-content\/uploads\/2010\/12\/dwr-sample.zip\">DWR-Spring skeleton application<\/a><\/p>\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/bit.ly\/3BAo305\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"256\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png\" alt=\"\" class=\"wp-image-20303\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png 1024w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-300x75.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-768x192.png 768w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1536x384.png 1536w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-2048x512.png 2048w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1920x480.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Direct Web Remoting (DWR) is an Open Source initiative that provides easy Ajax for Java. Besides being the best Ajax framework for Java developers, it has one more big feature, at least in my opinion. It integrates very nicely with Spring, by provides the means to easily remote your spring-managed beans to JavaScript. However, up [&hellip;]<\/p>\n","protected":false},"author":22,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[10],"tags":[117,118,70],"class_list":["post-2731","post","type-post","status-publish","format-standard","hentry","category-development","tag-ajax","tag-dwr","tag-spring"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring and DWR - Ajax made Easy - Trifork 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:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring and DWR - Ajax made Easy - Trifork Blog\" \/>\n<meta property=\"og:description\" content=\"Direct Web Remoting (DWR) is an Open Source initiative that provides easy Ajax for Java. Besides being the best Ajax framework for Java developers, it has one more big feature, at least in my opinion. It integrates very nicely with Spring, by provides the means to easily remote your spring-managed beans to JavaScript. However, up [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/\" \/>\n<meta property=\"og:site_name\" content=\"Trifork Blog\" \/>\n<meta property=\"article:published_time\" content=\"2007-01-31T10:10:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png\" \/>\n<meta name=\"author\" content=\"Bram Smeets\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Bram Smeets\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/\",\"url\":\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/\",\"name\":\"Spring and DWR - Ajax made Easy - Trifork Blog\",\"isPartOf\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png\",\"datePublished\":\"2007-01-31T10:10:29+00:00\",\"author\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/a4c4fd4f94ab0974a08b2ee382fd3841\"},\"breadcrumb\":{\"@id\":\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#primaryimage\",\"url\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png\",\"contentUrl\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/trifork.nl\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring and DWR &#8211; Ajax made Easy\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/trifork.nl\/blog\/#website\",\"url\":\"https:\/\/trifork.nl\/blog\/\",\"name\":\"Trifork Blog\",\"description\":\"Keep updated on the technical solutions Trifork is working on!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/trifork.nl\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/a4c4fd4f94ab0974a08b2ee382fd3841\",\"name\":\"Bram Smeets\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8281f54c4a011d16a05764251cf11d26?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8281f54c4a011d16a05764251cf11d26?s=96&d=mm&r=g\",\"caption\":\"Bram Smeets\"},\"url\":\"https:\/\/trifork.nl\/blog\/author\/bram\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring and DWR - Ajax made Easy - Trifork 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:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/","og_locale":"en_US","og_type":"article","og_title":"Spring and DWR - Ajax made Easy - Trifork Blog","og_description":"Direct Web Remoting (DWR) is an Open Source initiative that provides easy Ajax for Java. Besides being the best Ajax framework for Java developers, it has one more big feature, at least in my opinion. It integrates very nicely with Spring, by provides the means to easily remote your spring-managed beans to JavaScript. However, up [&hellip;]","og_url":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/","og_site_name":"Trifork Blog","article_published_time":"2007-01-31T10:10:29+00:00","og_image":[{"url":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png","type":"","width":"","height":""}],"author":"Bram Smeets","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Bram Smeets","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/","url":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/","name":"Spring and DWR - Ajax made Easy - Trifork Blog","isPartOf":{"@id":"https:\/\/trifork.nl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#primaryimage"},"image":{"@id":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#primaryimage"},"thumbnailUrl":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png","datePublished":"2007-01-31T10:10:29+00:00","author":{"@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/a4c4fd4f94ab0974a08b2ee382fd3841"},"breadcrumb":{"@id":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#primaryimage","url":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png","contentUrl":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png"},{"@type":"BreadcrumbList","@id":"https:\/\/trifork.nl\/blog\/spring-dwr-ajax-made-easy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/trifork.nl\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring and DWR &#8211; Ajax made Easy"}]},{"@type":"WebSite","@id":"https:\/\/trifork.nl\/blog\/#website","url":"https:\/\/trifork.nl\/blog\/","name":"Trifork Blog","description":"Keep updated on the technical solutions Trifork is working on!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/trifork.nl\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/a4c4fd4f94ab0974a08b2ee382fd3841","name":"Bram Smeets","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8281f54c4a011d16a05764251cf11d26?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8281f54c4a011d16a05764251cf11d26?s=96&d=mm&r=g","caption":"Bram Smeets"},"url":"https:\/\/trifork.nl\/blog\/author\/bram\/"}]}},"_links":{"self":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/2731","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/comments?post=2731"}],"version-history":[{"count":0,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/2731\/revisions"}],"wp:attachment":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media?parent=2731"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/categories?post=2731"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/tags?post=2731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}