{"id":2759,"date":"2020-02-07T18:06:52","date_gmt":"2020-02-07T18:06:52","guid":{"rendered":"https:\/\/codoid.com\/all-about-karate-framework\/"},"modified":"2022-02-04T18:19:48","modified_gmt":"2022-02-04T18:19:48","slug":"all-about-karate-framework","status":"publish","type":"post","link":"https:\/\/codoid.com\/automation-testing\/all-about-karate-framework\/","title":{"rendered":"All about Karate Framework"},"content":{"rendered":"<p> People think of automation to gradually reduce time-consuming repetitive and manual work. It is a known fact that <a href=\"https:\/\/codoid.com\/automation-testing-services\/\">automation testing reduces time<\/a>, improves productivity, generates reports automatically, etc. Fundamentally one should have some level of expertise in coding to write automation test scripts and subsequently run it without any hassles, you need to have so many things handy while setting up a framework, say for instance you should have technical know-how of integrating necessary plugins, creating a proper folder structure for your code, selecting tools and IDE\u2019s, etc. A newbie software tester with less coding knowledge will be overwhelmed with these setups and potentially neglect automation testing.<\/p>\n<p> We\u2019ve seen a lot of testers, QA engineers using Postman\/Insomnia\/Paw to test their REST API endpoints manually because they do not know how to automate them.  <a href=\"https:\/\/codoid.com\/api-automation-testing-using-apiritif-framework\/\">Automating API testing<\/a> is a more complex procedure, setting the initial process and running it successfully  is often one of the most challenging parts of the process, one must be ready to face a series of challenges like parameter validation, a sequence of API calls, testing the parameter combination, etc.<\/p>\n<p>Our engineers gave it a go with many API frameworks like RestAssured, SOAP UI, <a href=\"https:\/\/www.katalon.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Katalon Studio<\/a> and Karate. We have always been excited while working with Karate framework because Karate framework is promisingly a mature framework since API tests are written using plain text Gherkin style as it is built on top of Cucumber and is written in Java.<\/p>\n<h3> Why we recommend it<\/h3>\n<p> <i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i>  Java knowledge is not required and even non-programmers can write tests with ease ( it runs on JVM)<\/p>\n<p> <i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i>  It supports JSON and XML including JsonPath and XPath expressions,<\/p>\n<p> <i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i>  Re-use of payload-data and user-defined functions across tests is possible.<\/p>\n<p> <i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i>  Simple latency assertions can be used to validate non-functional requirements like performance requirements. (for ex. it is used to measure the performance of the API when it is executed multiple times by measuring the response time)<\/p>\n<p><strong>How to Setup Karate framework<\/strong><\/p>\n<p>Let us see the step by step guide on setting up Karate framework<\/p>\n<p> <i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> Start up your favorite IDE. (we are taking InteliJ IDEA in this example.)<\/p>\n<p><i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> Go to File> New> Maven Project and take the defaults on the first screen.<\/p>\n<p><i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> Under New Maven Project, click on Add Archetype<\/p>\n<p><i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> Enter the following info:<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nArchetype Group Id= com.intuit.karate\r\nArchetype ArtifactId= karate-archetype\r\nArchetype Version=0.9.4\r\n<\/pre>\n<\/div>\n<p><i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> Click Ok<\/p>\n<p><i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> It should find Karate-archetype. Click on Next.<\/p>\n<p><i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> Enter the \u2018Groupid\u2019 and \u2018Artifactid\u2019 for the project and click on Next.<\/p>\n<p><i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> Select the maven version and click on Next<\/p>\n<p><i class=\"fa fa-check-square-o\" aria-hidden=\"true\"><\/i> Finish the Setup<\/p>\n<p> Now the default karate project will be created with the \u2018Feature and config files\u2019.<\/p>\n<h3>Karate-config.js<\/h3>\n<p>One has to check whether karate-config.js exist on the &#8216;classpath&#8217;. A &#8216;classpath&#8217; is a place where the important configuration files are expected to be in place by default, karate-config.js contains JavaScript function which will return a JSON object. The values and keys in this JSON object are available as script variables. The below sample JavaScript will tell you how one can get the value of the current &#8216;environment&#8217; or &#8216;profile&#8217;, and then set up &#8216;global&#8217; variables and helps you to understand the Karate configuration.<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nfunction fn() {   \r\n  var env = karate.env; \/\/ get java system property 'karate.env'\r\n  karate.log('karate.env system property was:', env);\r\n  if (!env) {\r\n    env = 'dev'; \/\/ a custom 'intelligent' default\r\n  }\r\n  var config = { \/\/ base config JSON\r\n    appId: 'my.app.id',\r\n    appSecret: 'my.secret',\r\n    someUrlBase: 'https:\/\/some-host.com\/v1\/auth\/',\r\n    anotherUrlBase: 'https:\/\/another-host.com\/v1\/'\r\n  };\r\n  if (env == 'stage') {\r\n    \/\/ over-ride only those that need to be\r\n    config.someUrlBase = 'https:\/\/stage-host\/v1\/auth';\r\n  } else if (env == 'e2e') {\r\n    config.someUrlBase = 'https:\/\/e2e-host\/v1\/auth';\r\n  }\r\n  \/\/ don't waste time waiting for a connection or if servers don't respond within 5 seconds\r\n  karate.configure('connectTimeout', 5000);\r\n  karate.configure('readTimeout', 5000);\r\n  return config;\r\n}  \r\n<\/pre>\n<\/div>\n<p> A Global variable can be initialized in the config file which can be used in the test feature file. Also based on the environment we can set the global URL from the config file.<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\npackage animals.cats;\r\nimport com.intuit.karate.junit4.Karate;\r\nimport org.junit.BeforeClass;\r\nimport org.junit.runner.RunWith;\r\n\r\n@RunWith(Karate.class)\r\npublic class CatsRunner {    \r\n    @BeforeClass\r\n    public static void before() {\r\n        System.setProperty(&quot;karate.env&quot;, &quot;e2e&quot;);\r\n    }\r\n}\r\n  <\/pre>\n<\/div>\n<p> <bold>Note:<\/bold> By default, the value of karate.env when you access it within karate-config.js &#8211; would be null.<\/p>\n<h3>Testing the status code<\/h3>\n<p>Let&#8217;s write a scenario that tests a GET endpoint and checks if it returns a 200 (OK) HTTP status code:<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\"> \r\nBackground:\r\n    * url 'http:\/\/localhost:3000\/api'\r\nScenario: get all users and then get the first user by id\r\n    Given path 'dishes'\r\n    When method get\r\n    Then status 200   \r\n\r\n<\/pre>\n<\/div>\n<p>Here we have the common URL in the Background, in the given path \u2018dishes\u2019 will be the route to the URL.<br \/>\nThis works obviously with all possible HTTP status codes.<\/p>\n<h3>Testing the Response<\/h3>\n<p>Let&#8217;s write another scenario that tests that the REST endpoint returns a specific response:<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nScenario: Testing the exact response of a GET endpoint\r\nGiven url 'http:\/\/localhost:8097\/user\/get'\r\nWhen method GET\r\nThen status 200\r\nAnd match $ == {id:&quot;1234&quot;,name:&quot;John Smith&quot;}  \r\n<\/pre>\n<\/div>\n<p>The match operation is used for the validation where \u2018$&#8217; represents the response. So the above scenario will check that the response exactly matches \u2018{id:\u201d1234?,name:\u201dJohn Smith\u201d}&#8217;. <\/p>\n<p>We can also check specifically for the value of the id field:<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">And match $.id == &quot;1234&quot;  <\/pre>\n<\/div>\n<p><bold>The match operation can also be used to check if the response contains certain fields.<\/bold> This is helpful when only certain fields  need to be checked with values or when not all response fields are known:<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nScenario: Testing that GET response contains specific field\r\nGiven url 'http:\/\/localhost:8097\/user\/get'\r\nWhen method GET\r\nThen status 200\r\nAnd match $ contains {id:&quot;1234&quot;}  \r\n<\/pre>\n<\/div>\n<p> <strong> Validating Response Values with Markers:<\/strong><\/p>\n<p>At times, when we don&#8217;t know the exact value that is returned, we can still validate the value using markers \u2014 placeholders for matching fields in the response.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"703\" height=\"649\" src=\"https:\/\/codoid.com\/wp-content\/uploads\/2020\/02\/Karate-Framework.jpg\" class=\"image wp-image-16829  attachment-full size-full\" alt=\"All about Karate Framework\" style=\"max-width: 100%; height: auto;\" title=\"All about Karate Framework\" \/><\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nEx.\r\nScenario: Test GET request exact response\r\nGiven url 'http:\/\/localhost:8097\/user\/get'\r\nWhen method GET\r\nThen status 200\r\nAnd match $ == {id:&quot;#notnull&quot;,name:&quot;John Smith&quot;}\r\nAnd match $ contains {id:\u201d#notpresent\u201d}  \r\n<\/pre>\n<\/div>\n<p> <strong> Testing a POST Endpoint with a Request Body<\/strong><\/p>\n<p>Let&#8217;s look at a final scenario that tests a POST endpoint and takes a request body:<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nScenario: Testing a POST endpoint with request body\r\nGiven url 'http:\/\/localhost:8097\/user\/create'\r\nAnd request { id: '1234' , name: 'John Smith'}\r\nWhen method POST\r\nThen status 200\r\nAnd match $ contains {id:&quot;#notnull&quot;}  \r\n<\/pre>\n<\/div>\n<h3>Schema Validation:<\/h3>\n<p>Karate provides a simpler, user-friendly and more powerful response validation using Json as a variable to validate the structure of a given payload.<\/p>\n<div class=\"editor editor-dark\">\n<div class=\"editor-top\">\n<ul class=\"editor-controls\">\n<li><\/li>\n<li><\/li>\n<li><\/li>\n<\/ul>\n<\/div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n* def foo = ['bar', 'baz']\r\n# should be an array\r\n* match foo == '#[]'\r\n\r\n# should be an array of size 2\r\n* match foo == '#[2]'\r\n\r\n# should be an array of strings with size 2\r\n* match foo == '#[2] #string'\r\n\r\n# each array element should have a 'length' property with value 3\r\n* match foo == '#[]? _.length == 3'\r\n\r\n\r\n# should be an array of strings each of length 3\r\n* match foo == '#[] #string? _.length == 3'\r\n\r\n# should be null or an array of strings\r\n* match foo == '##[] #string'  \r\n<\/pre>\n<\/div>\n<p>We have been using the Karate framework for quite some time now and this framework comes with a very rich set of useful features that enables you to perform Automated API Testing very easily and quickly. It eases the testing process by allowing script developers or testers without any programming knowledge to script the sequences of HTTP calls. We believe that through this tutorial you have gained a lot of useful insights and got a basic understanding of Karate\u2018s features. Please feel free to reach out for<a href=\"https:\/\/codoid.com\/contacts\/\"> your API testing needs<\/a>, we are glad to help. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>People think of automation to gradually reduce time-consuming repetitive and manual work. It is a known fact that automation testing reduces time, improves productivity, generates reports automatically, etc. Fundamentally one should have some level of expertise in coding to write automation test scripts and subsequently run it without any hassles, you need to have so [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5945,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[182,179,20],"tags":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.3 (Yoast SEO v20.3) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>All about Karate Framework - Codoid<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"All about Karate Framework\" \/>\n<meta property=\"og:description\" content=\"People think of automation to gradually reduce time-consuming repetitive and manual work. It is a known fact that automation testing reduces time, improves productivity, generates reports automatically, etc. Fundamentally one should have some level of expertise in coding to write automation test scripts and subsequently run it without any hassles, you need to have so [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/\" \/>\n<meta property=\"og:site_name\" content=\"Codoid\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/codoid.softwaretestingcompany\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-07T18:06:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-04T18:19:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/codoid.com\/wp-content\/uploads\/2020\/02\/All_about_Karate_-Framework_Blog.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@codoid\" \/>\n<meta name=\"twitter:site\" content=\"@codoid\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"All about Karate Framework - Codoid","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"All about Karate Framework","og_description":"People think of automation to gradually reduce time-consuming repetitive and manual work. It is a known fact that automation testing reduces time, improves productivity, generates reports automatically, etc. Fundamentally one should have some level of expertise in coding to write automation test scripts and subsequently run it without any hassles, you need to have so [&hellip;]","og_url":"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/","og_site_name":"Codoid","article_publisher":"https:\/\/www.facebook.com\/codoid.softwaretestingcompany","article_published_time":"2020-02-07T18:06:52+00:00","article_modified_time":"2022-02-04T18:19:48+00:00","og_image":[{"width":1200,"height":800,"url":"https:\/\/codoid.com\/wp-content\/uploads\/2020\/02\/All_about_Karate_-Framework_Blog.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_creator":"@codoid","twitter_site":"@codoid","twitter_misc":{"Written by":"admin","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/#article","isPartOf":{"@id":"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/"},"author":{"name":"admin","@id":"https:\/\/codoid.com\/#\/schema\/person\/360ee1d38151acb7c746787fbfa8e586"},"headline":"All about Karate Framework","datePublished":"2020-02-07T18:06:52+00:00","dateModified":"2022-02-04T18:19:48+00:00","mainEntityOfPage":{"@id":"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/"},"wordCount":1301,"commentCount":1,"publisher":{"@id":"https:\/\/codoid.com\/#organization"},"articleSection":["Automation Testing","Fixed","Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/","url":"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/","name":"All about Karate Framework - Codoid","isPartOf":{"@id":"https:\/\/codoid.com\/#website"},"datePublished":"2020-02-07T18:06:52+00:00","dateModified":"2022-02-04T18:19:48+00:00","breadcrumb":{"@id":"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/codoid.com\/learn\/automation-testing\/all-about-karate-framework\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/codoid.com\/"},{"@type":"ListItem","position":2,"name":"All about Karate Framework"}]},{"@type":"WebSite","@id":"https:\/\/codoid.com\/#website","url":"https:\/\/codoid.com\/","name":"Codoid","description":"","publisher":{"@id":"https:\/\/codoid.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/codoid.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/codoid.com\/#organization","name":"Codoid - Software Testing Company","url":"https:\/\/codoid.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/codoid.com\/#\/schema\/logo\/image\/","url":"https:\/\/codoid.com\/wp-content\/uploads\/2020\/09\/Codoid_Software_Testing_Company_Logo.png","contentUrl":"https:\/\/codoid.com\/wp-content\/uploads\/2020\/09\/Codoid_Software_Testing_Company_Logo.png","width":500,"height":500,"caption":"Codoid - Software Testing Company"},"image":{"@id":"https:\/\/codoid.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/codoid.softwaretestingcompany","https:\/\/twitter.com\/codoid","https:\/\/www.instagram.com\/codoid.softwaretestingcompany\/","https:\/\/www.linkedin.com\/company\/codoid-qacompany","https:\/\/www.pinterest.com\/codoid9282\/codoid-software-testing-company\/","https:\/\/www.youtube.com\/channel\/UCCmOTDQgcf4W8oo22mBMUYA"]},{"@type":"Person","@id":"https:\/\/codoid.com\/#\/schema\/person\/360ee1d38151acb7c746787fbfa8e586","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/codoid.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4d33f9036c9d60684b9478f738779823?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4d33f9036c9d60684b9478f738779823?s=96&d=mm&r=g","caption":"admin"},"sameAs":["https:\/\/codoid.com"]}]}},"_links":{"self":[{"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/posts\/2759"}],"collection":[{"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/comments?post=2759"}],"version-history":[{"count":14,"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/posts\/2759\/revisions"}],"predecessor-version":[{"id":11724,"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/posts\/2759\/revisions\/11724"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/media\/5945"}],"wp:attachment":[{"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/media?parent=2759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/categories?post=2759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codoid.com\/wp-json\/wp\/v2\/tags?post=2759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}