{"id":753,"date":"2016-05-12T06:00:57","date_gmt":"2016-05-12T09:00:57","guid":{"rendered":"https:\/\/www.erudio.com.br\/blog\/?p=753"},"modified":"2022-12-21T11:12:52","modified_gmt":"2022-12-21T14:12:52","slug":"documentando-aplicacoes-restfull-com-springboot-e-swagger","status":"publish","type":"post","link":"https:\/\/www.erudio.com.br\/blog\/documentando-aplicacoes-restfull-com-springboot-e-swagger\/","title":{"rendered":"Documentando aplica\u00e7\u00f5es REST com SpringBoot e Swagger"},"content":{"rendered":"<p>O <strong>Swagger<\/strong> \u00e9 um dos frameworks mais usados para se documentar <strong>API&#8217;s REST<\/strong>. Ele facilita para que os clientes que consomem nossas <strong>API&#8217;s<\/strong> saibam quais os par\u00e2metros nossas opera\u00e7\u00f5es recebem, qual o retorno, o modelo, o media type retornado <strong>JSON<\/strong>, <strong>XML<\/strong>, <strong>CSV<\/strong>, bin\u00e1rio etc. Sendo assim os clientes n\u00e3o precisam necessariamente discutir com a equipe de desenvolvimento da <strong>API<\/strong> sobre como us\u00e1-la. Pode-se dizer que a grosso modo o <strong>Swagger<\/strong> se comporta como o velho <strong>WSDL<\/strong> das aplica\u00e7\u00f5es <strong>SOAP<\/strong>. Sendo assim esse framework valoriza e muito nossas aplica\u00e7\u00f5es.<\/p>\n<p>Tomando como base o projeto do post anterior vamos adicionar as configura\u00e7\u00f5es necess\u00e1rias para habilitar o <strong>Swagger<\/strong> na aplica\u00e7\u00e3o. Para isso abra o arquivo <strong>pom.xml<\/strong> e adicione as tags destacadas com coment\u00e1rios no c\u00f3digo abaixo.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;project xmlns=&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot; xsi:schemalocation=&quot;http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;&gt;\n\t&lt;modelversion&gt;4.0.0&lt;\/modelversion&gt;\n\n\t&lt;groupid&gt;br.com.erudio&lt;\/groupid&gt;\n\t&lt;artifactid&gt;simple-rest-example-swagger&lt;\/artifactid&gt;\n\t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\n\n    &lt;parent&gt;\n        &lt;groupid&gt;org.springframework.boot&lt;\/groupid&gt;\n        &lt;artifactid&gt;spring-boot-starter-parent&lt;\/artifactid&gt;\n        &lt;version&gt;1.3.3.RELEASE&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;dependencies&gt;\n\n        &lt;dependency&gt;\n            &lt;groupid&gt;org.springframework.boot&lt;\/groupid&gt;\n            &lt;artifactid&gt;spring-boot-starter-web&lt;\/artifactid&gt;\n        &lt;\/dependency&gt;\n\n    \t&lt;!-- Adicionando a dependencia do Spring Boot Starter Actuator --&gt;\n    \t&lt;dependency&gt;\n\t\t\t&lt;groupid&gt;org.springframework.boot&lt;\/groupid&gt;\n\t\t\t&lt;artifactid&gt;spring-boot-starter-actuator&lt;\/artifactid&gt;\n\t\t&lt;\/dependency&gt;\n\n\t\t&lt;!-- Adicione as depend\u00eancias do Swagger API necess\u00e1rias para gerar a documenta\u00e7\u00e3o da aplica\u00e7\u00e3o--&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupid&gt;com.mangofactory&lt;\/groupid&gt;\n\t\t\t&lt;artifactid&gt;swagger-springmvc&lt;\/artifactid&gt;\n\t\t\t&lt;version&gt;1.0.0&lt;\/version&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupid&gt;org.ajar&lt;\/groupid&gt;\n\t\t\t&lt;artifactid&gt;swagger-spring-mvc-ui&lt;\/artifactid&gt;\n\t\t\t&lt;version&gt;0.4&lt;\/version&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n    \t\t&lt;groupid&gt;org.apache.tomcat.embed&lt;\/groupid&gt;\n    \t\t&lt;artifactid&gt;tomcat-embed-jasper&lt;\/artifactid&gt;\n    \t\t&lt;scope&gt;provided&lt;\/scope&gt;\n\t\t&lt;\/dependency&gt;\n\n    &lt;\/dependencies&gt;\n\n    &lt;properties&gt;\n        &lt;java.version&gt;1.8&lt;\/java.version&gt;\n    &lt;\/properties&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupid&gt;org.springframework.boot&lt;\/groupid&gt;\n                &lt;artifactid&gt;spring-boot-maven-plugin&lt;\/artifactid&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spring-releases&lt;\/id&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/libs-release&lt;\/url&gt;\n        &lt;\/repository&gt;\n\n   \t\t&lt;!-- Adicione o reposit\u00f3rio do Swagger ao projeto--&gt;\n\t\t&lt;repository&gt;\n\t\t\t&lt;id&gt;jcenter-release&lt;\/id&gt;\n\t\t\t&lt;name&gt;jcenter&lt;\/name&gt;\n\t\t\t&lt;url&gt;http:\/\/oss.jfrog.org\/artifactory\/oss-release-local\/&lt;\/url&gt;\n\t\t&lt;\/repository&gt;\n    &lt;\/repositories&gt;\n\n    &lt;pluginrepositories&gt;\n        &lt;pluginrepository&gt;\n            &lt;id&gt;spring-releases&lt;\/id&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/libs-release&lt;\/url&gt;\n        &lt;\/pluginrepository&gt;\n    &lt;\/pluginrepositories&gt;\n\n&lt;\/project&gt;\n<\/pre>\n<p>Feito isto precisamos alterar a classe <strong>Application<\/strong> para que ela acione o <strong>Swagger<\/strong> quando inicializar a aplica\u00e7\u00e3o.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage br.com.erudio;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.EnableAutoConfiguration;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.ComponentScan;\nimport org.springframework.context.annotation.Configuration;\n\nimport com.mangofactory.swagger.configuration.SpringSwaggerConfig;\nimport com.mangofactory.swagger.models.dto.ApiInfo;\nimport com.mangofactory.swagger.plugin.EnableSwagger;\nimport com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin;\n\n@Configuration \/\/ Define a classe como classe de configura\u00e7\u00e3o\n@EnableAutoConfiguration \/\/ Habilita a autoconfigura\u00e7\u00e3o\n@EnableSwagger \/\/Habilita o Swagger\n@ComponentScan(basePackages = {&quot;br.com.erudio&quot;}) \/\/Escaneia todos os pacotes com o padr\u00e3o br.com.erudio\npublic class Application {\n\n\t\/\/Injeta uma instancia de SpringSwaggerConfig\n    @Autowired\n    private SpringSwaggerConfig swaggerConfig;\n\n    public static void main(String[] args) {\n\t\t   \/\/Troque esta linha SpringApplication.run(Application.class, args); pela linha abaixo\n           new SpringApplicationBuilder(Application.class).web(true).run(args);\n    }\n\n    @Bean\n    public SwaggerSpringMvcPlugin groupOnePlugin() {\n       return new SwaggerSpringMvcPlugin(swaggerConfig)\n\t\t\t\/\/Adiciona as configura\u00e7\u00f5es do Swagger ao SwaggerSpringMvcPlugin\n           .apiInfo(apiInfo()) \/\/Adiciona as propriedades de configura\u00e7\u00e3o\n           .includePatterns(&quot;\/person.*?&quot;, &quot;\/greeting.*?&quot;) \/\/Habilita o Swagger para os nossos 2 endpoints\n           .swaggerGroup(&quot;admin&quot;);\n    }\n\n    private ApiInfo apiInfo() {\n       ApiInfo apiInfo = new ApiInfo( \/\/Configura\u00e7\u00f5es de contato, licen\u00e7a etc n\u00e3o nescess\u00e1riamente precisa ser definida\n             &quot;Swagger With Spring Boot&quot;,\n             &quot;This is a simple application to demonstrate how to work with Swagger in Spring Boot project!&quot;,\n             &quot;Free to use and mess around&quot;,\n             &quot;erudio@gmail.com&quot;,\n             &quot;Open Licence&quot;,\n             &quot;myemail@gmail.com&quot;\n       );\n       return apiInfo;\n    }\n}\n<\/pre>\n<p>Agora que o <strong>Swagger<\/strong> j\u00e1 est\u00e1 configurado vamos documentar o endpoint <strong>Greeting<\/strong>.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage br.com.erudio.web.controllers;\n\nimport java.util.concurrent.atomic.AtomicLong;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.wordnik.swagger.annotations.Api;\nimport com.wordnik.swagger.annotations.ApiOperation;\n\nimport br.com.erudio.models.Greeting;\n\n@Api(value = &quot;greeting&quot;) \/\/Diz ao Swagger que esse \u00e9 um endpoint e REST deve ser documentado\n@RestController\n@RequestMapping(&quot;\/greeting&quot;)\npublic class GreetingController {\n\n    private static final String template = &quot;Hello, %s!&quot;;\n    private final AtomicLong counter = new AtomicLong();\n\n\t@ApiOperation(value = &quot;Show Greeting Message&quot; )\n\t \/\/Diz ao Swagger que essa opera\u00e7\u00e3o REST deve ser documentado\n\t@ResponseStatus(HttpStatus.OK)\n    @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)\n    public Greeting greeting(@RequestParam(value=&quot;name&quot;, defaultValue=&quot;World&quot;) String name) {\n        return new Greeting(counter.incrementAndGet(), String.format(template, name));\n    }\n}\n<\/pre>\n<p>Como se pode ver \u00e9 extremamente simples documentar a nossa <strong>API<\/strong> agora vamos vazer o mesmo com o endpoint <strong>Person<\/strong>.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage br.com.erudio.web.controllers;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.wordnik.swagger.annotations.Api;\nimport com.wordnik.swagger.annotations.ApiOperation;\n\nimport br.com.erudio.models.Person;\nimport br.com.erudio.services.PersonService;\n\n@Api(value = &quot;person&quot;) \/\/Diz ao Swagger que esse \u00e9 um endpoint e REST deve ser documentado\n@RestController\n@RequestMapping(&quot;\/person\/&quot;)\npublic class PersonController {\n\n\t@Autowired\n\tprivate PersonService personService;\n\n\t@ApiOperation(value = &quot;Find person by ID&quot; )\n\t\/\/Diz ao Swagger que essa opera\u00e7\u00e3o REST deve ser documentado\n    @ResponseStatus(HttpStatus.OK)\n    @RequestMapping(value = &quot;\/{personId}&quot;, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)\n    public Person get(@PathVariable(value = &quot;personId&quot;) String personId){\n        return personService.findById(personId);\n    }\n\n\t@ApiOperation(value = &quot;Find all persons&quot; )\n\t\/\/Diz ao Swagger que essa opera\u00e7\u00e3o REST deve ser documentado\n\t@ResponseStatus(HttpStatus.OK)\n\t@RequestMapping(value = &quot;\/findAll&quot;, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)\n\tpublic List&lt;person&gt; findAll(){\n\t\treturn personService.findAll();\n\t}\n\n\t@ApiOperation(value = &quot;Create a new person&quot; )\n\t\/\/Diz ao Swagger que essa opera\u00e7\u00e3o REST deve ser documentado\n\t@ResponseStatus(HttpStatus.OK)\n\t@RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)\n\tpublic Person create(@RequestBody Person person){\n\t\treturn personService.create(person);\n\t}\n\n\t@ApiOperation(value = &quot;Update an existing person&quot;)\n\t\/\/Diz ao Swagger que essa opera\u00e7\u00e3o REST deve ser documentado\n\t@ResponseStatus(HttpStatus.OK)\n\t@RequestMapping(method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_VALUE)\n\tpublic Person update(@RequestBody Person person){\n\t\treturn personService.update(person);\n\t}\n\n\t@ApiOperation(value = &quot;Delete person by ID&quot; )\n\t\/\/Diz ao Swagger que essa opera\u00e7\u00e3o REST deve ser documentado\n\t@ResponseStatus(HttpStatus.OK)\n    @RequestMapping(value = &quot;\/{personId}&quot;, method = RequestMethod.DELETE)\n    public void delete(@PathVariable(value = &quot;personId&quot;) String personId){\n        personService.delete(personId);\n    }\n}\n<\/pre>\n<p>N\u00e3o parece mas j\u00e1 terminamos toda a codifica\u00e7\u00e3o necess\u00e1ria por adicionar o <strong>Swagger<\/strong> \u00e0 nossa <strong>API<\/strong> mais uma vez acesse a classe <strong>Application<\/strong> e inicie a aplica\u00e7\u00e3o como no post anterior. Ap\u00f3s inicializada a aplica\u00e7\u00e3o acesse a URL:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n\tlocalhost:8080\/sdoc.jsp\n<\/pre>\n<p>Essa \u00e9 a URL padr\u00e3o da documenta\u00e7\u00e3o e nunca tentei alter\u00e1-la. Ao acess\u00e1-la voc\u00ea ver\u00e1 algo similar a imagem abaixo documentando cada uma das opera\u00e7\u00f5es dos nossos endpoints. Bastando clicar sobre cada uma para expandir e ver todos os detalhes da mesma.<\/p>\n<p><a href=\"https:\/\/www.erudio.com.br\/blog\/documentando-aplicacoes-restfull-com-springboot-e-swagger\/postagem_3_1\/\" rel=\"attachment wp-att-754\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-754\" src=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2016\/04\/postagem_3_1-1024x536.png\" alt=\"postagem_3_1\" width=\"815\" height=\"400\"><\/a><\/p>\n<p>Na imagem abaixo podemos ver a documenta\u00e7\u00e3o da opera\u00e7\u00e3o <strong>findAll<\/strong>. Temos a defini\u00e7\u00e3o do modelo que ela nos retorna, o tipo de dados que ela retorna no caso <strong>JSON<\/strong>, os <strong>StatusCode<\/strong> que ela pode retornar, se clicarmos em <strong>Try Out<\/strong> o <strong>Swagger<\/strong> nos permite testar nossas opera\u00e7\u00f5es. Ao executarmos esse teste a nossa <strong>API<\/strong> nos retornou um array de pessoas, o cabe\u00e7alho e o <strong>StatusCode 200 OK<\/strong>.<\/p>\n<p><a href=\"https:\/\/www.erudio.com.br\/blog\/documentando-aplicacoes-restfull-com-springboot-e-swagger\/postagem_3_5\/\" rel=\"attachment wp-att-758\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-758\" src=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2016\/04\/postagem_3_5-755x1024.png\" alt=\"postagem_3_5\" width=\"815\" height=\"1150\"><\/a><\/p>\n<p>Chegamos com este post ao final da s\u00e9rie de posts, pr\u00e1ticos, sobre servi\u00e7os <strong>REST<\/strong>. Voc\u00ea pode <a href=\"https:\/\/github.com\/leandrocgsi\/simple-rest-example-swagger\/archive\/master.zip\">baixar o c\u00f3digo deste post aqui<\/a> e descompactar o arquivo zip e importar na sua IDE preferida ou clonar usando Git:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ngit clone https:\/\/github.com\/leandrocgsi\/simple-rest-example-swagger.git\n<\/pre>\n<p>Agora voc\u00ea j\u00e1 consegue dar os primeiros passos na cria\u00e7\u00e3o de servi\u00e7os <strong>REST<\/strong>, conhece conceitos, te\u00f3ricos e pr\u00e1ticos, b\u00e1sicos para executar esse tipo de tarefa. Sendo assim continue ligado no blog, por que no pr\u00f3ximos posts iremos detonar o Rock&#8217;n Roll com outras tecnologias. \u00c9 isso a\u00ed bons estudos.<\/p>\n<h2>Treinamentos relacionados com este post<\/h2>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_java\" target=\"_blank\" rel=\"noopener\"><\/p>\n<p><img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0  AWS com Spring Boot 3, Java e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/07-rest-spring-java.png\"><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_microservices_java\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microservices do 0 com Spring Cloud, Spring Boot e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/14-microservices-java.png\"><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_kotlin\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0 AWS com Spring Boot 3, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/18-rest-spring-kotlin.png\"><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_ms_kotlin\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microsservi\u00e7os do 0 com Spring Cloud, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/22-ms-kotlin.png\"><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker do 0 \u00e0 Maestria: Cont\u00eaineres Desmistificados mais 3 B\u00d4NUS\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/09-docker.png\"><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker_para_aws\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker para Amazon AWS Implante Apps Java e .NET com Travis CI\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/10-docker-to-aws.png\"><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_kotlin\" target=\"_blank\" rel=\"noopener\"><br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Kotlin para DEVs Java: Aprenda a Linguagem Padr\u00e3o do Android\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/20-kotlin.png\"><br \/>\n<\/a><\/p>\n<\/person>\n","protected":false},"excerpt":{"rendered":"<p>O Swagger \u00e9 um dos frameworks mais usados para se documentar API&#8217;s REST. Ele facilita para que os clientes que consomem nossas API&#8217;s saibam quais os par\u00e2metros nossas opera\u00e7\u00f5es recebem, qual o retorno, o modelo, o media type retornado JSON, XML, CSV, bin\u00e1rio etc. Sendo assim os clientes n\u00e3o precisam necessariamente discutir com a equipe [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[57,96,103,104,105,115],"tags":[132,184,221,230,231,240],"_links":{"self":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/753"}],"collection":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/comments?post=753"}],"version-history":[{"count":3,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/753\/revisions"}],"predecessor-version":[{"id":1512,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/753\/revisions\/1512"}],"wp:attachment":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/media?parent=753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/categories?post=753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/tags?post=753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}