{"id":244,"date":"2015-10-28T11:15:07","date_gmt":"2015-10-28T10:15:07","guid":{"rendered":"http:\/\/www.bellingo.de\/blog\/?p=244"},"modified":"2015-10-28T11:15:07","modified_gmt":"2015-10-28T10:15:07","slug":"conquestrelay-server-available-on-github","status":"publish","type":"post","link":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/","title":{"rendered":"ConquestRelay Server available on GitHub"},"content":{"rendered":"<p>As promised in my <a href=\"https:\/\/www.bellingo.de\/blog\/?p=197\">August post<\/a> I cleaned up the code for my relay server and uploaded a first version to <a href=\"https:\/\/github.com\/Toadwana\/ConquestRelay\">GitHub<\/a> under the name <em>ConquestRelay<\/em>. It is meant for hobby game developers prototyping their own online games, but still lacks a lot of functionality found in professional network layers.<\/p>\n<p><!--more--><\/p>\n<p>In order to start with the ConquestRelay server just follow <a href=\"https:\/\/github.com\/Toadwana\/ConquestRelay\">this link to the GitHub page<\/a> and either download the whole package as a Zip file or clone the project to your desktop. It contains a copy of the <a href=\"https:\/\/github.com\/sta\/websocket-sharp\">websocket-sharp<\/a> library, a folder with the relay server itself, and a Unity example project.<\/p>\n<p>So what&#8217;s this server good for anyway? As you may have read in my <a href=\"https:\/\/www.bellingo.de\/blog\/?p=197\">previous post<\/a> I am currently working on an online game which I meant to host on a server in the Amazon cloud. However, since I do not own a Unity Pro license I cannot compile a headless server which is necessary for those cloud servers that do not feature a GPU. Therefore, I was looking for a solution where I could host the game on my PC at home while being able to connect to it from anywhere, even with mobile devices. The solution I chose was to use <a href=\"http:\/\/www.websocket.org\/aboutwebsocket.html\">WebSockets<\/a>, and a relay on my cloud instance which connects game server and clients (cf. the diagram above).<\/p>\n<h2>Running the ConquestRelay server<\/h2>\n<p>As long as you are using Visual Studio (I am working with <a href=\"https:\/\/www.bellingo.de\/blog\/free-game-development-with-unity-and-visual-studio\/\">Visual Studio Community 2013<\/a>) compiling the project should be easy. Just open the ConquestRelay.sln file and compile the websocket-sharp library as well as the relay server itself. Since the server only waits for incoming connections of game servers as well as clients, there is no need to configure anything. It currently listens on port 443 which is used for https connections, and should therefore be open in standard firewall configurations. For a first test on your local computer this isn&#8217;t relevant anyway, so just start the ConquestRelay.exe you just generated.<\/p>\n<figure id=\"attachment_252\" aria-describedby=\"caption-attachment-252\" style=\"width: 660px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayScenes.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-252 size-large\" src=\"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayScenes-1024x616.png\" alt=\"Running the game client in Unity\" width=\"660\" height=\"397\" srcset=\"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayScenes-1024x616.png 1024w, https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayScenes-300x181.png 300w, https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayScenes.png 1032w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><figcaption id=\"caption-attachment-252\" class=\"wp-caption-text\">Correct configuration of Build Settings for running the game client with lobby.<\/figcaption><\/figure>\n<p>The folder <em>Unity<\/em> contains an asset package with an example game server and client. After importing this package to Unity you will find three new scenes, GameServer, GameClient and ClientLobby. Build the GameServer scene and run it. Then open the ClientLobby scene. Make sure it is configured as scene 0 in the build settings and the GameClient scene is set as scene 1 (cf. screenshot above). Now run the scene in your editor. You will get a &#8222;list&#8220; with one game server which is ready for new players. Click the join button which will connect you to this server and instantiate a new, empty player object. From here on it&#8217;s mostly up to you. If multiple instances of your client connect to the server, each one will spawn a player object for each other client. Now you can start implementing the insides of your players.<\/p>\n<h2>Where to start coding<\/h2>\n<p>The main class for your game in Unity is <em>WebSocketBase<\/em>. It connects to the ConquestRelay server and provides methods for remote procedure calls (RPCs). It parses system messages from the relay server, but all communication between game server and game clients is done in derived classes (WebSocketServer, WebSocketClient, and WebSocketLobby). The method <em>ParseMessage()<\/em> is central here.<\/p>\n<p>RPCs are passed as strings, where game commands start with the &#8222;Cmd&#8220; prefix, followed by the command name and any parameters, separated by blanks. The <em>ParseMessage()<\/em> method is essentially a sequence of string parsers analyzing these messages. Once you have added a command to this list you can call it using the <em>RPC()<\/em>, <em>ServerRPC()<\/em>, or <em>BroadcastRPC()<\/em> method.<\/p>\n<h2>ConquestRelay and the Cloud<\/h2>\n<p>In order to run the ConquestRelay server in your own cloud instance there is not much you need to do. Upload and start it, then make sure port 443 is not blocked by the firewall. This should be all you need to do. Then note the IP address of your cloud instance and enter it in the Awake() methods of your WebSocketServer, WebSocketClient, and WebSocketLobby classes. For the beginning this should do the trick even for mobile devices.<\/p>\n<h2>Lots of open issues<\/h2>\n<p>As I said above, the ConquestRelay server was only a means for me to get my game running at all, and an exercise for getting acquainted with WebSockets. Naturally, this leaves a lot to be done, and the software is far from being usable in serious projects. Just a few things that obviously need to be addressed:<\/p>\n<ul>\n<li>Binary instead of string messages.<\/li>\n<li>Some kind of security, since now everyone can use your relay server once he finds out your IP address.<\/li>\n<li>Variable IP addresses in case you restart your cloud instance.<\/li>\n<li>Handling of disconnects and reconnects.<\/li>\n<li>Performance optimization, although this method will probably never be suited for online FPS or RTS games.<\/li>\n<li>Documentation. \ud83d\ude09<\/li>\n<\/ul>\n<p>And so on. But if you just want to make your first steps in online game development without any budget at all, give it a try. I would be happy if I was able help.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As promised in my August post I cleaned up the code for my relay server and uploaded a first version to GitHub under the name ConquestRelay. It is meant for hobby game developers prototyping their own online games, but still lacks a lot of functionality found in professional network layers.<\/p>\n","protected":false},"author":1,"featured_media":250,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49,94],"tags":[63,98,100,102,67,69],"class_list":["post-244","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-game-development","category-online-games","tag-aws-en","tag-conquestrelay","tag-online-game","tag-relay-server","tag-unity-en","tag-websocket-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ConquestRelay Server available on GitHub - Games:Tech:Blog<\/title>\n<meta name=\"description\" content=\"The ConquestRelay server connects game servers and clients via a cloud server. Meant as a tool for hobby game devs, it is now available on GitHub.\" \/>\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.bellingo.de\/blog\/conquestrelay-server-available-on-github\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ConquestRelay Server available on GitHub - Games:Tech:Blog\" \/>\n<meta property=\"og:description\" content=\"The ConquestRelay server connects game servers and clients via a cloud server. Meant as a tool for hobby game devs, it is now available on GitHub.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/\" \/>\n<meta property=\"og:site_name\" content=\"Games:Tech:Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-28T10:15:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png\" \/>\n\t<meta property=\"og:image:width\" content=\"867\" \/>\n\t<meta property=\"og:image:height\" content=\"550\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ingo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ingo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/\"},\"author\":{\"name\":\"Ingo\",\"@id\":\"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/82498f8ac21d11f5948cab6d0a9807e9\"},\"headline\":\"ConquestRelay Server available on GitHub\",\"datePublished\":\"2015-10-28T10:15:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/\"},\"wordCount\":848,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/82498f8ac21d11f5948cab6d0a9807e9\"},\"image\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png\",\"keywords\":[\"AWS\",\"ConquestRelay\",\"online game\",\"relay server\",\"Unity\",\"WebSocket\"],\"articleSection\":[\"Game development\",\"Online Games\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/\",\"url\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/\",\"name\":\"ConquestRelay Server available on GitHub - Games:Tech:Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png\",\"datePublished\":\"2015-10-28T10:15:07+00:00\",\"description\":\"The ConquestRelay server connects game servers and clients via a cloud server. Meant as a tool for hobby game devs, it is now available on GitHub.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#primaryimage\",\"url\":\"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png\",\"contentUrl\":\"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png\",\"width\":867,\"height\":550,\"caption\":\"ConquestRelay server connecting game servers and clients via the cloud\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.bellingo.de\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ConquestRelay Server available on GitHub\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.bellingo.de\/blog\/#website\",\"url\":\"https:\/\/www.bellingo.de\/blog\/\",\"name\":\"Games:Tech:Blog\",\"description\":\"A Blog about Games, Technology in Games, and Technology in General\",\"publisher\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/82498f8ac21d11f5948cab6d0a9807e9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.bellingo.de\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/82498f8ac21d11f5948cab6d0a9807e9\",\"name\":\"Ingo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/93a4b9881ee1983f4fafc7e996ce82a42c3a1540c18f7417809c08a19658f167?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/93a4b9881ee1983f4fafc7e996ce82a42c3a1540c18f7417809c08a19658f167?s=96&d=mm&r=g\",\"caption\":\"Ingo\"},\"logo\":{\"@id\":\"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/www.bellingo.de\/blog\/author\/ingo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ConquestRelay Server available on GitHub - Games:Tech:Blog","description":"The ConquestRelay server connects game servers and clients via a cloud server. Meant as a tool for hobby game devs, it is now available on GitHub.","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.bellingo.de\/blog\/conquestrelay-server-available-on-github\/","og_locale":"de_DE","og_type":"article","og_title":"ConquestRelay Server available on GitHub - Games:Tech:Blog","og_description":"The ConquestRelay server connects game servers and clients via a cloud server. Meant as a tool for hobby game devs, it is now available on GitHub.","og_url":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/","og_site_name":"Games:Tech:Blog","article_published_time":"2015-10-28T10:15:07+00:00","og_image":[{"width":867,"height":550,"url":"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png","type":"image\/png"}],"author":"Ingo","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Ingo","Gesch\u00e4tzte Lesezeit":"4\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#article","isPartOf":{"@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/"},"author":{"name":"Ingo","@id":"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/82498f8ac21d11f5948cab6d0a9807e9"},"headline":"ConquestRelay Server available on GitHub","datePublished":"2015-10-28T10:15:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/"},"wordCount":848,"commentCount":0,"publisher":{"@id":"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/82498f8ac21d11f5948cab6d0a9807e9"},"image":{"@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#primaryimage"},"thumbnailUrl":"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png","keywords":["AWS","ConquestRelay","online game","relay server","Unity","WebSocket"],"articleSection":["Game development","Online Games"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/","url":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/","name":"ConquestRelay Server available on GitHub - Games:Tech:Blog","isPartOf":{"@id":"https:\/\/www.bellingo.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#primaryimage"},"image":{"@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#primaryimage"},"thumbnailUrl":"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png","datePublished":"2015-10-28T10:15:07+00:00","description":"The ConquestRelay server connects game servers and clients via a cloud server. Meant as a tool for hobby game devs, it is now available on GitHub.","breadcrumb":{"@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#primaryimage","url":"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png","contentUrl":"https:\/\/www.bellingo.de\/blog\/wp-content\/uploads\/2015\/10\/ConquestRelayDiagram.png","width":867,"height":550,"caption":"ConquestRelay server connecting game servers and clients via the cloud"},{"@type":"BreadcrumbList","@id":"https:\/\/www.bellingo.de\/blog\/conquestrelay-server-available-on-github\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.bellingo.de\/blog\/"},{"@type":"ListItem","position":2,"name":"ConquestRelay Server available on GitHub"}]},{"@type":"WebSite","@id":"https:\/\/www.bellingo.de\/blog\/#website","url":"https:\/\/www.bellingo.de\/blog\/","name":"Games:Tech:Blog","description":"A Blog about Games, Technology in Games, and Technology in General","publisher":{"@id":"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/82498f8ac21d11f5948cab6d0a9807e9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.bellingo.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":["Person","Organization"],"@id":"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/82498f8ac21d11f5948cab6d0a9807e9","name":"Ingo","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/93a4b9881ee1983f4fafc7e996ce82a42c3a1540c18f7417809c08a19658f167?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/93a4b9881ee1983f4fafc7e996ce82a42c3a1540c18f7417809c08a19658f167?s=96&d=mm&r=g","caption":"Ingo"},"logo":{"@id":"https:\/\/www.bellingo.de\/blog\/#\/schema\/person\/image\/"},"url":"https:\/\/www.bellingo.de\/blog\/author\/ingo\/"}]}},"_links":{"self":[{"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/posts\/244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/comments?post=244"}],"version-history":[{"count":7,"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/posts\/244\/revisions"}],"predecessor-version":[{"id":256,"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/posts\/244\/revisions\/256"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/media\/250"}],"wp:attachment":[{"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/media?parent=244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/categories?post=244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bellingo.de\/blog\/wp-json\/wp\/v2\/tags?post=244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}