{"id":2560,"date":"2017-08-17T23:12:46","date_gmt":"2017-08-17T21:12:46","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=2560"},"modified":"2023-06-08T15:38:13","modified_gmt":"2023-06-08T13:38:13","slug":"build-a-serverless-google-home-app","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/08\/17\/build-a-serverless-google-home-app\/","title":{"rendered":"Build a Serverless Google Home App"},"content":{"rendered":"<p>In this blog article, I want to show you how to build your own Google Voice app. For Natural language processing, we will use API.AI. Our backend will run on a Google Cloud function, also called serverless functions, written in nodejs.<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/archetecture.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2565\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/08\/17\/build-a-serverless-google-home-app\/archetecture\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/archetecture.png\" data-orig-size=\"1006,567\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"archetecture\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/archetecture.png\" class=\"alignnone wp-image-2565\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/archetecture-300x169.png\" alt=\"\" width=\"814\" height=\"459\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/archetecture-300x169.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/archetecture-768x433.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/archetecture.png 1006w\" sizes=\"auto, (max-width: 814px) 100vw, 814px\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<h2 id=\"github\">Github<\/h2>\n<p>You can find the whole project here on <a href=\"https:\/\/github.com\/MoritzGruber\/Serverless-Google-Home-App\">Github<\/a><\/p>\n<h2 id=\"frontend\">Frontend<\/h2>\n<p>To speak of frontend seems a little bit off first. Since we don&#8217;t build any visual interface. Nevertheless, our natural language processing interface is the closest unit interacting with the end user.<\/p>\n<p>You can build your own natural language processing unit or use an existing framework such as API.AI. Building on this framework will save us a lot of time.<\/p>\n<h3 id=\"apiai\">API.AI<\/h3>\n<p>So first we want to create a new Project in API.Ai and make our first intent. As an example, we will build a Chuck Norris joke application.<br \/>\nOur application will just need one intent, since its only task is, to tell a joke. Every different task can be represented by an intent.<br \/>\nIn our Intent, we want to list different phrases that a user could use. After configuration your intent should look similar to this:<br \/>\n<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/apiaiintent.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2564\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/08\/17\/build-a-serverless-google-home-app\/apiaiintent\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/apiaiintent.png\" data-orig-size=\"1839,977\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"apiaiintent\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/apiaiintent-1024x544.png\" class=\"alignnone wp-image-2564\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/apiaiintent-300x159.png\" alt=\"\" width=\"685\" height=\"363\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/apiaiintent-300x159.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/apiaiintent-768x408.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/apiaiintent-1024x544.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/apiaiintent.png 1839w\" sizes=\"auto, (max-width: 685px) 100vw, 685px\" \/><\/a><\/p>\n<h3 id=\"category\">Category<\/h3>\n<p>As an advanced feature, we want API.AI to detect a category for a joke if we name one in our sentence. The category will be passed as a variable to our backend application and can be handled as you see later.<\/p>\n<h2 id=\"backend\">Backend<\/h2>\n<p>In general, you could use any regular rest service as the backend for our application. Ranging from a own server over to cloud containers up to serverless functions.<\/p>\n<p>I chosen serverless functions because it is the cheapest option, as well the choice with least configuration needed. You don&#8217;t have to worry about configuring the Google cloud firewall or creating long setup scripts. Furthermore our application won&#8217;t has a balanced load usage, instead, it will be more like some sparks of resource usage. This is why cloud functions are a perfect match.<\/p>\n<p>The downside of the Google Cloud is, you are limited to nodejs. So you can only write your functions in javascript for now. But there other cloud providers, such as IBM Bluemix or AWS that has more diversity in stock.<\/p>\n<p>To collect our jokes we use the free service <a href=\"https:\/\/api.chucknorris.io\/\">api.chucknorris.io<\/a>.<br \/>\nSo my nodejs index file ended up looking like this:<\/p>\n<pre><code class=\"\" data-line=\"\">var request = require(&#039;request&#039;);\n\nexports.agent = function(req, res) {\n    var category;\n    var topics = [&quot;dev&quot;,&quot;movie&quot;,&quot;food&quot;,&quot;celebrity&quot;,&quot;science&quot;,&quot;political&quot;,&quot;sport&quot;,&quot;religion&quot;,&quot;animal&quot;,&quot;music&quot;,&quot;history&quot;,&quot;travel&quot;,&quot;career&quot;,&quot;money&quot;,&quot;fashion&quot;]\n\n    var url = &#039;https:\/\/api.chucknorris.io\/jokes\/random&#039;;\n    var returntext;\n    try {\n\n        var category = req.body.result.parameters.category\n        if(topics.indexOf(category) &gt; -1){\n            url = url + &quot;?category=&quot; + category;\n        }\n        request(url, function (error, response, body) {\n            if(error){\n                console.log(error);\n            } else {\n                returntext = JSON.parse(body).value;\n                return res.json({\n                    speech:  returntext,\n                    displayText:  returntext,\n                    source: &#039;chucknorris-function&#039;\n                });\n            }\n        });\n    } catch (error) {\n        console.log(&#039;Error extracting req: &#039;+ error);\n        return res.json({\n                    speech:  &quot;error&quot;,\n                    displayText:  &quot;error&quot;,\n                    source: &#039;chucknorris-function&#039;\n                });\n    }\n};\n<\/code><\/pre>\n<h3 id=\"deploy\">Deploy<\/h3>\n<p>To deploy this function you need to be logged in in you Google Cloud. If needed use:<\/p>\n<pre><code class=\"\" data-line=\"\">gsutil init\n<\/code><\/pre>\n<p>If you haven&#8217;t created a bucket yet, you can create one with:<\/p>\n<pre><code class=\"\" data-line=\"\">gsutil mb -p chucknorrisjokes-174821 gs:\/\/chucknorrisjokes \n<\/code><\/pre>\n<p>After that you can deploy your function to this bucket with:<\/p>\n<pre><code class=\"\" data-line=\"\">gcloud beta functions deploy agent --stage-bucket chucknorrisjokes --trigger-http \n<\/code><\/pre>\n<p><em>The word <strong>agent<\/strong> is representing the function name in your index.js file<\/em><\/p>\n<h3 id=\"connecttoapiai\">Connect to API.AI<\/h3>\n<p>The CLI will return a URL, you need to link this with you API.AI project. And don&#8217;t forget to enable the webhook in your intent.<br \/>\n<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/webhook.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2567\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/08\/17\/build-a-serverless-google-home-app\/webhook\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/webhook.png\" data-orig-size=\"1836,976\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"webhook\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/webhook-1024x544.png\" class=\"alignnone wp-image-2567\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/webhook-300x159.png\" alt=\"\" width=\"689\" height=\"365\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/webhook-300x159.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/webhook-768x408.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/webhook-1024x544.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/webhook.png 1836w\" sizes=\"auto, (max-width: 689px) 100vw, 689px\" \/><\/a><\/p>\n<h2 id=\"testinganddevelopment\">Testing and Development<\/h2>\n<h3 id=\"emulator\">Emulator<\/h3>\n<p>You might have noticed that uploading you function took up to 2 minutes. That&#8217;s why there is a local emulator for Google Cloud functions. You can find an <a href=\"https:\/\/cloud.google.com\/functions\/docs\/emulator\">instruction<\/a> for installation of it here.<br \/>\nYou can run your function locally with:<\/p>\n<pre><code class=\"\" data-line=\"\">functions deploy agent --trigger-http\n<\/code><\/pre>\n<h3 id=\"ngrok\">ngrok<\/h3>\n<p>Normally we can&#8217;t talk straight to our localhost from API.AI. That&#8217;s why we use the tunneling service <a href=\"https:\/\/ngrok.com\/\">ngrok<\/a> to open up our local function to API.AI.<br \/>\nStart ngrok with:<\/p>\n<pre><code class=\"\" data-line=\"\">ngrok http 8010\n<\/code><\/pre>\n<p>We just have to replace the webhook URL with URL we get from ngrok. The URL should then look similar to this:<\/p>\n<p><em>https:\/\/ca87c845.ngrok.io\/chucknorrisjokes-c090c\/us-central1\/agent<\/em><\/p>\n<h3 id=\"conclusion\">Conclusion<\/h3>\n<p>I personally see much potential in serverless functions and will consider them for future projects. It is not the easiest way to develop with beta tools but definitely exciting and worth a shot to try out.<\/p>\n<p>Thanks for reading through my post. For feedback or questions feel free to contact me.<\/p>\n<h4 id=\"cheers\">Cheers!<\/h4>\n<h4 id=\"moritzgrubermg166\">Moritz Gruber<\/h4>\n<p><a href=\"http:\/\/moritzgruber.me\">Website<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/MoritzGruber\">Github<\/a><\/p>\n<p><a href=\"https:\/\/twitter.com\/movCode\">Twitter<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this blog article, I want to show you how to build your own Google Voice app. For Natural language processing, we will use API.AI. Our backend will run on a Google Cloud function, also called serverless functions, written in nodejs.<\/p>\n","protected":false},"author":486,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,649,653,22],"tags":[],"ppma_author":[726],"class_list":["post-2560","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-interactive-media","category-mobile-apps","category-student-projects"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":25893,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/entwickeln-einer-edge-anwendung-mit-cloudflare\/","url_meta":{"origin":2560,"position":0},"title":"Entwickeln einer Edge-Anwendung mit Cloudflare","author":"Jens Schlegel","date":"15. September 2023","format":false,"excerpt":"Einleitung Englisch spielt eine gro\u00dfe Rolle in meinem Beruf und Alltag, doch immer noch passieren mir Grammatikfehler. Um meine Englischkenntnisse zu verbessern, habe ich eine kleine Webseite entwickelt, auf der das Schreiben von englischen S\u00e4tzen ge\u00fcbt werden kann. Dem Nutzer wird ein Satz pr\u00e4sentiert, der dann in die festgelegte Sprache\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/SCR-20230817-rdek_1694731446844_0.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/SCR-20230817-rdek_1694731446844_0.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/SCR-20230817-rdek_1694731446844_0.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/SCR-20230817-rdek_1694731446844_0.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":21653,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/17\/studidash-a-serverless-web-application\/","url_meta":{"origin":2560,"position":1},"title":"&#8220;Studidash&#8221; | A serverless web application","author":"dk119","date":"17. September 2021","format":false,"excerpt":"by Oliver Klein (ok061), Daniel Koch (dk119), Luis B\u00fchler (lb159), Micha Huhn (mh334) Abstract You are probably familiar with the HdM SB-Funktionen. After nearly four semesters we were tired of the boring design and decided to give it a more modern look with a bit more functionality then it currently\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/grafik-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/grafik-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/grafik-1.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":25865,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/","url_meta":{"origin":2560,"position":2},"title":"Guess What? We Built a Web Game with Firebase","author":"mc071","date":"15. September 2023","format":false,"excerpt":"What is more or less? \"More or Less\" is a guessing game where you guess which item has a higher value for a specific attribute. For example, in the \"Commit Clash: Which GitHub repo has more commits?\" mode, you see one GitHub repository's commit count and another repository. You have\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/1_guessing_game.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/1_guessing_game.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/1_guessing_game.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/1_guessing_game.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/1_guessing_game.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":28084,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/09\/14\/springboot-zu-serverless-probleme-und-paradigmen\/","url_meta":{"origin":2560,"position":3},"title":"Springboot zu Serverless: Probleme und Paradigmen","author":"Julian Schniepp","date":"14. September 2025","format":false,"excerpt":"Im Rahmen der Vorlesung \u201eSoftware Development for Cloud\u00a0Computing\u201c sollte jedes Team ein eigenes Cloud\u2011Projekt umsetzen. Unser Projekt Taskflow sollte dabei ein serverloses Todo\u2011Management\u2011System werden. Ziel war es dabei, neue und vor allem industrierelevante Cloud\u2011Technologien praktisch zu erlernen. Der Backend\u2011Teil ist mit Spring\u2011Boot realisiert, welcher \u00fcber AWS\u00a0Lambda und API\u00a0Gateway bereitgestellt modular\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":25708,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/07\/chatscape-scalable-serverless-chat\/","url_meta":{"origin":2560,"position":4},"title":"ChatScape &#8211; Scalable Serverless Chat","author":"Pojtinger Felicitas","date":"7. September 2023","format":false,"excerpt":"Introduction The corresponding repository containing our code can be found publicly on GitHub Since there are at least a quintillion chat applications out there, we thought that we\u2019d do no harm in releasing another one. ChatScape is a chat application, designed as a hands-on approach to dive deep into AWS.\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":21693,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/20\/recall-trainer-eine-serverless-web-app-mit-aws\/","url_meta":{"origin":2560,"position":5},"title":"Recall Trainer &#8211;  Eine serverless Web-App mit AWS","author":"lr066","date":"20. September 2021","format":false,"excerpt":"Einleitung Im Rahmen der Vorlesung \u201cSoftware Development for Cloud Computing\u201d habe ich im vergangenen Semester eine Einf\u00fchrung in die Welt des Cloud Computings incl. der relevanten Konzepte und Technologien erhalten. Einige dieser Konzepte habe ich versucht in meinem Abschlussprojekt umzusetzen, das ich im Nachfolgenden vorstellen m\u00f6chte.\u00a0 Idee\/Projekt Die Idee war\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":726,"user_id":486,"is_guest":0,"slug":"mg166","display_name":"mg166@hdm-stuttgart.de","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f9a93f52325d5f9d19f265bcb0374926406fe5ae7f28165e1955221e8593288e?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/2560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/486"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=2560"}],"version-history":[{"count":10,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/2560\/revisions"}],"predecessor-version":[{"id":24722,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/2560\/revisions\/24722"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=2560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=2560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=2560"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=2560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}