{"id":26914,"date":"2024-02-27T05:00:00","date_gmt":"2024-02-27T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=26914"},"modified":"2024-04-03T13:41:47","modified_gmt":"2024-04-03T11:41:47","slug":"price-tracker-a-practical-dive-into-serverless-applications","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/en\/price-tracker-a-practical-dive-into-serverless-applications\/","title":{"rendered":"Price Tracker \u2013 a practical dive into serverless applications"},"content":{"rendered":"\n<p>In modern cloud computing, serverless architecture has been a buzzword, yet its practical applications often remain unexplored. This article aims to bridge this gap by demonstrating the development of a Price Tracker web application using serverless technology. Amidst the abundance of theoretical knowledge, the article focuses on a hands-on example to showcase how these concepts come to life in real-world scenarios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Understanding serverless and AWS Cloud essentials<\/strong><\/h2>\n\n\n\n<p>Serverless computing is a transformative cloud computing paradigm that enables developers to build and run applications without managing servers. It focuses on code, not infrastructure, allowing for agility and innovation.<\/p>\n\n\n\n<p>AWS Cloud, a leader in cloud computing, offers a comprehensive ecosystem to implement serverless architecture effectively. Their suite of services includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AWS Lambda,<\/li>\n\n\n\n<li>API Gateway,<\/li>\n\n\n\n<li>and DynamoDB,<\/li>\n<\/ul>\n\n\n\n<p>empowers developers to deploy scalable, highly available, and cost-effective applications. By leveraging AWS, the serverless concept transcends theory, offering a robust platform where it can be applied in the real world to solve complex problems and streamline operations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>About the app<\/strong><\/h2>\n\n\n\n<p>The Price Tracker app is designed for those interested in observing how product prices change over time. It automatically follows the price changes, stores it in the database, and displays this information in visual graphs, offering a clear view of price trends. This tool is handy for educational or personal projects, highlighting the practical application of serverless technology in creating web applications.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/final_view.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-large&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-26901&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:2852,&quot;targetHeight&quot;:1104,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Enlarge image: Fig. 1 Final app view&quot;,&quot;alt&quot;:&quot;Fig. 1 Final app view&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"396\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-1024x396.png\" alt=\"Fig. 1 Final app view\" class=\"wp-image-26901\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-1024x396.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-300x116.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-768x297.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-1536x595.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-2048x793.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge image: Fig. 1 Final app view\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Fig. 1 Final app view<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Architecture overview<\/strong><\/h2>\n\n\n\n<p>The architecture of the Price Tracker application, built on AWS, exemplifies a modern serverless design that leverages the power and flexibility of cloud resources. Below is a visual representation of the architecture, followed by a detailed explanation.&nbsp;<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/architecture_overview.svg&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-large&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-26903&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:&quot;none&quot;,&quot;targetHeight&quot;:&quot;none&quot;,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Enlarge image: Architecture overview&quot;,&quot;alt&quot;:&quot;Architecture overview&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"501\" height=\"476\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/architecture_overview.svg\" alt=\"Architecture overview\" class=\"wp-image-26903\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge image: Architecture overview\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Fig. 2 Architecture overview<\/figcaption><\/figure>\n\n\n\n<p>The system operates through a series of coordinated actions between AWS services to track and manage data:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tracking Lambda<\/strong> \u2013 this function is at the heart of the tracking operation. Its job is to gather and return relevant data about an item, including its value and timestamp.<\/li>\n\n\n\n<li><strong>EventBridge rule <\/strong>\u2013&nbsp;AWS EventBridge is configured with a rule to trigger the Tracking Lambda function at regular intervals. This setup ensures that the item is tracked periodically, making the data collection process consistent and automated.<\/li>\n\n\n\n<li><strong>Handler Lambda<\/strong> \u2013 once the Tracking Lambda function gathers the data, the Handler Lambda function takes over. It processes this data and stores it in a DynamoDB table for persistence. In addition to storage, this function is also responsible for generating visual plots of the tracked data, which it then uploads to an AWS S3 bucket.<\/li>\n\n\n\n<li><strong>Gateway Lambda and API Gateway<\/strong> \u2013 the Gateway Lambda function interfaces with the AWS API Gateway, which acts as the front-end for user interactions. When a user requests the API Gateway, the Gateway Lambda function fetches and displays the relevant data and visualizations from the S3 bucket.<\/li>\n\n\n\n<li><strong>S3 bucket (public)<\/strong> \u2013 the S3 bucket is publicly accessible. This is essential as the API Gateway uses links from this bucket in HTML to display graphs on the webpage. The public setting allows all users to access and download these HTML-formatted graphs.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Hands-on<\/strong><\/h2>\n\n\n\n<p>In this hands-on section, choose between two approaches:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>manual setup of Price Tracker web app via the AWS Management Console (recommended) \u2013 the manual method through the console offers an in-depth, step-by-step understanding, while the script approach allows for a quick and automated setup,<\/li>\n\n\n\n<li>a script-based deployment (experimental) \u2013 a script\u2013based approach is for developers with at least basic knowledge of AWS.<\/li>\n<\/ul>\n\n\n\n<p>Each provides a unique way to experience and interact with the application, catering to different preferences, experiences, and time constraints.<\/p>\n\n\n\n<p>Regardless of which option we choose, the following steps need to be performed:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create policies.<\/li>\n\n\n\n<li>Create roles.<\/li>\n\n\n\n<li>Create a bucket (for more details, see section: Notes regarding S3 bucket).<\/li>\n\n\n\n<li>Create Tracking Lambda.<\/li>\n\n\n\n<li>Create Handler Lambda.<\/li>\n\n\n\n<li>Add Handler Lambda as a destination to Tracking Lambda.<\/li>\n\n\n\n<li>Add the EventBridge rule (start an event every two minutes).<\/li>\n\n\n\n<li>Create Gateway Lambda.<\/li>\n\n\n\n<li>create an HTTP endpoint, route, and integration in AWS Gateway.<\/li>\n\n\n\n<li>Test a page (it can take a few minutes until the graph is generated).<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Requirements<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker, install from&nbsp;<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >docker.com<\/a>.,<\/li>\n\n\n\n<li>AWS Access AWS Management Console:&nbsp;<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/aws.amazon.com\/console\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >link<\/a>&nbsp;(Way 1).,<\/li>\n\n\n\n<li>AWS CLI installed&nbsp;<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/getting-started-install.html\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >link<\/a>&nbsp;and configured&nbsp;<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/getting-started-quickstart.html\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >link<\/a>&nbsp;(Way 2).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Notes regarding the S3 bucket<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The name of an Amazon S3 bucket must be unique across all existing bucket names in Amazon S3 not just within your own AWS account or a specific AWS region. It is a big chance that default name&nbsp;<code>price-tracker-plots<\/code>&nbsp;cannot be use. That is the reason why this name is customizable in app.config file. Keep S3 bucket name consistent in AWS environment and in app.config file. After changing&nbsp;<code>app.config<\/code>&nbsp;file, project should be re-builded.<\/li>\n\n\n\n<li>Bucket need to be public because end user needs to download graphs from it during loading a web page. It is always good practice to remove bucket or at least limit access to it when it is no longer necessary.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Way 1: AWS Management Console<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Download the repository: <code>git clone git@github.com:czczajka\/price-tracker-serverless.git<\/code><\/li>\n\n\n\n<li>Modify bucket name in app.config file (for more details see section: Notes regarding S3 bucket, point 1).<\/li>\n\n\n\n<li>Build all necessary artifacts: <code>.\/scripts\/build.sh<\/code><\/li>\n\n\n\n<li>See the video and reproduce the steps:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Price Tracker Hands-on\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/nhlfUf5ZV1E?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Way 2: Automated, with AWS CLI (experimental)<\/strong><\/h2>\n\n\n\n<p>In second method, we employ a script, which is using AWS CLI to do all the same work in automated way. the script is not yet mature and incorporates\u00a0<code>dirty hacks<\/code>. Nice improvement will be get rid of those sleep commands. As an output from the script, you should receive url, where Price Tracker app is launched.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Note<\/h3>\n\n\n\n<p>To run successfully&nbsp;<code>deploy_aws.sh<\/code>&nbsp;and&nbsp;<code>cleanup_aws.sh<\/code>&nbsp;scripts you need to have AWS CLI access configured. In file&nbsp;<code>policy\/price-tracker-user.json<\/code>&nbsp;is the example policy, which can be attached to the AWS user used for AWS CLI access.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Modify bucket name in app.config file (for more details see section: Notes regarding S3 bucket, point 1).<\/li>\n\n\n\n<li>Run deployment script: <code>.\/scripts\/deploy_aws.sh<\/code><\/li>\n\n\n\n<li>Go to the url (last line outputted from the script) and check if it is working correctly. It can take a couple of minutes before graph will be available.<\/li>\n\n\n\n<li>Run cleanup script: <code>.\/scripts\/cleanup_aws.sh<\/code><\/li>\n\n\n\n<li>It\u2019s good practice to check in AWS Management Console that all services has been removed correctly by cleanup script.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary<\/strong><\/h2>\n\n\n\n<p>The article &#8220;Price Tracker: A Practical Dive into Serverless Applications&#8221; offers a hands-on guide to building a serverless price tracker using AWS. It covers serverless computing fundamentals, AWS Cloud essentials, and a step-by-step walkthrough of creating the application, from setting up AWS services like Lambda and DynamoDB to deploying the final web app.<\/p>\n\n\n\n<p>The tutorial concludes by showcasing the web app interface and demonstrating the practical application of serverless technology in real-world scenarios.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>If you&#8217;re interested in tool development in IT, also take a look <a href=\"https:\/\/sii.pl\/blog\/en\/all\/tools\/\" target=\"_blank\" aria-label=\"at other articles by our authors. (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">at other articles by our authors.<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;26914&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;7&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.9&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.9\\\/5 ( votes: 7)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Price Tracker \u2013 a practical dive into serverless applications&quot;,&quot;width&quot;:&quot;136.6&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 136.6px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.9\/5 ( votes: 7)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>In modern cloud computing, serverless architecture has been a buzzword, yet its practical applications often remain unexplored. This article aims &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/en\/price-tracker-a-practical-dive-into-serverless-applications\/\">Continued<\/a><\/p>\n","protected":false},"author":481,"featured_media":26911,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1320],"tags":[2166,2167,2168,1683,1590],"class_list":["post-26914","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hard-development","tag-pricetracker-en","tag-aws-en","tag-cloud-en","tag-applications","tag-tools"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/Price-Tracker-\u2013-a-practical-dive-into-serverless-applications.jpg","category_names":["Hard development"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/26914"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/users\/481"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/comments?post=26914"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/26914\/revisions"}],"predecessor-version":[{"id":26916,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/26914\/revisions\/26916"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media\/26911"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media?parent=26914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/categories?post=26914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/tags?post=26914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}