{"id":1081,"date":"2021-07-24T07:40:01","date_gmt":"2021-07-24T14:40:01","guid":{"rendered":"https:\/\/bullyrooks.com\/?p=1081"},"modified":"2021-07-25T06:53:39","modified_gmt":"2021-07-25T13:53:39","slug":"spring-boot-lambda-api-implementation","status":"publish","type":"post","link":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/spring-boot-lambda-api-implementation\/","title":{"rendered":"Spring Boot Lambda API Implementation"},"content":{"rendered":"\n<p>We&#8217;ve got a &#8216;working&#8217; lambda now, but we can&#8217;t actually use it anywhere.  The easiest thing to do at this point is add an API Gateway trigger to our function as a new lambda.  This will require a little bit of work to make an API Gateway adapter to our service and then add the API Gateway trigger.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Start a New Branch<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git checkout -b apifunction\nSwitched to a new branch 'apifunction'\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Create an API Gateway Function<\/h2>\n\n\n\n<p>in our <code>function<\/code> directory make a new class <code>HelloWorldAPIFunction<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.bullyrooks.helloworldlambda.function;\n\n\nimport com.bullyrooks.helloworldlambda.function.dto.HelloWorldRequest;\nimport com.bullyrooks.helloworldlambda.function.dto.HelloWorldResponse;\nimport com.bullyrooks.helloworldlambda.service.HelloWorldService;\nimport com.bullyrooks.helloworldlambda.service.vo.HelloWorld;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.messaging.Message;\nimport org.springframework.messaging.support.MessageBuilder;\nimport org.springframework.stereotype.Component;\n\nimport java.util.function.Function;\n\n@Component\n@Slf4j\npublic class HelloWorldAPIFunction implements\n        Function&lt;Message&lt;HelloWorldRequest&gt;, Message&lt;HelloWorldResponse&gt;&gt; {\n    @Autowired\n    HelloWorldService helloWorldService;\n\n    @Override\n    public Message&lt;HelloWorldResponse&gt; apply(Message&lt;HelloWorldRequest&gt; input) {\n        log.info(\"input message: {}\", input);\n        HelloWorld response = helloWorldService.helloWorld(input.getPayload().getName());\n        HelloWorldResponse messageResponse = HelloWorldResponse.builder()\n                .response(response.getResponse())\n                .build();\n        log.info(\"got response: {}\", response);\n        Message returnMessage = MessageBuilder.withPayload(response)\n                .setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)\n                .setHeader(\"statuscode\", HttpStatus.OK.value())\n                .build();\n        log.info(\"Returning Message: {}\", returnMessage);\n        return returnMessage;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>The API Gateway adapter operates on <code>Message<\/code> objects which will contain JSON serializable messages.  We&#8217;re going to use <code>HelloWorldRequest<\/code> and <code>HelloWorldResponse<\/code> as DTO to serialize the request and response.  The rest of this function just transforms the DTO and makes the service call and transforms the response back.  There is a little bit of trickiness in that the <code>Message<\/code> headers will contain the HTTP information that we&#8217;ll use in the API Gateway (i.e. statuscode).  However, this is exactly inline with our ports and adapters design mindset.  <\/p>\n\n\n\n<p>Finally, we need to explicitly define the bean so that the  <code>SpringBootApiGatewayRequestHandler<\/code> can find it.  Add these lines to the <code>HelloworldLambdaApplication <\/code>class<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Bean\n    HelloWorldAPIFunction apiFunction() {\n        return new HelloWorldAPIFunction();\n    }<\/code><\/pre>\n\n\n\n<p>That should be it.  Lets build the jar<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ mvn clean package\n...\n&#91;INFO] Attaching shaded artifact.\n&#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] BUILD SUCCESS\n&#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] Total time:  8.638 s\n&#91;INFO] Finished at: \n&#91;INFO] ------------------------------------------------------------------------\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Create the Lambda<\/h2>\n\n\n\n<p>We&#8217;re going to create the lambda the exact same way with a few minor changes.  <\/p>\n\n\n\n<p>The handler will be <code>org.springframework.cloud.function.adapter.aws.SpringBootApiGatewayRequestHandler::handleRequest<\/code> and the environment variable <code>FUNCTION_NAME<\/code> will change to <code>apiFunction<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"733\" height=\"567\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-10.png?resize=733%2C567&#038;ssl=1\" alt=\"\" class=\"wp-image-1083\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-10.png?w=733&amp;ssl=1 733w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-10.png?resize=300%2C232&amp;ssl=1 300w\" sizes=\"auto, (max-width: 733px) 100vw, 733px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Add the API Gateway Trigger<\/h2>\n\n\n\n<p>On the function overview page, click <code>Add trigger<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"719\" height=\"410\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-11.png?resize=719%2C410&#038;ssl=1\" alt=\"\" class=\"wp-image-1084\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-11.png?w=719&amp;ssl=1 719w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-11.png?resize=300%2C171&amp;ssl=1 300w\" sizes=\"auto, (max-width: 719px) 100vw, 719px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>From the drop down choose <code>API Gateway<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"434\" height=\"185\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-12.png?resize=434%2C185&#038;ssl=1\" alt=\"\" class=\"wp-image-1085\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-12.png?w=434&amp;ssl=1 434w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-12.png?resize=300%2C128&amp;ssl=1 300w\" sizes=\"auto, (max-width: 434px) 100vw, 434px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Choose <code>Create an API<\/code>, <code>HTTP API<\/code> and <code>Open<\/code> security.  Then hit <code>Add<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"708\" height=\"590\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-13.png?resize=708%2C590&#038;ssl=1\" alt=\"\" class=\"wp-image-1086\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-13.png?w=708&amp;ssl=1 708w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-13.png?resize=300%2C250&amp;ssl=1 300w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>You should see a green box that says the trigger was added<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"709\" height=\"93\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-14.png?resize=709%2C93&#038;ssl=1\" alt=\"\" class=\"wp-image-1087\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-14.png?w=709&amp;ssl=1 709w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-14.png?resize=300%2C39&amp;ssl=1 300w\" sizes=\"auto, (max-width: 709px) 100vw, 709px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Testing the Lambda<\/h2>\n\n\n\n<p>You won&#8217;t be able to use the <code>Test<\/code> tab here.  The lambda is now expecting a <code>Message<\/code> object, which you probably don&#8217;t want to have to create (although there are templates for it).  Instead we&#8217;re going to test via Postman (or whatever HTTP tool you prefer).<\/p>\n\n\n\n<p>Go to the API Gateway trigger and navigate to the details page to find the URL that the API Gateway is exposing the lambda as.<\/p>\n\n\n\n<p>Click on API Gateway<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"481\" height=\"262\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-15.png?resize=481%2C262&#038;ssl=1\" alt=\"\" class=\"wp-image-1088\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-15.png?w=481&amp;ssl=1 481w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-15.png?resize=300%2C163&amp;ssl=1 300w\" sizes=\"auto, (max-width: 481px) 100vw, 481px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Open up the <code>Details<\/code> section and copy out the URL for the API endpoint<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"789\" height=\"318\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-16.png?resize=789%2C318&#038;ssl=1\" alt=\"\" class=\"wp-image-1089\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-16.png?w=789&amp;ssl=1 789w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-16.png?resize=300%2C121&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-16.png?resize=768%2C310&amp;ssl=1 768w\" sizes=\"auto, (max-width: 789px) 100vw, 789px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Paste it into postman and make a body for our request:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"name\":\"bullyrook\"\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"722\" height=\"407\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-17.png?resize=722%2C407&#038;ssl=1\" alt=\"\" class=\"wp-image-1090\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-17.png?w=722&amp;ssl=1 722w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-17.png?resize=300%2C169&amp;ssl=1 300w\" sizes=\"auto, (max-width: 722px) 100vw, 722px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>You should see a successful response.<\/p>\n\n\n\n<p>That&#8217;s it for now.  However, creating all of these objects in AWS manually is tedious and prone to risk.  In the next sections I&#8217;ll show you how to automate the deployment via Terraform.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Commit and Merge<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git status\n$ git add .\n$ git commit -m \"api triggered lambda\"\n$ git push --set-upstream origin apifunction\n$ git checkout main\n$ git merge apifunction\n$ git push<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<div class=\"entry-summary\">\nWe&#8217;ve got a &#8216;working&#8217; lambda now, but we can&#8217;t actually use it&hellip;\n<\/div>\n<div class=\"link-more\"><a href=\"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/spring-boot-lambda-api-implementation\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &ldquo;Spring Boot Lambda API Implementation&rdquo;<\/span>&hellip;<\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[142,146,77,148,44,147,144,143,50,42,43,145],"course":[141],"class_list":["post-1081","post","type-post","status-publish","format-standard","hentry","category-software-development","tag-aws","tag-aws-gateway","tag-cicd","tag-functions","tag-github","tag-github-actions","tag-java","tag-lambda","tag-maven","tag-spring","tag-spring-boot","tag-terraform","course-spring-boot-lambda-on-aws","entry"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":1094,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/terraform-setup-and-first-install\/","url_meta":{"origin":1081,"position":0},"title":"Terraform Setup and First Install","author":"Bullyrook","date":"July 24, 2021","format":false,"excerpt":"Terraform is a system that allows you to define your infrastructure in a series of configuration files. These configuration files are linked to a provider library which will execute the infrastructure create, update and teardown commands on the platform you want to deploy to. This is called \"Infrastructure as Code\"\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-19.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-19.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-19.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-19.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1133,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/25\/confirming-the-continuous-deployment-pipeline\/","url_meta":{"origin":1081,"position":1},"title":"Confirming the Continuous Deployment Pipeline","author":"Bullyrook","date":"July 25, 2021","format":false,"excerpt":"Lets verify that changes to our application will be automatically available when they're pushed up. Update the Application Let's start a new branch $ git checkout -b \"greeting-change\" Now update our service to return a different greeting: @Component public class HelloWorldService { public HelloWorld helloWorld(String name) { return HelloWorld.builder() .response(\"G'Day,\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-48.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-48.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-48.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-48.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1069,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/23\/spring-boot-lambda-implementation\/","url_meta":{"origin":1081,"position":2},"title":"Spring Boot Lambda Implementation","author":"Bullyrook","date":"July 23, 2021","format":false,"excerpt":"Now we're going to add some code. I'm going to follow my ports and adapters method of building a DTO and value object that I've used previously. Yes, its a bit of overkill for this project (especially a hello world example), but if you're using this course as a springboard\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-4.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-4.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-4.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1115,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/automated-terraform-deploy-using-github-actions\/","url_meta":{"origin":1081,"position":3},"title":"Automated Terraform Deploy Using Github Actions","author":"Bullyrook","date":"July 24, 2021","format":false,"excerpt":"Now we just need to build and deploy our application automatically so that whenever we push changes to the main branch, they'll automatically become available through our endpoint. Create Our Artifact Storage We're going to use a 'poor man's artifactory' to store our compiled .jar files. With our current build\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-34.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1102,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/terraform-centralized-state-management\/","url_meta":{"origin":1081,"position":4},"title":"Terraform Centralized State Management","author":"Bullyrook","date":"July 24, 2021","format":false,"excerpt":"As we saw in the last course Terraform will manage the state of your application, but by default it stores this locally. This is not ideal for us and will cause problems when we try to work with others or create a continuous deployment pipeline. Now we'll create a way\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1065,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/23\/spring-boot-lambda-prerequisites\/","url_meta":{"origin":1081,"position":5},"title":"Spring Boot Lambda Prerequisites","author":"Bullyrook","date":"July 23, 2021","format":false,"excerpt":"In this course we're going to build a very simple spring boot lambda, deploy it manually to AWS to make sure that it works and then automate the deployment using Terraform and github actions. This will allow us to automatically build and deploy changes from a commit to the main\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/comments?post=1081"}],"version-history":[{"count":4,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1081\/revisions"}],"predecessor-version":[{"id":1093,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1081\/revisions\/1093"}],"wp:attachment":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/media?parent=1081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/categories?post=1081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/tags?post=1081"},{"taxonomy":"course","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/course?post=1081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}