{"id":376,"date":"2019-06-06T04:33:00","date_gmt":"2019-06-05T15:33:00","guid":{"rendered":"https:\/\/blog.wiseowls.co.nz\/?p=376"},"modified":"2026-03-08T00:44:43","modified_gmt":"2026-03-07T11:44:43","slug":"custom-routing-in-net-webapi","status":"publish","type":"post","link":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/","title":{"rendered":"Custom Routing in .NET WebAPI"},"content":{"rendered":"\n<p>We all need to do weird things sometimes. One assignment we&#8217;ve got was to implement an API that would totally obfuscate all parameters in a Base64 encoded string. This will clearly go against stock standard routing and action mapping that ASP.NET WebAPI comes with out of the box. But that got us thinking about ways we can achieve it nonetheless.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">By default <\/h2>\n\n\n\n<p>Normally, the router will:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>get the request URI,<\/li><li>match it against given templates (those <code>\"{controller}\/{action}\"<\/code> things), and<\/li><li>invoke an <code>{action}<\/code> on <code>{controller}<\/code> with whatever parameters happen to be passed along<\/li><\/ol>\n\n\n\n<p>Then we realise<\/p>\n\n\n\n<p>We&#8217;re constrained to full .net framework on the project and fancy .net core middleware are not a thing yet. Luckily for us custom&nbsp;<code><a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/web-api\/overview\/advanced\/httpclient-message-handlers\">Message Handler<\/a><\/code> is a thing so theoretically we could bootstrap ourselves through that and override  <code class=\"\">IHttpControllerSelector<\/code> (and potentially <code>IHttpActionSelector<\/code>).  <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setup<\/h2>\n\n\n\n<p>Writing code directly in&nbsp;<code>global.asax<\/code> is an option, but as it calls through to <code>WebApiConfig.Register()<\/code>  by default:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\"> GlobalConfiguration.Configure(WebApiConfig.Register);<\/code><\/pre>\n\n\n\n<p>it&#8217;s probably a better place for things to do with WebAPI.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">App_Start\/WebApiConfig.cs<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            \/\/ Web API configuration and services\n            \/\/ Web API routes\n            config.MessageHandlers.Add(new TestHandler()); \/\/ if you define a handler here it will kick in for ALL requests coming into your WebAPI (this does not affect MVC pages though)\n            config.MapHttpAttributeRoutes();\n            config.Services.Replace(typeof(IHttpControllerSelector), new MyControllerSelector(config)); \/\/ you likely will want to override some more services to ensure your logic is supported, this is one example\n\n            \/\/ your default routes\n            config.Routes.MapHttpRoute(name: \"DefaultApi\", routeTemplate: \"api\/{controller}\/{id}\", defaults: new {id = RouteParameter.Optional});\n\n            \/\/a non-overlapping endpoint to distinguish between requests. you can limit your handler to only kick in to this pipeline\n            config.Routes.MapHttpRoute(name: \"Base64Api\", routeTemplate: \"apibase64\/{query}\", defaults: null, constraints: null\n                \/\/, handler: new TestHandler() { InnerHandler = new HttpControllerDispatcher(config) } \/\/ here's another option to define a handler\n            );\n        }\n    }<\/code><\/pre>\n\n\n\n<p>and then define our handler:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TestHandler.cs<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">    public class TestHandler : DelegatingHandler\n    {\n        protected override async Task&lt;HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n        {\n            \/\/suppose we've got a URL like so: http:\/\/localhost:60290\/api\/VmFsdWVzCg==\n            var b64Encoded = request.RequestUri.AbsolutePath.Remove(0, \"\/apibase64\/\".Length);\n            byte[] data = Convert.FromBase64String(b64Encoded);\n            string decodedString = Encoding.UTF8.GetString(data); \/\/ this will decode to values\n            request.Headers.Add(\"controllerToCall\", decodedString); \/\/ let us say this is the controller we want to invoke\n            HttpResponseMessage resp = await base.SendAsync(request, cancellationToken);\n            return resp;\n        }\n    }<\/code><\/pre>\n\n\n\n<p>Depending on what exactly we want handler to do, we might also have to supply a custom&nbsp;<code>ControllerSelector<\/code>&nbsp;implementation:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">WebApiConfig.cs<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">\/\/ add this line in your Register method\nconfig.Services.Replace(typeof(IHttpControllerSelector), new MyControllerSelector(config));<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MyControllerSelector.cs<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">    public class MyControllerSelector : DefaultHttpControllerSelector\n    {\n        public MyControllerSelector(HttpConfiguration configuration) : base(configuration)\n        {\n        }\n\n        public override string GetControllerName(HttpRequestMessage request)\n        {\n            \/\/this is pretty minimal implementation that examines a header set from TestHandler and returns correct value\n            if (request.Headers.TryGetValues(\"controllerToCall\", out var candidates))\n                return candidates.First();\n            else\n            {\n                return base.GetControllerName(request);\n            }\n        }\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Applying this in real life?<\/h2>\n\n\n\n<p>Pretty neat theory. We however couldn&#8217;t quite figure out a way to take it to our customers that wouldn&#8217;t raise a few questions on whether we&#8217;re doing something shady there.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We all need to do weird things sometimes. One assignment we&#8217;ve got was to implement an API that would totally obfuscate all parameters in a Base64 encoded string. This will clearly go against stock standard routing and action mapping that ASP.NET WebAPI comes with out of the box. But that got us thinking about ways &hellip; <a href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Custom Routing in .NET WebAPI&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":418,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[11],"tags":[12,13,29],"class_list":["post-376","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","tag-c","tag-httpcontext","tag-webapi"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Custom Routing in .NET WebAPI - Timur and associates<\/title>\n<meta name=\"description\" content=\"Custom message handlers in .NET WebAPI to decode Base64-encoded route parameters. When stock routing won&#039;t cut it.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Custom Routing in .NET WebAPI - Timur and associates\" \/>\n<meta property=\"og:description\" content=\"Custom message handlers in .NET WebAPI to decode Base64-encoded route parameters. When stock routing won&#039;t cut it.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/\" \/>\n<meta property=\"og:site_name\" content=\"Timur and associates\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-05T15:33:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-07T11:44:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2020\/03\/technology-computer-desktop-programming-113850_cr-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"timur\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TimurKh\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/\"},\"author\":{\"name\":\"timur\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"headline\":\"Custom Routing in .NET WebAPI\",\"datePublished\":\"2019-06-05T15:33:00+00:00\",\"dateModified\":\"2026-03-07T11:44:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/\"},\"wordCount\":235,\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/technology-computer-desktop-programming-113850_cr-scaled.jpg\",\"keywords\":[\"c#\",\"httpcontext\",\"webapi\"],\"articleSection\":[\"Development\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/\",\"name\":\"Custom Routing in .NET WebAPI - Timur and associates\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/technology-computer-desktop-programming-113850_cr-scaled.jpg\",\"datePublished\":\"2019-06-05T15:33:00+00:00\",\"dateModified\":\"2026-03-07T11:44:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"description\":\"Custom message handlers in .NET WebAPI to decode Base64-encoded route parameters. When stock routing won't cut it.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/technology-computer-desktop-programming-113850_cr-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/technology-computer-desktop-programming-113850_cr-scaled.jpg\",\"width\":2560,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2019\\\/06\\\/06\\\/custom-routing-in-net-webapi\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Custom Routing in .NET WebAPI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\",\"name\":\"Timur and associates\",\"description\":\"Notes of an IT contractor\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\",\"name\":\"timur\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"caption\":\"timur\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/TimurKh\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Custom Routing in .NET WebAPI - Timur and associates","description":"Custom message handlers in .NET WebAPI to decode Base64-encoded route parameters. When stock routing won't cut it.","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:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/","og_locale":"en_US","og_type":"article","og_title":"Custom Routing in .NET WebAPI - Timur and associates","og_description":"Custom message handlers in .NET WebAPI to decode Base64-encoded route parameters. When stock routing won't cut it.","og_url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/","og_site_name":"Timur and associates","article_published_time":"2019-06-05T15:33:00+00:00","article_modified_time":"2026-03-07T11:44:43+00:00","og_image":[{"width":2560,"height":600,"url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2020\/03\/technology-computer-desktop-programming-113850_cr-scaled.jpg","type":"image\/jpeg"}],"author":"timur","twitter_card":"summary_large_image","twitter_creator":"@TimurKh","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/#article","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/"},"author":{"name":"timur","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"headline":"Custom Routing in .NET WebAPI","datePublished":"2019-06-05T15:33:00+00:00","dateModified":"2026-03-07T11:44:43+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/"},"wordCount":235,"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2020\/03\/technology-computer-desktop-programming-113850_cr-scaled.jpg","keywords":["c#","httpcontext","webapi"],"articleSection":["Development"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/","url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/","name":"Custom Routing in .NET WebAPI - Timur and associates","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/#primaryimage"},"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2020\/03\/technology-computer-desktop-programming-113850_cr-scaled.jpg","datePublished":"2019-06-05T15:33:00+00:00","dateModified":"2026-03-07T11:44:43+00:00","author":{"@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"description":"Custom message handlers in .NET WebAPI to decode Base64-encoded route parameters. When stock routing won't cut it.","breadcrumb":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/#primaryimage","url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2020\/03\/technology-computer-desktop-programming-113850_cr-scaled.jpg","contentUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2020\/03\/technology-computer-desktop-programming-113850_cr-scaled.jpg","width":2560,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2019\/06\/06\/custom-routing-in-net-webapi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.wiseowls.co.nz\/"},{"@type":"ListItem","position":2,"name":"Custom Routing in .NET WebAPI"}]},{"@type":"WebSite","@id":"https:\/\/blog.wiseowls.co.nz\/#website","url":"https:\/\/blog.wiseowls.co.nz\/","name":"Timur and associates","description":"Notes of an IT contractor","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.wiseowls.co.nz\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59","name":"timur","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","caption":"timur"},"sameAs":["https:\/\/x.com\/TimurKh"]}]}},"_links":{"self":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/comments?post=376"}],"version-history":[{"count":4,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/376\/revisions"}],"predecessor-version":[{"id":421,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/376\/revisions\/421"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media\/418"}],"wp:attachment":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media?parent=376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/categories?post=376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/tags?post=376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}