{"id":15864,"date":"2018-06-19T17:51:52","date_gmt":"2018-06-20T00:51:52","guid":{"rendered":"https:\/\/devwww.3cloudsolutions.com\/post\/power-bi-report-server-devops-2\/"},"modified":"2024-04-17T08:46:23","modified_gmt":"2024-04-17T15:46:23","slug":"power-bi-report-server-devops","status":"publish","type":"post","link":"https:\/\/3cloudsolutions.com\/resources\/power-bi-report-server-devops\/","title":{"rendered":"Power BI Report Server DevOps"},"content":{"rendered":"<h2><strong>Managing your Report Server via PowerShell<\/strong><\/h2>\n<p>We have written several blog posts that explain <a href=\"https:\/\/www.blue-granite.com\/blog\/introducing-power-bi-report-server\">what Power BI Report Server (PBIRS) is<\/a>, how to acquire it, how it can <a href=\"https:\/\/www.blue-granite.com\/blog\/power-bi-report-server-revisited\">modernize your on-premises BI solution<\/a>, and how it supplements <a href=\"https:\/\/powerbi.microsoft.com\/en-us\/power-bi-premium\/\">Power BI Premium<\/a> implementations as a component of a <a href=\"https:\/\/www.blue-granite.com\/blog\/power-bi-report-server-hybrid-implementation\">hybrid BI solution<\/a>. What we haven\u2019t discussed are strategies around managing and deploying various PBIRS assets.<\/p>\n<p>PBIRS can be thought of as a superset of SQL Server Reporting Services (SSRS). Therefore, traditional SSRS, Mobile, Key Performance Indicators (KPIs), and Excel-based reports can all be hosted alongside your Power BI reports. With this post, we will describe a large-scale PBIRS implementation we have been working on for a client, as well as some useful DevOps strategies we\u2019ve implemented along the way.<\/p>\n<p><!--more--><\/p>\n<p><img decoding=\"async\" style=\"width: 805px;\" src=\"https:\/\/3cloudsolutions.com\/wp-content\/uploads\/2022\/11\/PBIRS-DevOps-1.png\" alt=\"PBIRS DevOps\" width=\"805\" \/><\/p>\n<h2>Background<\/h2>\n<p>We began collaborating with a client on a brand-new data warehouse last year. BlueGranite partnered with the company to implement everything from overall architecture and design, ETL, and semantic modeling, to development of reports and scorecards. Reporting assets included Power BI, traditional paginated (SSRS), and Excel-based reports. Once we empowered the company\u2019s key stakeholders with self-service business intelligence they grew excited about Power BI development, and began to create their own Power BI reports against the SSAS tabular models we developed.<\/p>\n<p>Due to the complexity of underlying Data Analysis Expressions (DAX) queries, BlueGranite continues supporting our client with ongoing SSRS report development. Today, we maintain three reporting environments (Development, UAT, and Production) with 50+ SSRS reports we developed, along with 50+ Power BI reports developed largely by business users. You can probably imagine, from a DevOps standpoint, the potential for headache.<\/p>\n<p><em>NOTE: We are not using Mobile Reports and KPIs as part of our solution.<\/em><\/p>\n<p>Traditional SSRS development leverages SQL Server Data Tools (SSDT) as a development environment to maintain an overall reporting solution, as well as provide a simple deployment interface for SSRS projects.\u00a0 However, Power BI and Excel-based reports aren\u2019t natively developed and maintained within SSDT. Each type of report has its own client development environment (Power BI Desktop and Excel, respectively) and is maintained as an individual object, as opposed to SSRS reports that are maintained as part of a larger project. From a deployment standpoint, this means they must be manually uploaded\/downloaded from one PBIRS instance to another, one report at a time. This is on top of manually maintaining the connection strings for each environment! Luckily, there is an open-source PowerShell module called <strong><em>ReportingServicesTools<\/em><\/strong> to help us manage our report servers and deployments.<\/p>\n<h2>ReportingServicesTools PowerShell Module<\/h2>\n<p>The ReportingServicesTools module was originally developed by the Microsoft Reporting Services Team to enable users to perform various tasks against the SSRS report server within PowerShell. Now the module is open source and available through GitHub. This module is constantly being enhanced by the community to provide more functionality. The list of commands is available on GitHub <a href=\"https:\/\/github.com\/Microsoft\/ReportingServicesTools\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n<p><em>NOTE: <a href=\"https:\/\/twitter.com\/SQLvariant\">Aaron Nelson<\/a> has written extensively on this <a href=\"https:\/\/www.mssqltips.com\/sqlservertip\/4738\/powershell-commands-for-sql-server-reporting-services\/\">topic<\/a>. His session on the module at last year\u2019s PASS Summit got us excited to try it out on our client initiative. Thanks, Aaron!<\/em><\/p>\n<h2>Setup<\/h2>\n<p>You can download the module from the PowerShell Gallery <a href=\"https:\/\/www.powershellgallery.com\/packages\/ReportingServicesTools\" target=\"_blank\" rel=\"noopener\">with this link<\/a>,\u00a0<span style=\"background-color: transparent;\">OR y<\/span><span style=\"background-color: transparent;\">ou can use the Install.ps1 script from GitHub site above.\u00a0<\/span><\/p>\n<p>Once you have the module downloaded, you must also have at least PowerShell 3.0 installed (but PowerShell 5+ is highly recommended) before you can install the ReportingServicesTools module. If you always want to get latest module when you are running your deployment script, you can check for updates each time using this code snippet:<\/p>\n<p style=\"padding-left: 60px;\"><code><span style=\"color: #008000;\">#Installs SSRS module (need to run as admin to do this)<br \/>\n<\/span><span style=\"background-color: transparent;\"><span style=\"color: #0000ff;\">Install-Module<\/span> <span style=\"color: #3366ff;\">-Name<\/span> <span style=\"color: #9b61bc;\">ReportingServicesTools<\/span>;<\/span><\/code><\/p>\n<p style=\"padding-left: 60px;\"><code><span style=\"color: #008000;\">#Update SSRS module<\/span><\/code><br \/>\n<code><span style=\"background-color: transparent;\"><span style=\"color: #0000ff;\">Update-Module<\/span> <span style=\"color: #3366ff;\">-Name<\/span> <span style=\"color: #9b61bc;\">ReportingServicesTools<\/span>;<\/span><\/code><\/p>\n<p style=\"padding-left: 60px;\"><code><span style=\"background-color: transparent;\"><span style=\"color: #008000;\">#Import SSRS module<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\"><span style=\"color: #0000ff;\">Import-Module<\/span> <span style=\"color: #3366ff;\">-Name<\/span> <span style=\"color: #9b61bc;\">ReportingServicesTools<\/span>;<\/span><\/code><\/p>\n<h2>USE CASE: Exporting<\/h2>\n<p><em>Let\u2019s assume both BI Developers and business power users are developing and modifying reports against your Development PBIRS server. Often, we\u2019ll want to integrate these changes into our source control repository.<\/em><\/p>\n<p>To export your reports from your PBIRS development environment, first connect to your PBIRS server and then iterate through all the folders\/reports. Next, create an exact copy in your source control environment using the code snippet below.\u00a0 Please replace <em>localhost<\/em> with the name of your report server and update the <em>LocalPath<\/em> variable with your local source control folder (in our case, we used Git).<\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #008000;\"><code>#Create new web session to your Power BI Report portal<\/code><\/span><br \/>\n<code><span style=\"background-color: transparent;\"><span style=\"color: #ff0000;\">$ReportPortalUri<\/span> <span style=\"color: #808080;\">=<\/span> <span style=\"color: #800000;\">'http:\/\/localhost\/reports'<\/span>; <span style=\"color: #008000;\">#Replace with your report server URL<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\"><span style=\"color: #ff0000;\">$session<\/span> <span style=\"color: #808080;\">=<\/span> <span style=\"color: #0000ff;\">New-RsRestSession<\/span> <span style=\"color: #3366ff;\">-ReportPortalUri<\/span> <span style=\"color: #ff0000;\">$ReportPortalUri<\/span>;<br \/>\n<\/span><span style=\"background-color: transparent;\"><span style=\"color: #ff0000;\">$LocalPath<\/span> <span style=\"color: #808080;\">=<\/span><span style=\"color: #800000;\">\u2019C:GitSSRS'<\/span>; <span style=\"color: #008000;\">#Specify local folder to download assets to<\/span><\/span><\/code><\/p>\n<p style=\"padding-left: 60px;\"><code><span style=\"color: #008000;\">#Get Power BI and Excel reports from Power BI Report Server<\/span><\/code><br \/>\n<code><span style=\"background-color: transparent;\"><span style=\"color: #008000;\">#NOTE: Since we use SSDT for managing SSRS reports, we only wanted to download Power BI &amp; Excel reporting assets<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\"><span style=\"color: #ff0000;\">$reports<\/span> <span style=\"color: #808080;\">=<\/span> <span style=\"color: #0000ff;\">Get-RsCatalogItems<\/span> <span style=\"color: #3366ff;\">-ReportServerUri<\/span> <span style=\"color: #ff0000;\">$ReportPortalUri<\/span> <span style=\"color: #3366ff;\">-RsFolder<\/span> <span style=\"color: #800000;\">'\/'<\/span> <span style=\"color: #3366ff;\">-Recurse<\/span><br \/>\n<span style=\"color: #808080;\">|<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\"><span style=\"color: #0000ff;\">Where<\/span> {<span style=\"color: #ff0000;\">$_<\/span><span style=\"color: #808080;\">.<\/span>TypeName <span style=\"color: #808080;\">-eq<\/span> <span style=\"color: #800000;\">'PowerBIReport'<\/span> <span style=\"color: #808080;\">-Or<\/span> <span style=\"color: #ff0000;\">$_<\/span><span style=\"color: #808080;\">.<\/span>TypeName <span style=\"color: #808080;\">-eq<\/span> <span style=\"color: #800000;\">'ExcelWorkbook'<\/span>};<\/span><\/code><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\"><code>#Export each report that was selected<\/code><\/span><br \/>\n<code><span style=\"background-color: transparent;\"><span style=\"color: #3366ff;\">foreach<\/span> (<span style=\"color: #ff0000;\">$report<\/span> <span style=\"color: #3366ff;\">in<\/span> <span style=\"color: #ff0000;\">$reports<\/span>)<br \/>\n<\/span><span style=\"background-color: transparent;\">{<br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 <span style=\"color: #ff0000;\">$reportFolder<\/span> <span style=\"color: #808080;\">=<\/span> (<span style=\"color: #0000ff;\">Split-Path<\/span> <span style=\"color: #ff0000;\">$report<\/span><span style=\"color: #808080;\">.<\/span>Path)<span style=\"color: #808080;\">.<\/span>Substring(<span style=\"color: #800000;\">1<\/span>)<br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 <span style=\"color: #ff0000;\">$exportPath<\/span> <span style=\"color: #808080;\">=<\/span> <span style=\"color: #ff0000;\">$LocalPath<\/span> <span style=\"color: #808080;\">+<\/span> <span style=\"color: #800000;\">\"\"<\/span> <span style=\"color: #808080;\">+<\/span> <span style=\"color: #ff0000;\">$reportFolder<\/span>;<\/span><\/code><\/p>\n<p style=\"padding-left: 30px;\"><code><span style=\"background-color: transparent;\">\u00a0 <span style=\"color: #008000;\">#Create folder if it does not exist<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 <span style=\"color: #3366ff;\">if<\/span> (<span style=\"color: #808080;\">-Not<\/span> (<span style=\"color: #0000ff;\">Test-Path<\/span> <span style=\"color: #ff0000;\">$exportPath<\/span>))<br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 {<br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 \u00a0 <span style=\"color: #0000ff;\">New-Item<\/span> <span style=\"color: #ff0000;\">$exportPath<\/span> <span style=\"color: #3366ff;\">-ItemType<\/span> <span style=\"color: #9b61bc;\">Directory<\/span> <span style=\"color: #808080;\">|<\/span> <span style=\"color: #0000ff;\">Out-Null<\/span>;<br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 }<\/span><\/code><\/p>\n<p style=\"padding-left: 30px;\"><code><span style=\"background-color: transparent;\">\u00a0 <span style=\"color: #008000;\">#Export the report<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 <span style=\"color: #0000ff;\">Out-RsRestCatalogItem<\/span> <span style=\"color: #3366ff;\">-Destination<\/span> <span style=\"color: #ff0000;\">$exportPath<\/span> <span style=\"color: #3366ff;\">-RsItem<\/span> <span style=\"color: #ff0000;\">$report<\/span><span style=\"color: #808080;\">.<\/span>Path <span style=\"color: #3366ff;\">-Overwrite -\u00a0 \u00a0 \u00a0 \u00a0 WebSession<\/span> <span style=\"color: #ff0000;\">$session<\/span>;<br \/>\n<\/span><\/code><span style=\"background-color: transparent;\"><code>\u00a0 <span style=\"color: #0000ff;\">Write-Host<\/span> <span style=\"color: #800000;\">\"Report exported:<\/span> $(<span style=\"color: #ff0000;\">$report<\/span><span style=\"color: #808080;\">.<\/span>Name)\";<\/code><br \/>\n<\/span><span style=\"background-color: transparent;\">}<\/span><\/p>\n<h2>USE CASE: Deploying<\/h2>\n<p><em>Source control integration is only half of the battle. Often, we\u2019ll also need to deploy these new reports and\/or enhancements to a higher environment (i.e. UAT or Production).<\/em><\/p>\n<p>Now that your source control environment matches your Development PBIRS server, you can deploy these reports to a different PBIRS instance, such as one used for UAT or Production.<\/p>\n<p style=\"padding-left: 30px;\"><code><span style=\"color: #008000;\">#Again, we use SSDT for deploying SSRS reports. Therefore, we're only using PowerShell for Power BI &amp; Excel reports<br \/>\n<\/span><span style=\"background-color: transparent; color: #008000;\">#That said, there is nothing preventing you from deploying all report types via PowerShell. Simply remove the \"Include\" parameter below.<\/span><\/code><\/p>\n<p style=\"padding-left: 30px;\"><code><span style=\"color: #ff0000;\">$reports<\/span> <span style=\"color: #808080;\">=<\/span> <span style=\"color: #0000ff;\">Get-ChildItem<\/span> <span style=\"color: #3366ff;\">-Path<\/span> <span style=\"color: #ff0000;\">$LocalPath<\/span> <span style=\"color: #3366ff;\">-Recurse -Include<\/span> <span style=\"color: #800000;\">\"*.pbix\"<\/span><span style=\"color: #808080;\">,<\/span><span style=\"color: #800000;\">\"*.xlsx\"<\/span>;<\/code><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\"><code>#Loop through selected reports<\/code><\/span><br \/>\n<code><span style=\"background-color: transparent;\"><span style=\"color: #3366ff;\">ForEach<\/span> (<span style=\"color: #ff0000;\">$report<\/span> <span style=\"color: #3366ff;\">in<\/span> <span style=\"color: #ff0000;\">$reports<\/span>)<br \/>\n<\/span><span style=\"background-color: transparent;\">{<br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 \u00a0<span style=\"color: #008000;\">#Get the report folder from source control path<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 \u00a0<span style=\"color: #ff0000;\">$reportFolder<\/span> <span style=\"color: #808080;\">=<\/span> <span style=\"color: #0000ff;\">Split-Path<\/span> <span style=\"color: #3366ff;\">-Path<\/span> <span style=\"color: #800000;\">\"<\/span>$(<span style=\"color: #ff0000;\">$report<\/span><span style=\"color: #808080;\">.<\/span>Directory)<span style=\"color: #800000;\">\"<\/span> <span style=\"color: #3366ff;\">-Leaf<\/span><\/span><\/code><\/p>\n<p style=\"padding-left: 30px;\"><code><span style=\"background-color: transparent;\">\u00a0 <span style=\"color: #008000;\">\u00a0#Deploy the report to the server<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 \u00a0<span style=\"color: #0000ff;\">Write-RsRestCatalogItem<\/span> <span style=\"color: #3366ff;\">-Path<\/span> <span style=\"color: #ff0000;\">$report<\/span><span style=\"color: #808080;\">.<\/span>FullName <span style=\"color: #3366ff;\">-RsFolder<\/span> <span style=\"color: #800000;\">\"\/<\/span>$(<span style=\"color: #ff0000;\">$reportFolder<\/span>)\" <span style=\"color: #3366ff;\">-\u00a0 \u00a0 \u00a0 Overwrite -WebSession<\/span> <span style=\"color: #ff0000;\">$session<\/span>;<br \/>\n<\/span><span style=\"background-color: transparent;\">}\u00a0<\/span><\/code><\/p>\n<h2>Enhancing Your Scripts<\/h2>\n<p>There are many ways to enhance these scripts beyond the basic exporting and deployment of Power BI and Excel-based reports. For example, we could have just as easily modified the scripts above to include <em>ALL<\/em> report types compatible with PBIRS, not just Power BI and Excel. This would allow for a complete deployment via PowerShell, without the need to deploy SSRS reports separately via SSDT.<\/p>\n<h3>Grid View &amp; Manual Selections<\/h3>\n<p>Parameterizing your script to display a <em>grid view<\/em> enables the user to select items at run-time, instead of having to update the script prior to running. This is great for items like environment selection and individual, or multiple, report selection for exporting\/deploying. The example below displays the reports available on the server, so the user can select which ones they would like to export. The key items below are the <em>Out-GridView<\/em> cmdlet, along with the <em>-PassThru<\/em> parameter.<\/p>\n<p style=\"padding-left: 30px;\"><code><span style=\"color: #ff0000;\">$reports<\/span> <span style=\"color: #808080;\">=<\/span> <span style=\"color: #0000ff;\">Get-RsCatalogItems<\/span> -ReportServerUri\u00a0<span style=\"color: #ff0000;\">$ReportPortalUri\u00a0<\/span>-RsFolder '\/' -Recurse <\/code><br \/>\n<span style=\"color: #808080;\"><code>|<\/code><\/span><br \/>\n<code><span style=\"background-color: transparent;\">\u00a0 \u00a0 <span style=\"color: #0000ff;\">Where<\/span> {<span style=\"color: #ff0000;\">$_<\/span><span style=\"color: #808080;\">.<\/span>TypeName <span style=\"color: #808080;\">-ne<\/span> <span style=\"color: #800000;\">'Folder'<\/span>} <span style=\"color: #808080;\">|<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 \u00a0 <span style=\"color: #0000ff;\">Select<\/span> @{Name<span style=\"color: #808080;\">=<\/span><span style=\"color: #800000;\">\"Folder\"<\/span>; Expression<span style=\"color: #808080;\">=<\/span>{(<span style=\"color: #0000ff;\">Split-Path<\/span> <span style=\"color: #ff0000;\">$_<\/span><span style=\"color: #808080;\">.<\/span>Path)<span style=\"color: #808080;\">.<\/span>Substring(1)}}<span style=\"color: #808080;\">,<\/span> @{Name<span style=\"color: #808080;\">=<\/span>\"Name\"; Expression<span style=\"color: #808080;\">=<\/span>{<span style=\"color: #ff0000;\">$_<\/span><span style=\"color: #808080;\">.<\/span>Name}}<span style=\"color: #808080;\">,<\/span> @{Name<span style=\"color: #808080;\">=<\/span><span style=\"color: #800000;\">\"Report Type\"<\/span>; Expression<span style=\"color: #808080;\">=<\/span>{<span style=\"color: #ff0000;\">$_<\/span><span style=\"color: #808080;\">.<\/span>TypeName}}<br \/>\n<span style=\"color: #808080;\">|<\/span><br \/>\n<\/span><span style=\"background-color: transparent;\">\u00a0 \u00a0 <span style=\"color: #0000ff;\">Out-GridView<\/span> <span style=\"color: #3366ff;\">-PassThru -Title<\/span> <span style=\"color: #800000;\">'Select reports to export'<\/span>;<\/span><\/code><\/p>\n<table style=\"height: 369px;\" width=\"847\">\n<tbody>\n<tr>\n<td style=\"width: 841px; text-align: center;\"><img decoding=\"async\" style=\"width: 772px;\" src=\"https:\/\/3cloudsolutions.com\/wp-content\/uploads\/2022\/11\/PBI-1.png\" alt=\"PBI 1\" width=\"772\" \/><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 841px;\">\n<p style=\"text-align: center;\"><span style=\"color: #007cba;\"><em>Figure 1 &#8211; Our PBIRS Folder contains five reports. Three Power BI, one SSRS, and one Excel report.<\/em><\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<tbody>\n<tr>\n<td><img decoding=\"async\" style=\"width: 695px; display: block; margin-left: auto; margin-right: auto;\" src=\"https:\/\/3cloudsolutions.com\/wp-content\/uploads\/2022\/11\/PBI-2.png\" alt=\"PBI 2\" width=\"695\" \/><\/td>\n<\/tr>\n<tr>\n<td>\n<p style=\"text-align: center;\"><span style=\"color: #007cba;\"><em>Figure 2 &#8211; The same five reports are shown via a PowerShell grid. We can select one, some, or all, reports to include in our deployment.<\/em><\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\nModifying Connection Strings<\/h3>\n<p><span style=\"background-color: transparent;\">Another accelerator we found necessary was to use PowerShell to modify the Power BI and Excel report connection strings prior to deployment. This removes the tedious process of updating each connection string on reports that were deployed to a different environment than they were created in. This is very useful since Power BI and Excel report connections are embedded and do not have the ability to use Shared Data Sources at this time.\u00a0<\/span><span style=\"background-color: transparent;\">Open the Power BI or Excel file as though it were a zip file in PowerShell and modify the connection string inside the connections file.<\/span><\/p>\n<p><em>NOTE: This is not a Microsoft supported solution, but sometimes you must get creative when managing hundreds of reports.<\/em><\/p>\n<h3>Tidying up Source Control<\/h3>\n<p>You can also include logic in your script to clean up your source control repository to match what exists on your PBIRS instance. For example, you can traverse through your reporting structure in source control and compare it to what is currently in your PBIRS instance. If any reports were removed on the PBIRS instance, these reports can be outputted into a grid view to allow the developer to review if they should also be removed from source control.<\/p>\n<p>Have questions about Power BI Report Server or just want to learn more?\u00a0<a href=\"\/get-started\/\">Contact us<\/a>! We would be happy to share more examples of how you can also take advantage of\u00a0this great technology.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Power BI Report Server can be thought of as a superset of SQL Server Reporting Services (SSRS). Therefore, traditional SSRS, Mobile, Key Performance Indicators (KPIs), and Excel-based reports can all be hosted alongside your Power BI reports.<\/p>\n","protected":false},"author":21,"featured_media":14336,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[260],"tags":[385,273],"class_list":["post-15864","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-ai","tag-devops","tag-power-bi","topics-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/posts\/15864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/comments?post=15864"}],"version-history":[{"count":0,"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/posts\/15864\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/media\/14336"}],"wp:attachment":[{"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/media?parent=15864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/categories?post=15864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/3cloudsolutions.com\/wp-json\/wp\/v2\/tags?post=15864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}