{"id":9205,"date":"2020-05-21T09:32:45","date_gmt":"2020-05-21T07:32:45","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=9205"},"modified":"2023-01-20T12:39:39","modified_gmt":"2023-01-20T11:39:39","slug":"budowanie-mikroserwisow-w-sap-cloud-foundry","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/budowanie-mikroserwisow-w-sap-cloud-foundry\/","title":{"rendered":"Budowanie mikroserwis\u00f3w w SAP Cloud Foundry"},"content":{"rendered":"\n<p>Dynamicznie zmieniaj\u0105cy si\u0119 rynek, a tak\u017ce maksymalizacja redukcji koszt\u00f3w, wymusi\u0142o przed laty na tw\u00f3rcach oprogramowania stworzenie mikroserwis\u00f3w, czyli us\u0142ug b\u0119d\u0105cych cz\u0119\u015bci\u0105 sk\u0142adow\u0105 jakiego\u015b wi\u0119kszego systemu. Takie podej\u015bcie u\u0142atwia budowanie z\u0142o\u017conych aplikacji oraz ich p\u00f3\u017aniejsze utrzymywanie.<\/p>\n\n\n\n<p>\u015awiat SAP przez lata wydawa\u0142 si\u0119 bardzo hermetyczny i jakby zamkni\u0119ty na innowacje zachodz\u0105ce w IT. Zmiana modelu biznesowego wielu klient\u00f3w oraz nowe potrzeby w stosunku do oprogramowania spowodowa\u0142y, i\u017c SAP zdecydowa\u0142 si\u0119 na dynamiczny rozw\u00f3j swoich produkt\u00f3w na wielu frontach. W przypadku mikroserwis\u00f3w mieli\u015bmy mo\u017cliwo\u015b\u0107 korzystania z nich, ju\u017c w \u015brodowisku SAP HANA XS Advanced.<\/p>\n\n\n\n<p>Ubieg\u0142oroczna konferencja SAP TechEd wskaza\u0142a jasny kierunek w kt\u00f3rym SAP chcia\u0142by pod\u0105\u017ca\u0107 w kolejnych latach. Wiele z produkt\u00f3w przenoszonych jest do Clouda. R\u00f3wnie\u017c \u015brodowisko HANA XS Advanced ma tam sw\u00f3j odpowiednik tj. SAP Cloud Foundry. Jest to otwarta platforma, kt\u00f3ra jest &nbsp;standardem w przypadku rozwi\u0105za\u0144 Platforms as a Service (PaaS), do opracowywania i wdra\u017cania aplikacji chmurowych. Jest ona przeznaczona do dzia\u0142ania jako us\u0142uga na r\u00f3\u017cnych infrastrukturach (IaaS), takich jak Amazon Web Services, OpenStack, Google Cloud Platform i Microsoft Azure. Umo\u017cliwia programistom korzystanie z r\u00f3\u017cnych j\u0119zyk\u00f3w programowania, \u015brodowisk wykonawczych, us\u0142ug czy te\u017c backend\u00f3w dla aplikacji. Wi\u0119cej informacji &nbsp;o Cloud Foundry znajdziesz w rozdzia\u0142ach 6.3 i 6.5&nbsp;<a href=\"https:\/\/sii.pl\/blog\/maly-glosariusz-sap-czesc-ii\/\">https:\/\/sii.pl\/blog\/maly-glosariusz-sap-czesc-ii\/<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zanim zaczniesz<\/h3>\n\n\n\n<p>Ide\u0105 tego artyku\u0142u jest pokazanie w jaki spos\u00f3b budowa\u0107 mikroserwis w \u015brodowisku SAP Cloud Foundry, a nast\u0119pnie udost\u0119pni\u0107 go poprzez API Management. Mikroserwisem w naszym przypadku b\u0119dzie prosta aplikacja, kt\u00f3ra z bazy danych HANA poprzez serwis Node.js wystawi dane pracownika jako interfejs (patrz Rysunek 1).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/1-1.png\"><img decoding=\"async\" width=\"658\" height=\"276\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/1-1.png\" alt=\"Rysunek 1 \u2013 Budowane rozwi\u0105zanie\" class=\"wp-image-18671\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/1-1.png 658w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/1-1-300x126.png 300w\" sizes=\"(max-width: 658px) 100vw, 658px\" \/><\/a><figcaption>Rysunek 1 \u2013 Budowane rozwi\u0105zanie<\/figcaption><\/figure><\/div>\n\n\n\n<p>Architektura takiego rozwi\u0105zania, podyktowana jest ch\u0119ci\u0105 pokazania, \u017ce z\u0142o\u017con\u0105 logik\u0119 backendu mo\u017cna zatomizowa\u0107, co cz\u0119sto jest problemem programist\u00f3w, kt\u00f3rzy nie mog\u0105 r\u00f3wnolegle rozwija\u0107 swoich aplikacji. W tym celu wykorzystywany jest SCP API Management, aby zapewni\u0107 dost\u0119p do APIs z jednego wsp\u00f3lnego miejsca, dla zewn\u0119trznych \u017ar\u00f3de\u0142. Bez potrzeby uzewn\u0119trzniania logiki biznesowej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jak zacz\u0105\u0107?<\/h3>\n\n\n\n<p>SAP, dla os\u00f3b chc\u0105cych odkrywa\u0107 mo\u017cliwo\u015bci ich produkt\u00f3w, oferuje swoje \u015brodowisko i us\u0142ugi w darmowej wersji trial. Wystarczy jedynie zarejestrowa\u0107 si\u0119 w&nbsp;<a href=\"https:\/\/cockpit.hanatrial.ondemand.com\/\" rel=\"nofollow\" >SAP Cloud Platform trial<\/a>. W SCP b\u0119dziemy korzysta\u0107 z nast\u0119puj\u0105cych us\u0142ug SAP:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Neo Trial<ul><li>API Management<ul><li>API Portal<\/li><li>Developer Portal (opcjonalnie)<\/li><\/ul><\/li><li>Cloud Foundry<ul><li>WebIDE<ul><li>Rozszerzenia:<ul><li>SAP HANA Database Development Tools<\/li><li>SAP HANA Database Explorer<\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Konfigurowanie \u015brodowiska<\/h3>\n\n\n\n<p>Z perspektywy SAP Cloud Platform korzysta\u0107 b\u0119dziemy z dw\u00f3ch \u015brodowisk: Cloud Foundry oraz Neo. Cloud Foundry pos\u0142u\u017cy nam do zbudowania aplikacji eksponowanej jako mikrous\u0142uga, natomiast Neo pozwoli nam wystawi\u0107 API do mikroserwisu dla zewn\u0119trznych aplikacji\/system\u00f3w.<\/p>\n\n\n\n<p>Po uruchomieniu Neo, z menu aplikacji nale\u017cy wybra\u0107 Services. Na wy\u015bwietlonej li\u015bcie nale\u017cy odszuka\u0107 API Management i zadba\u0107 o to, aby serwis by\u0142 dost\u0119pny (zgodnie z Rysunek 2).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/2-1.png\"><img decoding=\"async\" width=\"1015\" height=\"550\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/2-1.png\" alt=\"Rysunek 2- Dodanie API Management w \u015brodowisku Neo\" class=\"wp-image-18673\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/2-1.png 1015w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/2-1-300x163.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/2-1-768x416.png 768w\" sizes=\"(max-width: 1015px) 100vw, 1015px\" \/><\/a><figcaption>Rysunek 2- Dodanie API Management w \u015brodowisku Neo<\/figcaption><\/figure><\/div>\n\n\n\n<p>W szczeg\u00f3\u0142ach serwisu (patrz Rysunek 3) nale\u017cy uruchomi\u0107 API Portal i tam zarejestrowa\u0107 swojego u\u017cytkownika w us\u0142ugach SAP. Pozwoli to nam w p\u00f3\u017aniejszych krokach na za\u0142o\u017cenie API do naszego mikroserwisu.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/3-1024x732-1.png\"><img decoding=\"async\" width=\"1024\" height=\"732\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/3-1024x732-1.png\" alt=\"Rysunek 3 \u2013 Szczeg\u00f3\u0142y serwisu API Management\" class=\"wp-image-18675\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/3-1024x732-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/3-1024x732-1-300x214.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/3-1024x732-1-768x549.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 3 \u2013 Szczeg\u00f3\u0142y serwisu API Management<\/figcaption><\/figure><\/div>\n\n\n\n<p>Przedostatnim krokiem jest konfiguracja SAP Cloud Foundry. Je\u015bli w zak\u0142adce Subaccounts, nie mamy jeszcze podpi\u0119tego \u017cadnego systemu to nale\u017cy go doda\u0107 np. w spos\u00f3b jak na Rysunku 4.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/4-1024x549-1.png\"><img decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/4-1024x549-1.png\" alt=\"Rysunek 4 \u2013 Dodawanie systemu w Cloud Foundry\" class=\"wp-image-18677\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/4-1024x549-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/4-1024x549-1-300x161.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/4-1024x549-1-768x412.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 4 \u2013 Dodawanie systemu w Cloud Foundry<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ponadto nale\u017cy doda\u0107 Space, czyli przestrze\u0144 robocz\u0105 dla developmentu. G\u0142\u00f3wn\u0105 ide\u0105 Space jest to, \u017ce tworzy ona rodzaj strefy zaufania, co w zasadzie oznacza, \u017ce wszystkie aplikacje wdro\u017cone w tej samej przestrzeni mog\u0105 mie\u0107 wsp\u00f3lne zasoby, takie jak przechowywanie danych, autoryzacje u\u017cytkownik\u00f3w i has\u0142a. Przestrze\u0144 jest przeznaczona do wsp\u00f3\u0142dzielenia przez kilku programist\u00f3w, ale programi\u015bci mog\u0105 r\u00f3wnie\u017c mie\u0107 swoj\u0105 prywatn\u0105 przestrze\u0144. Aby doda\u0107 przestrze\u0144 nale\u017cy otworzy\u0107 szczeg\u00f3\u0142y naszego systemu, kt\u00f3ry za\u0142o\u017cyli\u015bmy w poprzednim kroku i doda\u0107 Space tak jak na Rysunku 5.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/5-1024x617-1.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/5-1024x617-1.png\" alt=\"Rysunek 5 \u2013 Dodawanie space dla developmentu w SAP Cloud Foundry\" class=\"wp-image-18679\" width=\"840\" height=\"506\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/5-1024x617-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/5-1024x617-1-300x181.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/5-1024x617-1-768x463.png 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><figcaption>Rysunek 5 \u2013 Dodawanie space dla developmentu w SAP Cloud Foundry<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ostatnim krokiem przed rozpocz\u0119ciem developmentu jest konfiguracja WebIDE. Link do naszego \u015brodowiska developerskiego znajduje si\u0119 w SAP Cloud Platform Cockpit. W tym kroku nale\u017cy zgodnie z Rysunkiem 6 otworzy\u0107 ustawienia i w zak\u0142adce Cloud Foundry zdefiniowa\u0107 nasz Space, API Endpoint i poda\u0107 Organizacje (jest nim nasz S-User z suffixem trial). Je\u015bli si\u0119 zgubili\u015bcie, to API Endpoint zosta\u0142 wygenerowany w trakcie zak\u0142adania systemu w Cloud Foundry i jest widoczny w jego szczeg\u00f3\u0142ach.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/6-1024x543-1.png\"><img decoding=\"async\" width=\"1024\" height=\"543\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/6-1024x543-1.png\" alt=\"Rysunek 6 \u2013 Konfiguracja Cloud Foundry w WebIDE\" class=\"wp-image-18681\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/6-1024x543-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/6-1024x543-1-300x159.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/6-1024x543-1-768x407.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 6 \u2013 Konfiguracja Cloud Foundry w WebIDE<\/figcaption><\/figure><\/div>\n\n\n\n<p>W celu u\u0142atwienia sobie pracy, nale\u017cy jeszcze w\u0142\u0105czy\u0107 dwa rozszerzenia w Web IDE, kt\u00f3re pozwol\u0105 nam na prac\u0119 z baz\u0105 danych SAP HANA. Z zak\u0142adki ustawienia, nale\u017cy wybra\u0107 opcj\u0119 \u201eExtensions\u201d, a nast\u0119pnie skonfigurowa\u0107 aplikacj\u0119 tak, jak na Rysunku 7.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/7-1024x376-1.png\"><img decoding=\"async\" width=\"1024\" height=\"376\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/7-1024x376-1.png\" alt=\"Rysunek 7 \u2013 Konfiguracja rozszerze\u0144 WebIDE\" class=\"wp-image-18683\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/7-1024x376-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/7-1024x376-1-300x110.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/7-1024x376-1-768x282.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 7 \u2013 Konfiguracja rozszerze\u0144 WebIDE<\/figcaption><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Budowanie aplikacji<\/h3>\n\n\n\n<p>Nareszcie mo\u017cemy przej\u015b\u0107 do etapu na kt\u00f3ry czekali\u015bmy, czyli development. W tym kroku za\u0142o\u017cymy aplikacj\u0119, kt\u00f3ra b\u0119dzie sk\u0142ada\u0142a si\u0119 z Core Data Services (CDS) i serwisu Node.js. CDS umo\u017cliwiaj\u0105 modelowanie danych i definicji us\u0142ug na poziomie koncepcyjnym. Na ich podstawie tworzone s\u0105 natywne artefakty (np. SQL database schema). Rola CDS nie ogranicza si\u0119 jedynie do strukturyzowania danych. Przy wykorzystaniu odpowiednich annotacji i sk\u0142adowych j\u0119zyka, mo\u017cliwe jest definiowanie relacji danych, co mo\u017ce finalnie pom\u00f3c w definiowaniu poziomu UI.<\/p>\n\n\n\n<p>Na pocz\u0105tku zaczniemy jednak od czego\u015b prostszego, a mianowicie za\u0142o\u017cymy now\u0105 aplikacj\u0119 ?. Do tego pos\u0142u\u017cy nam \u015brodowisko Web IDE. Z g\u00f3rnego menu wybierzmy \u201eCreate project from Template\u201d, a nast\u0119pnie wybierzmy \u201eSAP Cloud Platform Business Application\u201d. Opcja ta umo\u017cliwia nam budowanie full-stackowych aplikacji, gdy\u017c SAP zapewnia \u015brodowisko end-to-end. W kolejnym kroku podajemy nazw\u0119 projektu i nawigujemy dalej, a\u017c dojdziemy do momentu, w kt\u00f3rym b\u0119dziemy musieli poda\u0107 szczeg\u00f3\u0142y projektu, takie jak: j\u0119zyk serwis\u00f3w (u nas Node.js), wersja protoko\u0142u oData, czy te\u017c informacj\u0119 o tym, czy ma zosta\u0107 automatycznie podpi\u0119ta baza danych HANA. Nasza konfiguracja powinna by\u0107 zgodna z Rysunkiem 8.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/8-1024x683-1.png\"><img decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/8-1024x683-1.png\" alt=\"Rysunek 8 \u2013 Konfigurowanie nowego projektu\" class=\"wp-image-18685\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/8-1024x683-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/8-1024x683-1-300x200.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/8-1024x683-1-768x512.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 8 \u2013 Konfigurowanie nowego projektu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Po naci\u015bni\u0119ciu \u201eFinish\u201d aplikacja zostanie za\u0142o\u017cona w Workspace. Po rozwini\u0119ciu drzewka aplikacji widzimy szereg folder\u00f3w i gotowego kodu. Ich znaczenie jest nast\u0119puj\u0105ce:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&lt;Nazwa projektu&gt;<ul><li>db (modu\u0142 bazy danych, przechowuje wszystkie obiekty i artefakty)<ul><li>csv (automatycznie wygenerowany folder przechowywuj\u0105cy przyk\u0142adowe dane w plikach csv, do wgrania do przyk\u0142adowych tabel)<\/li><li>src (folder przechowuj\u0105cy wygenerowane artefakty w trakcie budowania modu\u0142u db)<\/li><li>data-model.cds (Przyk\u0142adowy model CDS. Modele przechwytywane s\u0105 w notacji Core Schema Notation)<\/li><li>json (Plik zawiera skrypt do uruchomienia deploymentu naszych artefakt\u00f3w bazy danych do kontenera HDI)<\/li><\/ul><\/li><li>srv (modu\u0142 serwisu Node.js)<ul><li>cat-service.cds (Plik zawiera definicje serwisu)<\/li><li>json (Plik, kt\u00f3ry defacto znaczy to samo co \u201eCDS run\u201d)<\/li><\/ul><\/li><li>yaml (development descriptor)<\/li><li>json (konfiguracja projektu)<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Nasz\u0105 prac\u0119 zaczniemy od modelowania danych. W tym celu otw\u00f3rzmy plik data-model.cds. W przypadku testowym zbudowa\u0142em encje, kt\u00f3ra b\u0119dzie przechowywa\u0142a pracownik\u00f3w z przypisanymi do nich miejscowo\u015bciami i pa\u0144stwem. Wykorzysta\u0142em tutaj typ danych kt\u00f3ry zdefiniowany jest w sap\/cds\/common. Je\u015bli chodzi o namespace, to jest on dowolny (w przypadkach nieprodukcyjnych). Zbudowany CDS wygl\u0105da jak w Listing kodu 1.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/9-1.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/9-1.png\" alt=\"Listing kodu 1 \u2013 modelowanie danych\" class=\"wp-image-18687\" width=\"470\" height=\"290\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/9-1.png 470w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/9-1-300x185.png 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/a><figcaption>Listing kodu 1 \u2013 modelowanie danych<\/figcaption><\/figure><\/div>\n\n\n\n<p>Warto zauwa\u017cy\u0107, \u017ce w momencie gdy klikn\u0119li\u015bmy \u201ebuild\u201d na module bazy danych, utworzone zosta\u0142y automatycznie nowe artefakty. W tym wypadku widoki CDS i tabele odpowiedzialne za przechowywanie danych pracownika i pa\u0144stw (tabelka tekstowa). Ca\u0142o\u015b\u0107 wygl\u0105da tak jak na Rysunku 9.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/10-1.png\"><img decoding=\"async\" width=\"556\" height=\"536\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/10-1.png\" alt=\"Rysunek 9 \u2013 wygenerowane artefakty\" class=\"wp-image-18689\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/10-1.png 556w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/10-1-300x289.png 300w\" sizes=\"(max-width: 556px) 100vw, 556px\" \/><\/a><figcaption>Rysunek 9 \u2013 wygenerowane artefakty<\/figcaption><\/figure><\/div>\n\n\n\n<p>W tym momencie mo\u017cemy wype\u0142ni\u0107 nasze tabelki danymi. Aby przej\u015b\u0107 do widoku bazy danych, kliknij na module \u201edb\u201d prawym przyciskiem myszy i wybierz \u201eOpen HDI Container\u201d. Je\u015bli w nowo otwartym oknie nie pojawi\u0142a Ci si\u0119 \u017cadna bazy danych, mo\u017cesz j\u0105 \u0142atwo podpi\u0105\u0107 klikaj\u0105c znak \u201e+\u201d. Wybierz &nbsp;domy\u015bln\u0105 baz\u0119 danych, jaka zosta\u0142a stworzona, dla za\u0142o\u017conego przez Ciebie Space. W dodanej bazie nawiguj na zak\u0142adk\u0119 \u201eTables\u201d. W oknie poni\u017cej powinny Ci si\u0119 wy\u015bwietli\u0107 tabele. W moim przypadku ich nazwy to:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>MY_SIIBLOG_SIIWORKER (prefix pochodzi z namespace modelowanego CDS)<\/li><li>SAP_COMMON_COUNTRIES (Tabela warto\u015bci dla pola Country z powy\u017cszego CDS)<\/li><li>SAP_COMMON_COUNTRIES_TEXTS (Tabela tekstowa dla tabeli z pa\u0144stwami)<\/li><\/ul>\n\n\n\n<p>W tym momencie mamy dwie mo\u017cliwo\u015bci, aby doda\u0107 zawarto\u015b\u0107 tabeli:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Korzystaj\u0105c z konsoli SQL (lewy g\u00f3rny r\u00f3g), mo\u017cemy napisa\u0107 polecenie INSERT<\/li><li>U\u017cycie edytora graficznego<\/li><\/ul>\n\n\n\n<p>Zak\u0142adam, i\u017c podstawy SQL zna ka\u017cdy, wi\u0119c szybko opisz\u0119 w jaki spos\u00f3b korzysta\u0107 z edytora graficznego. Po wklikaniu si\u0119 w nazw\u0119 tabeli, wy\u015bwietli nam si\u0119 okno zawieraj\u0105ce szczeg\u00f3\u0142y techniczne tabeli. W prawym g\u00f3rnym rogu znajduje si\u0119 przycisk \u201eOpen Data\u201d, kt\u00f3rego naci\u015bni\u0119cie otwiera bardzo intuicyjne narz\u0119dzie, w kt\u00f3rym mo\u017cemy manualnie doda\u0107 dane, do wybranej tabeli.<\/p>\n\n\n\n<p>Gdy tabele wype\u0142nione s\u0105 danymi, mo\u017cemy si\u0119 skupi\u0107 na budowie serwisu, kt\u00f3ry b\u0119dzie propagowa\u0142 dane. W tym celu nale\u017cy zmieni\u0107 perspektyw\u0119 na \u201eDevelopment\u201d i z folderu \u201esrv\u201d nale\u017cy otworzy\u0107 plik cat-service.cds.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/11-1.png\"><img decoding=\"async\" width=\"601\" height=\"165\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/11-1.png\" alt=\"Listing kodu 2 \u2013 budowa serwisu\" class=\"wp-image-18691\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/11-1.png 601w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/11-1-300x82.png 300w\" sizes=\"(max-width: 601px) 100vw, 601px\" \/><\/a><figcaption>Listing kodu 2 \u2013 budowa serwisu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Serwis, kt\u00f3ry stworzy\u0142em jest bardzo prosty. W linii pierwszej podaj\u0119 namespace zasob\u00f3w, z kt\u00f3rych b\u0119d\u0119 korzysta\u0142. Nast\u0119pnie definiuje serwis, a w nim encj\u0119, kt\u00f3ra b\u0119dzie \u201ewystawiona na zewn\u0105trz\u201d. Dodatkowo nale\u017cy powiadomi\u0107 encj\u0119 z jakiego \u017ar\u00f3d\u0142a danych b\u0119dzie ona korzysta\u0107 (&lt;namespace>.&lt;nazwa_cds>). Kod w tym momencie jest gotowy, teraz pozostaje nam zbudowa\u0107 serwis i zweryfikowa\u0107 czy wszystko dzia\u0142a. Klikamy prawym przyciskiem myszy na katalog \u201esrv\u201d i ka\u017cemy go zbudowa\u0107. Gdy to jest gotowe, wtedy klikamy prawym przyciskiem na cat-service.cds i dajemy \u201eRun as -> Node.js Application\u201d.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/12-1024x195-1.png\"><img decoding=\"async\" width=\"1024\" height=\"195\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/12-1024x195-1.png\" alt=\"Rysunek 10 \u2013 Logi w konsoli\" class=\"wp-image-18693\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/12-1024x195-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/12-1024x195-1-300x57.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/12-1024x195-1-768x146.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 10 \u2013 Logi w konsoli<\/figcaption><\/figure><\/div>\n\n\n\n<p>System b\u0119dzie potrzebowa\u0142 chwili na zbudowanie ca\u0142ego mikroserwisu. Jednak w konsoli na bie\u017c\u0105co mo\u017cemy monitorowa\u0107 jaki jest progres budowania serwisu (Rysunek 10). Gdy zostanie on zbudowany, wy\u015bwietlony zostanie link. Wejd\u017amy w niego i zweryfikujmy, czy nasz serwis eksponuje dane.<\/p>\n\n\n\n<p>Po otwarciu strony widzimy, \u017ce mamy mo\u017cliwo\u015b\u0107 podejrzenia metadanych oraz dost\u0119pnych encji naszego serwisu. U mnie s\u0105 to:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Countries<\/li><li>Workers<\/li><\/ul>\n\n\n\n<p>Po wej\u015bciu w jedn\u0105 z encji, powinny zosta\u0107 wy\u015bwietlone nam dane z bazy danych. Je\u015bli do tego momentu wszystko Ci dzia\u0142a to super, bo oznacza to, \u017ce zbudowa\u0142e\u015b mikroserwis ?. Teraz pozostaje jedynie zarejestrowa\u0107 go w API Management, aby m\u00f3g\u0142 by\u0107 konsumowany przez zewn\u0119trznych partner\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rejestrowanie API<\/h3>\n\n\n\n<p>API Management to proces publikowania, promowania i nadzorowania interfejs\u00f3w API w bezpieczny i skalowalny spos\u00f3b. SAP API Management zapewnia bezpieczne zarz\u0105dzanie interfejsami API w oparciu o otwarte standardy, takie jak SOAP, REST czy te\u017c oData. Upraszcza to spos\u00f3b, w jaki programi\u015bci integruj\u0105 si\u0119 z aplikacjami SAP (i innymi ni\u017c SAP), obni\u017caj\u0105c koszty i wspieraj\u0105c innowacje.<\/p>\n\n\n\n<p>Aby, uruchomi\u0107 API Management nale\u017cy cofn\u0105\u0107 si\u0119 do SAP Cloud Platform Cockpit (Neo). Tam z zak\u0142adki \u201eServices\u201d nale\u017cy wybra\u0107 odpowiedni\u0105 us\u0142ug\u0119. Nast\u0119pni klikamy \u201eAccess API Portal\u201d. Po chwili uruchomiona zostanie nowa aplikacja, w kt\u00f3rej mo\u017cemy budowa\u0107 i zarz\u0105dza\u0107 naszymi API.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/13-1.png\"><img decoding=\"async\" width=\"1024\" height=\"532\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/13-1.png\" alt=\"Rysunek 11 \u2013 G\u0142\u00f3wne okno API Portal\" class=\"wp-image-18695\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/13-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/13-1-300x156.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/13-1-768x399.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 11 \u2013 G\u0142\u00f3wne okno API Portal<\/figcaption><\/figure><\/div>\n\n\n\n<p>Naszym pierwszym zadaniem b\u0119dzie stworzenie API. W menu z lewej strony nale\u017cy wybra\u0107 opcj\u0119 \u201eDevelop\u201d. W nowo otwartym oknie nale\u017cy wype\u0142ni\u0107 dane w spos\u00f3b zgodny z Rysunkiem 12.<\/p>\n\n\n\n<p><strong>Select<\/strong>: URL<\/p>\n\n\n\n<p><strong>URL<\/strong>: link naszego serwisu + \/catalog. Link mo\u017cna podejrze\u0107 w konsoli Web IDE po uruchomieniu serwisu<\/p>\n\n\n\n<p><strong>Name<\/strong>: dowolny<\/p>\n\n\n\n<p><strong>Title<\/strong>: dowolny<\/p>\n\n\n\n<p><strong>Host Alias<\/strong>: Podpowiada si\u0119 automatycznie, je\u015bli systemy zosta\u0142y skonfigurowane zgodnie z tutorialem.<\/p>\n\n\n\n<p><strong>API Base Path<\/strong>: \/&lt;namespace_cds>\/&lt;nazwa_aplikacji> W tym przypadku \/siiblog\/siitest<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/14-1.png\"><img decoding=\"async\" width=\"1020\" height=\"830\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/14-1.png\" alt=\"Rysunek 12 \u2013 Tworzenie API dla microservice\" class=\"wp-image-18697\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/14-1.png 1020w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/14-1-300x244.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/14-1-768x625.png 768w\" sizes=\"(max-width: 1020px) 100vw, 1020px\" \/><\/a><figcaption>Rysunek 12 \u2013 Tworzenie API dla microservice<\/figcaption><\/figure><\/div>\n\n\n\n<p>Gdy API zosta\u0142o stworzone, wtedy nale\u017cy zrobi\u0107 deployment. W tym celu nale\u017cy skorzysta\u0107 z opcji \u201eDeploy\u201d w prawym g\u00f3rnym rogu. Nast\u0119pnie nale\u017cy klikn\u0105\u0107 \u201eedit\u201d przej\u015b\u0107 do zak\u0142adki \u201eResources\u201d i doda\u0107 nawigacje do naszej encji (Patrz Rysunek 13). W moim przypadku dodaje \u201e\/Workers\u201d, gdy\u017c tak nazywa\u0142a si\u0119 moja encja. Je\u015bli zdecydowa\u0142e\u015b si\u0119 na inn\u0105 nazw\u0119, to nale\u017cy sprawdzi\u0107 jej nazw\u0119 najlepiej w modelowanym CDS.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/15-1024x536-1.png\"><img decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/15-1024x536-1.png\" alt=\"Rysunek 13 \u2013 Konfigurowanie API\" class=\"wp-image-18699\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/15-1024x536-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/15-1024x536-1-300x157.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/15-1024x536-1-768x402.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 13 \u2013 Konfigurowanie API<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ostatnim etapem jest przetestowanie naszego API. Gdy ju\u017c dodali\u015bmy \u201eResource\u201d, mo\u017cemy skorzysta\u0107 z opcji \u201eTry out\u201d. Nasze API nie pobiera \u017cadnych parametr\u00f3w, wi\u0119c mo\u017cemy uruchomi\u0107 test naciskaj\u0105c przycisk \u201eExecute\u201d. Jako rezultat powinni\u015bmy otrzyma\u0107 kod 200 i dane pracownika, kt\u00f3re zapisane zosta\u0142y w bazie.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/16-1024x821-1.png\"><img decoding=\"async\" width=\"1024\" height=\"821\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/16-1024x821-1.png\" alt=\"Rysunek 14 \u2013 Testowanie API\" class=\"wp-image-18701\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/16-1024x821-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/16-1024x821-1-300x241.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/16-1024x821-1-768x616.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Rysunek 14 \u2013 Testowanie API<\/figcaption><\/figure><\/div>\n\n\n\n<p>Gratulacje! Teraz ju\u017c wiesz w jaki spos\u00f3b mo\u017cna budowa\u0107 proste mikroserwisy oraz jak je zg\u0142asza\u0107 w API Management. Nale\u017cy pami\u0119ta\u0107, \u017ce to jest jedynie pocz\u0105tek drogi. Przyk\u0142ady produkcyjne z regu\u0142y maj\u0105 znacznie bardziej skomplikowany backend, natomiast API Management zawiera szereg dodatkowej konfiguracji, jak chocia\u017cby poziom autoryzacji, by dane mog\u0142y odczytywa\u0107 jedynie uprawnione osoby. Tutorial ten daje Ci jednak baz\u0119 do rozpocz\u0119cia przygody z Cloud Foundry jak i z mikroserwisami. Powodzenia!<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ol class=\"wp-block-list\"><li>Designing and Developing Harmonized REST-Based Microservices INT615, Divya Mary \/ SAP SE<\/li><li>Dokumentacja CDS&nbsp;<a href=\"https:\/\/cap.cloud.sap\/docs\/cds\/\" rel=\"nofollow\" >https:\/\/cap.cloud.sap\/docs\/cds\/<\/a><\/li><\/ol>\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;9205&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;1&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&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;5\\\/5 ( vote: 1)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Budowanie mikroserwis\u00f3w w SAP Cloud Foundry&quot;,&quot;width&quot;:&quot;139.5&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: 139.5px;\">\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            5\/5 ( vote: 1)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Dynamicznie zmieniaj\u0105cy si\u0119 rynek, a tak\u017ce maksymalizacja redukcji koszt\u00f3w, wymusi\u0142o przed laty na tw\u00f3rcach oprogramowania stworzenie mikroserwis\u00f3w, czyli us\u0142ug b\u0119d\u0105cych &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/budowanie-mikroserwisow-w-sap-cloud-foundry\/\">Continued<\/a><\/p>\n","protected":false},"author":242,"featured_media":9222,"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":[1314],"tags":[548,156,916,915,914],"class_list":["post-9205","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-sap","tag-cloud","tag-cloudfoundry","tag-microservice","tag-s4hana"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/05\/development1.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9205"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/242"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=9205"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9205\/revisions"}],"predecessor-version":[{"id":18704,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9205\/revisions\/18704"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/9222"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=9205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=9205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=9205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}