{"id":80,"date":"2019-11-15T17:15:50","date_gmt":"2019-11-15T17:15:50","guid":{"rendered":"https:\/\/www.kindsonthegenius.com\/microservices\/?p=80"},"modified":"2020-02-22T21:41:46","modified_gmt":"2020-02-22T21:41:46","slug":"cqrs-with-axon-tutorial-part-4-build-the-gui-using-vaadin","status":"publish","type":"post","link":"https:\/\/www.kindsonthegenius.com\/microservices\/cqrs-with-axon-tutorial-part-4-build-the-gui-using-vaadin\/","title":{"rendered":"CQRS With Axon Tutorial: Part 4 &#8211; Build the GUI Using Vaadin"},"content":{"rendered":"<p>To be able to test out our service we need some GUI.That is what we would do in this part.<\/p>\n<p>We would cover the following:<\/p>\n<p>&nbsp;<\/p>\n<ol>\n<li><a href=\"#t1\">The GUI we&#8217;ll Build<\/a><\/li>\n<li><a href=\"#t2\">Add a CommandGateway<\/a><\/li>\n<li><a href=\"#t3\">Create an Issue() and Redeem() Panels<\/a><\/li>\n<li><a href=\"#t4\">Create a Layout in the Init() Method<\/a><\/li>\n<li><a href=\"#t5\">Test the Application<\/a><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h5><strong id=\"t1\">1. The GUI we&#8217;ll Build<\/strong><\/h5>\n<p>It is always good to have a sketch of what you want to achieve when building a GUI. Hence, the figure below shows a simple GUI we would build. It is made up of three components.<\/p>\n<ul>\n<li>Issue Panel for sending Issue Commands<\/li>\n<li>Redeem Panel for sending Redeem Commands<\/li>\n<li>Grid to display list of transaction<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-GUI.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-81 size-large aligncenter\" src=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-GUI-1024x536.jpg\" alt=\"\" width=\"640\" height=\"335\" srcset=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-GUI-1024x536.jpg 1024w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-GUI-300x157.jpg 300w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-GUI-768x402.jpg 768w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-GUI.jpg 1042w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>So let&#8217;s get started!<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Important<\/strong><\/span>: Make sure that your vaadin version in your pom.xml is 8.4.1<\/p>\n<p><strong>Step 1:<\/strong> Create a java class in the gui package. Name it GiftCardGUI<\/p>\n<p><strong>Step 2:<\/strong> Make this class extend the Vaadin&#8217;s UI class<\/p>\n<p><strong>Step 3:<\/strong> Implement the init() method (right-click &gt; generate &gt; implement methods<\/p>\n<p><strong>Step 4:<\/strong> Annotate the class with the @SpringUI annotation<\/p>\n<p>&nbsp;<\/p>\n<h5><strong id=\"t2\">2. Add a Command Gateway<\/strong><\/h5>\n<p>A command gateway is used to send commands from the UI to Axon asynchronously. We&#8217;ll do this through constructor injection.<\/p>\n<p><strong>Step 1:<\/strong> Add a private final variable to the class of type CommandGateway<\/p>\n<p><strong>Step 2:<\/strong> Below it, type in the code below: (you can also just click on &#8216;add constructor parameter&#8217;. This displays\u00a0 when you click on the yellow light-bulb that pops up when you hover over the line.<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #008800; font-weight: bold;\">public<\/span> <span style=\"color: #0066bb; font-weight: bold;\">GiftCardGUI<\/span><span style=\"color: #333333;\">(<\/span>CommandGateway commandGateway<span style=\"color: #333333;\">)<\/span> <span style=\"color: #333333;\">{<\/span>\r\n   <span style=\"color: #008800; font-weight: bold;\">this<\/span><span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">commandGateway<\/span> <span style=\"color: #333333;\">=<\/span> commandGateway<span style=\"color: #333333;\">;<\/span>\r\n<span style=\"color: #333333;\">}<\/span>\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h5><strong id=\"t3\">3. Create the Issue and Redeem Panels<\/strong><\/h5>\n<p><strong>Step 1<\/strong>: Copy and paste the code below to create the Issue panel<\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #008800; font-weight: bold;\">private<\/span> Panel <span style=\"color: #0066bb; font-weight: bold;\">issuePanel<\/span><span style=\"color: #333333;\">()<\/span> <span style=\"color: #333333;\">{<\/span>\r\n    <span style=\"color: #888888;\">\/\/Create the text fields and submit button<\/span>\r\n    TextField id <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">new<\/span> TextField<span style=\"color: #333333;\">(<\/span><span style=\"background-color: #fff0f0;\">\"id\"<\/span><span style=\"color: #333333;\">);<\/span>\r\n    TextField amount <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">new<\/span> TextField<span style=\"color: #333333;\">(<\/span><span style=\"background-color: #fff0f0;\">\"amount\"<\/span><span style=\"color: #333333;\">);<\/span>\r\n    Button submit <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">new<\/span> Button<span style=\"color: #333333;\">(<\/span><span style=\"background-color: #fff0f0;\">\"Submit\"<\/span><span style=\"color: #333333;\">);<\/span>\r\n\r\n    <span style=\"color: #888888;\">\/\/Add listener to the button<\/span>\r\n    submit<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">addClickListener<\/span><span style=\"color: #333333;\">(<\/span>event <span style=\"color: #333333;\">-&gt;<\/span> <span style=\"color: #333333;\">{\r\n<\/span>         <span style=\"color: #888888;\">\/\/Create a new IssueCommand using the text inputs<\/span>\r\n        IssueCommand cmd <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">new<\/span> IssueCommand<span style=\"color: #333333;\">(<\/span>\r\n                id<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">getValue<\/span><span style=\"color: #333333;\">(),<\/span>\r\n                Integer<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">parseInt<\/span><span style=\"color: #333333;\">(<\/span>amount<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">getValue<\/span><span style=\"color: #333333;\">())<\/span>\r\n        <span style=\"color: #333333;\">);<\/span>\r\n\r\n        <span style=\"color: #888888;\">\/\/Sent the command to Axon<\/span>\r\n        commandGateway<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">sendAndWait<\/span><span style=\"color: #333333;\">(<\/span>cmd<span style=\"color: #333333;\">);<\/span>\r\n\r\n        <span style=\"color: #888888;\">\/\/Display a success notification<\/span>\r\n        Notification<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">show<\/span><span style=\"color: #333333;\">(<\/span><span style=\"background-color: #fff0f0;\">\"Success\"<\/span><span style=\"color: #333333;\">,<\/span> Notification<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">Type<\/span><span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">HUMANIZED_MESSAGE<\/span><span style=\"color: #333333;\">);<\/span>\r\n    <span style=\"color: #333333;\">});<\/span>\r\n\r\n    <span style=\"color: #888888;\">\/\/Create a form and add the textfields and button<\/span>\r\n    FormLayout form <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">new<\/span> FormLayout<span style=\"color: #333333;\">();<\/span>\r\n    form<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">setMargin<\/span><span style=\"color: #333333;\">(<\/span><span style=\"color: #008800; font-weight: bold;\">true<\/span><span style=\"color: #333333;\">);<\/span>\r\n    form<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">addComponents<\/span><span style=\"color: #333333;\">(<\/span>id<span style=\"color: #333333;\">,<\/span> amount<span style=\"color: #333333;\">,<\/span> submit<span style=\"color: #333333;\">);<\/span>\r\n    \r\n    <span style=\"color: #888888;\">\/\/Add the form to the panel<\/span>\r\n    Panel panel <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">new<\/span> Panel<span style=\"color: #333333;\">(<\/span><span style=\"background-color: #fff0f0;\">\"Issue\"<\/span><span style=\"color: #333333;\">);<\/span>\r\n    panel<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">setContent<\/span><span style=\"color: #333333;\">(<\/span>form<span style=\"color: #333333;\">);<\/span>\r\n\r\n    <span style=\"color: #008800; font-weight: bold;\">return<\/span> panel<span style=\"color: #333333;\">;<\/span>\r\n<span style=\"color: #333333;\">}<\/span>\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Step 2:<\/strong> Copy and paste the code again\u00a0 for the Redeem panel<\/p>\n<p><strong>Step 3:<\/strong> Adjust the content of the second code for the Redeem\u00a0 panel<\/p>\n<p>&nbsp;<\/p>\n<h5><strong id=\"t4\">4. Create a Layout in the Init() Method<\/strong><\/h5>\n<p>We would not create a horizontal layout in the init() method. Then we add the two panels to the layout. Then we also add error handlers.<\/p>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #555555; font-weight: bold;\">@Override<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">protected<\/span> <span style=\"color: #333399; font-weight: bold;\">void<\/span> <span style=\"color: #0066bb; font-weight: bold;\">init<\/span><span style=\"color: #333333;\">(<\/span>VaadinRequest vaadinRequest<span style=\"color: #333333;\">)<\/span> <span style=\"color: #333333;\">{<\/span>\r\n    HorizontalLayout commands <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">new<\/span> HorizontalLayout<span style=\"color: #333333;\">();<\/span>\r\n    commands<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">setSizeFull<\/span><span style=\"color: #333333;\">();<\/span>\r\n    commands<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">addComponents<\/span><span style=\"color: #333333;\">(<\/span>issuePanel<span style=\"color: #333333;\">(),<\/span> redeemPanel<span style=\"color: #333333;\">());<\/span>\r\n\r\n    VerticalLayout layout <span style=\"color: #333333;\">=<\/span> <span style=\"color: #008800; font-weight: bold;\">new<\/span> VerticalLayout<span style=\"color: #333333;\">();<\/span>\r\n    layout<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">setSizeFull<\/span><span style=\"color: #333333;\">();<\/span>\r\n    layout<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">addComponents<\/span><span style=\"color: #333333;\">(<\/span>commands<span style=\"color: #333333;\">);<\/span>\r\n\r\n    setContent<span style=\"color: #333333;\">(<\/span>layout<span style=\"color: #333333;\">);<\/span>\r\n\r\n    <span style=\"color: #888888;\">\/\/Error Handler<\/span>\r\n    setErrorHandler<span style=\"color: #333333;\">(<\/span><span style=\"color: #008800; font-weight: bold;\">new<\/span> DefaultErrorHandler<span style=\"color: #333333;\">(){<\/span>\r\n        <span style=\"color: #555555; font-weight: bold;\">@Override<\/span>\r\n        <span style=\"color: #008800; font-weight: bold;\">public<\/span> <span style=\"color: #333399; font-weight: bold;\">void<\/span> <span style=\"color: #0066bb; font-weight: bold;\">error<\/span><span style=\"color: #333333;\">(<\/span>com<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">vaadin<\/span><span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">server<\/span><span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">ErrorEvent<\/span> event<span style=\"color: #333333;\">)<\/span> <span style=\"color: #333333;\">{<\/span>\r\n            Throwable cause <span style=\"color: #333333;\">=<\/span> event<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">getThrowable<\/span><span style=\"color: #333333;\">();<\/span>\r\n            <span style=\"color: #008800; font-weight: bold;\">while<\/span> <span style=\"color: #333333;\">(<\/span>cause<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">getCause<\/span><span style=\"color: #333333;\">()<\/span> <span style=\"color: #333333;\">!=<\/span> <span style=\"color: #008800; font-weight: bold;\">null<\/span><span style=\"color: #333333;\">)<\/span> cause <span style=\"color: #333333;\">=<\/span> cause<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">getCause<\/span><span style=\"color: #333333;\">();<\/span>\r\n            Notification<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">show<\/span><span style=\"color: #333333;\">(<\/span>cause<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">getMessage<\/span><span style=\"color: #333333;\">(),<\/span> Notification<span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">Type<\/span><span style=\"color: #333333;\">.<\/span><span style=\"color: #0000cc;\">ERROR_MESSAGE<\/span><span style=\"color: #333333;\">);<\/span>\r\n        <span style=\"color: #333333;\">}<\/span>\r\n    <span style=\"color: #333333;\">});<\/span>\r\n<span style=\"color: #333333;\">}<\/span>\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h5><strong id=\"t5\">5. Test the Application<\/strong><\/h5>\n<p>Before you can run the application, you need to first create a run configuration. To do that follow the steps<\/p>\n<p><strong>Step 1:<\/strong> Click on Run in the Menu. Edit Configuration as shown below<\/p>\n<p><a href=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Edit-Configuration-in-IntellIj.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-83 aligncenter\" src=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Edit-Configuration-in-IntellIj-300x146.jpg\" alt=\"\" width=\"300\" height=\"146\" srcset=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Edit-Configuration-in-IntellIj-300x146.jpg 300w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Edit-Configuration-in-IntellIj.jpg 675w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Step 2:<\/strong> In the Run\/Debug Configuration, click on the &#8216;+&#8217; at the upper left corner. Choose Maven from the list. Then enter the settings as shown below<\/p>\n<ul>\n<li>Name: <em>gcdemo [spring-boot:run]<\/em><\/li>\n<li>Command Line: <em>spring-boot:run<\/em><\/li>\n<\/ul>\n<p>The complete setting is shown below<\/p>\n<p><a href=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Run-and-Debug-Configuration.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-84 aligncenter\" src=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Run-and-Debug-Configuration.jpg\" alt=\"\" width=\"665\" height=\"352\" srcset=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Run-and-Debug-Configuration.jpg 859w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Run-and-Debug-Configuration-300x159.jpg 300w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Run-and-Debug-Configuration-768x407.jpg 768w\" sizes=\"auto, (max-width: 665px) 100vw, 665px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Step 3:<\/strong> Click on Ok<\/p>\n<p><strong>Step 4<\/strong>: Run the application by clicking on the Run button<\/p>\n<p><strong>Step 5:<\/strong> Go to <a href=\"#\">http:\/\/localhost:8080<\/a>. You will see the GUI displayed as shown below<\/p>\n<p><a href=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Gui-for-Giftcard.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-85 size-large aligncenter\" src=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Gui-for-Giftcard-1024x554.jpg\" alt=\"\" width=\"640\" height=\"346\" srcset=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Gui-for-Giftcard-1024x554.jpg 1024w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Gui-for-Giftcard-300x162.jpg 300w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Gui-for-Giftcard-768x415.jpg 768w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/Gui-for-Giftcard.jpg 1026w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p><strong>Step 5:<\/strong> Issue and redeem a few giftcards to make sure it works<\/p>\n<p><strong>Step 6:<\/strong> Start the Axon Server. <a href=\"https:\/\/www.kindsonthegenius.com\/microservices\/cqrs-with-axon-tutorial-part-1-introduction-and-setup-in-intellij\/\">See Part 1 for how to start the Axon Server<\/a><\/p>\n<p>The axon server Dashboard is shown below. You can see that our GiftCard application is running as an instance as shown below.<\/p>\n<p><a href=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-Axon-Dashboard.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-86 aligncenter\" src=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-Axon-Dashboard.jpg\" alt=\"\" width=\"503\" height=\"268\" srcset=\"https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-Axon-Dashboard.jpg 646w, https:\/\/www.kindsonthegenius.com\/microservices\/wp-content\/uploads\/sites\/18\/2019\/11\/GiftCard-Axon-Dashboard-300x160.jpg 300w\" sizes=\"auto, (max-width: 503px) 100vw, 503px\" \/><\/a><\/p>\n<p>If you have come this far, then congrats!<\/p>\n<p>In the next part, we would then see how to fetch data and display on the grid.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>To be able to test out our service we need some GUI.That is what we would do in this part. We would cover the following: &hellip; <\/p>\n","protected":false},"author":1,"featured_media":87,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,27],"tags":[33,32,21],"class_list":["post-80","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-axon","category-axonframework","tag-axondashboard","tag-gui","tag-vaadin"],"_links":{"self":[{"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/posts\/80","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/comments?post=80"}],"version-history":[{"count":6,"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/posts\/80\/revisions"}],"predecessor-version":[{"id":173,"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/posts\/80\/revisions\/173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/media\/87"}],"wp:attachment":[{"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/media?parent=80"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/categories?post=80"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kindsonthegenius.com\/microservices\/wp-json\/wp\/v2\/tags?post=80"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}