{"id":556,"date":"2011-04-25T12:11:06","date_gmt":"2011-04-25T11:11:06","guid":{"rendered":"https:\/\/wade.one\/blog\/?p=556"},"modified":"2011-04-25T12:11:06","modified_gmt":"2011-04-25T11:11:06","slug":"automating-implemented-methods-for-a-web-based-api","status":"publish","type":"post","link":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/","title":{"rendered":"Automating &#8220;Implemented methods&#8221; for a web based API"},"content":{"rendered":"<p>In my <a href=\"https:\/\/twitter.com\/#!\/leedsphp\">leedsphp<\/a> talk last week I mentioned making a developer (and consumers) life easier by automatically implementing the allow methods functionality that your API may expose (e.g. you call PUT on a URL that only allows GET or POST). I did have an example slide there showing how to implement but I thought I&#8217;d posted a bare bones controller here that shows how it works.<\/p>\n<pre style=\"overflow:auto\">abstract class ApiController extends Zend_Rest_Controller\n{\n    \/**\n     * Default head action.\n     *\n     * @internal\n     * @return void\n     *\/\n    public function headAction()\n    {\n        ob_start();\n\n        $this-&gt;getAction();\n\n        ob_get_clean();\n    }\n\n    \/**\n     * Default get action.\n     *\n     * @internal\n     * @return void\n     *\/\n    public function getAction()\n    {\n        $this-&gt;_showAllowedMethods();\n    }\n\n    \/**\n     * Default post action.\n     *\n     * @internal\n     * @return void\n     *\/\n    public function postAction()\n    {\n        $this-&gt;_showAllowedMethods();\n    }\n\n    \/**\n     * Default put action.\n     *\n     * @internal\n     * @return void\n     *\/\n    public function putAction()\n    {\n        $this-&gt;_showAllowedMethods();\n    }\n\n    \/**\n     * Default delete action.\n     *\n     * @internal\n     * @return void\n     *\/\n    public function deleteAction()\n    {\n        $this-&gt;_showAllowedMethods();\n    }\n\n    \/**\n     * Allowed methods output.\n     *\n     * @internal\n     * @return void\n     *\/\n    private function _showAllowedMethods()\n    {\n        $methods = $this-&gt;implementedMethods();\n        $methods = implode(',', $methods);\n        $methods = strtoupper($methods);\n        $this-&gt;_response-&gt;setHeader('Allow', $methods);\n\n        $this-&gt;_forward('method-not-allowed', 'error', 'default'); # I have a methodNotAllowedAction on my ErrorController\n\t\t\t\t\t\t\t           # just for clarity - it does nothing other than headers\n    }\n\n    \/**\n     * Direct call to get implemented methods\n     *\n     * @internal\n     * @return array\n     *\/\n    public function implementedMethods()\n    {\n        if(!isset($this-&gt;_actionController))\n            return array();\n\n        $class              = get_class($this-&gt;_actionController);\n        $oReflector         = new ReflectionClass($class);\n        $methods            = $oReflector-&gt;getMethods(ReflectionMethod::IS_PUBLIC);\n        $implementedMethods = array();\n\n        foreach($methods as $i =&gt; $method) \/* @var $method ReflectionMethod *\/\n        {\n            if($method-&gt;getDeclaringClass()-&gt;getName() == $class)\n                $implementedMethods[] = str_replace('Action', '', $method-&gt;getName());\n        }\n\n        return array_intersect($implementedMethods, array('get', 'put', 'post', 'delete', 'head', 'options', 'trace'));\n    }\n}<\/pre>\n<p>If you extend this controller for all your actions, you&#8217;ll get automated Allow headers every time someone calls a URL that does not implement their request type.<\/p>\n<p>As I said in my talk, be sure to use an op-code cache so reflection doesn&#8217;t become your bottleneck!<\/p>\n<p>Also I should mention, this code lives in my ApiController and not in an action helper or similar due to Zend Framework&#8217;s performance hit as a result of using magic methods.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my leedsphp talk last week I mentioned making a developer (and consumers) life easier by automatically implementing the allow methods functionality that your API may expose (e.g. you call PUT on a URL that only allows GET or POST). I did have an example slide there showing how to implement but I thought I&#8217;d &#8230; <a href=\"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/\" class=\"more-link\">Read More<span class=\"screen-reader-text\"> &#8220;Automating &#8220;Implemented methods&#8221; for a web based API&#8221;<\/span> &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[],"class_list":["post-556","post","type-post","status-publish","format-standard","hentry","category-programming"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Automating &quot;Implemented methods&quot; for a web based API - wade.one<\/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:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automating &quot;Implemented methods&quot; for a web based API - wade.one\" \/>\n<meta property=\"og:description\" content=\"In my leedsphp talk last week I mentioned making a developer (and consumers) life easier by automatically implementing the allow methods functionality that your API may expose (e.g. you call PUT on a URL that only allows GET or POST). I did have an example slide there showing how to implement but I thought I&#8217;d ... Read More &quot;Automating &#8220;Implemented methods&#8221; for a web based API&quot; &raquo;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/\" \/>\n<meta property=\"og:site_name\" content=\"wade.one\" \/>\n<meta property=\"article:published_time\" content=\"2011-04-25T11:11:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1518\" \/>\n\t<meta property=\"og:image:height\" content=\"1506\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Wade\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:site\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Wade\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/\"},\"author\":{\"name\":\"Wade\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/f9dedd948575256e77a44aa1417f63de\"},\"headline\":\"Automating &#8220;Implemented methods&#8221; for a web based API\",\"datePublished\":\"2011-04-25T11:11:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/\"},\"wordCount\":156,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/\",\"name\":\"Automating \\\"Implemented methods\\\" for a web based API - wade.one\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\"},\"datePublished\":\"2011-04-25T11:11:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2011\\\/04\\\/25\\\/automating-implemented-methods-for-a-web-based-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wade.one\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automating &#8220;Implemented methods&#8221; for a web based API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/\",\"name\":\"wade.one\",\"description\":\"wade womersley - york based software engineer\",\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wade.one\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\",\"name\":\"Wade Womersley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"contentUrl\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"width\":202,\"height\":200,\"caption\":\"Wade Womersley\"},\"logo\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/f9dedd948575256e77a44aa1417f63de\",\"name\":\"Wade\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg\",\"caption\":\"Wade\"},\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/author\\\/wade\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Automating \"Implemented methods\" for a web based API - wade.one","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:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/","og_locale":"en_GB","og_type":"article","og_title":"Automating \"Implemented methods\" for a web based API - wade.one","og_description":"In my leedsphp talk last week I mentioned making a developer (and consumers) life easier by automatically implementing the allow methods functionality that your API may expose (e.g. you call PUT on a URL that only allows GET or POST). I did have an example slide there showing how to implement but I thought I&#8217;d ... Read More \"Automating &#8220;Implemented methods&#8221; for a web based API\" &raquo;","og_url":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/","og_site_name":"wade.one","article_published_time":"2011-04-25T11:11:06+00:00","og_image":[{"width":1518,"height":1506,"url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png","type":"image\/png"}],"author":"Wade","twitter_card":"summary_large_image","twitter_creator":"@wadewomersley","twitter_site":"@wadewomersley","twitter_misc":{"Written by":"Wade","Estimated reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/#article","isPartOf":{"@id":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/"},"author":{"name":"Wade","@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/f9dedd948575256e77a44aa1417f63de"},"headline":"Automating &#8220;Implemented methods&#8221; for a web based API","datePublished":"2011-04-25T11:11:06+00:00","mainEntityOfPage":{"@id":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/"},"wordCount":156,"commentCount":0,"publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"articleSection":["Programming"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/","url":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/","name":"Automating \"Implemented methods\" for a web based API - wade.one","isPartOf":{"@id":"https:\/\/wade.one\/blog\/#website"},"datePublished":"2011-04-25T11:11:06+00:00","breadcrumb":{"@id":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wade.one\/blog\/"},{"@type":"ListItem","position":2,"name":"Automating &#8220;Implemented methods&#8221; for a web based API"}]},{"@type":"WebSite","@id":"https:\/\/wade.one\/blog\/#website","url":"https:\/\/wade.one\/blog\/","name":"wade.one","description":"wade womersley - york based software engineer","publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wade.one\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3","name":"Wade Womersley","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","contentUrl":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","width":202,"height":200,"caption":"Wade Womersley"},"logo":{"@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png"}},{"@type":"Person","@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/f9dedd948575256e77a44aa1417f63de","name":"Wade","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg","caption":"Wade"},"url":"https:\/\/wade.one\/blog\/author\/wade\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1172,"url":"https:\/\/wade.one\/blog\/2026\/04\/05\/what-makes-an-api-feel-nice-to-work-with\/","url_meta":{"origin":556,"position":0},"title":"What Makes an API Feel Nice to Work With","author":"Wade","date":"April 5, 2026","format":false,"excerpt":"A good API is not just functional. It is predictable, consistent, and easy to use without a lot of guesswork.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1184,"url":"https:\/\/wade.one\/blog\/2026\/04\/16\/how-i-decide-when-an-api-needs-versioning\/","url_meta":{"origin":556,"position":1},"title":"How I Decide When an API Needs Versioning","author":"","date":"April 16, 2026","format":false,"excerpt":"API versioning is useful when the contract has really changed, not when a team wants a convenient place to hide messy changes. I usually want the compatibility story to be explicit before I reach for a new version.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":573,"url":"https:\/\/wade.one\/blog\/2012\/02\/05\/regular-expression-regex-for-date-part-extractionarray-split\/","url_meta":{"origin":556,"position":2},"title":"Regular Expression (Regex) For Date part extraction\/array split","author":"Wade","date":"February 5, 2012","format":false,"excerpt":"Needed to use this recently to create a specificity parameter for an API at work, it gives you a key\/value array from an ISO date string regardless of what is actually set in the string (e.g. if you give 2011-06-07 04 you'll get an array back as array('year'=>2011, 'month' =>\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":938,"url":"https:\/\/wade.one\/blog\/2015\/07\/06\/cloudant-ibm-query-indexing-arrays-directly-using-erlang\/","url_meta":{"origin":556,"position":3},"title":"Cloudant (IBM) Query &#8211; Indexing arrays directly using Erlang","author":"Wade","date":"July 6, 2015","format":false,"excerpt":"Really short post this one on indexing using Cloudant Query\u00a0to index arrays in your document, e.g. documents that have a field like this: { \"ids\": [ \"alpha\", \"bravo\", \"charlie\" ] } I was reading the documentation and just could not get it to index these items using anything but the\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/wade.one\/blog\/wp-content\/uploads\/2015\/07\/SmJYeZ0r_400x400.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":665,"url":"https:\/\/wade.one\/blog\/2013\/09\/18\/c-mysqldatareader-one-line-function-to-return-a-row-as-an-instance-of-a-class\/","url_meta":{"origin":556,"position":4},"title":"C# MySqlDataReader &#8211; &#8220;one line&#8221; function to return a row as an instance of a class.","author":"Wade","date":"September 18, 2013","format":false,"excerpt":"MySql in C# is rather painless using the MySQL Connector for .net, but one thing it is missing is a no-frills, no extra requirements, no pre-defined ERD return a row as an instance of a class function. Coming from a PHP background, I love the PDO function fetchObject(), it's just\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":629,"url":"https:\/\/wade.one\/blog\/2012\/10\/15\/using-amazon-ec2-with-c-net\/","url_meta":{"origin":556,"position":5},"title":"Using Amazon EC2 with C# .net","author":"Wade","date":"October 15, 2012","format":false,"excerpt":"Amazon's EC2 platform has a very in-depth console which allows you to do a lot, but what if you want to automate some of the processes or handling servers? I've been working with EC2 a lot recently and automating server starting\/stopping based on parameters of the system we use here\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/comments?post=556"}],"version-history":[{"count":0,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/556\/revisions"}],"wp:attachment":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/media?parent=556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/categories?post=556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/tags?post=556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}